MidHook代码



//=================================================================================================================
//函数名:MidReplaceFunRealAddr
//功能:  用于在函数中进行Inline HOOK系统函数,
//         A            被HOOK的函数块
//         B            我们的新函数
//         C            存被HOOK代码块及JMP到原函数的位置的BUF
//
//        过程:
//        1)  A  JMP     到B(新的函数)(nake的)
//        2)  B  JMP     到C(实现调用被HOOK函数部分)
//        3)  C调用被HOOK代码
//        4)  C  JMP     到(A+5)        完成整个函数流程  (用的是相对JMP)
//参数:
//        IN ulFunAddress  要InlineHOOK的函数首地址
//        IN code        相当于C,用于存放A的被HOOK的代码部分及JMP回B的代码为C
//        IN BeginLength  被HOOK的开始字节(相对于系统函数起始位置)
//        IN Length       被HOOK的字节长度
//        IN MyFun        自定义函数为B
//        IN Sign            一般为FALSE,为了应用代码检测.
//返回值:
//        TRUE    成功
//        FALSE   失败
//=================================================================================================================
//szAbsJmpCode[0] = 0xE9;
//szAbsJmpCode[1] = 0;
//szAbsJmpCode[2] = 0;
//szAbsJmpCode[3] = 0;
//szAbsJmpCode[4] = 0;
//szAbsJmpCode[5] = 0x08;
//szAbsJmpCode[6] = 0;
//=================================================================================================================
BOOLEAN MidReplaceFunRealAddr(ULONG  ulFunAddress, PUCHAR szCode, ULONG ulBeginLength, ULONG ulLength, ULONG ulMyFun, BOOLEAN bSign)
{
    BOOLEAN bRet = FALSE;
    UCHAR szMycode[15] = {0xe9, 0x00, 0x00, 0x00, 0x00,0x00,0x00};
    UCHAR ucTemp = 0;
    PULONG pulCode = NULL;
    DWORD oldprotect;
    DWORD dwReltiveDis = 0;

    do
    {

        ulFunAddress = ulFunAddress + ulBeginLength;
        ucTemp = *((PUCHAR)(ulFunAddress));
        if (0xE9 == ucTemp)
        {
            bRet = TRUE;
            break;
        }



        RtlFillMemory(szCode,ulLength,0x90);
        if (0 == ulFunAddress)
        {
            //sprintf_s(200,szBuf,"函数:%ws没有找到",szFunName);
            OutputDebugString(("函数没有找到"));
            break;
        }



        //构建一个代码区
        //|被HOOK的原代码|JMP到(A+5)|
        VirtualProtect((PVOID)ulFunAddress, ulLength, PAGE_EXECUTE_READWRITE, &oldprotect);
        RtlCopyMemory(szCode,(PVOID)ulFunAddress,ulLength); //Copy原代码


        //4.构造JMP指令,JMP回系统函数
        szCode[ulLength] = 0xE9;                            //绝对JMP
        pulCode = (PDWORD)((DWORD)szCode + ulLength + 1);
        *pulCode = (DWORD)ulFunAddress + ulLength - ((DWORD)pulCode - 1) - 5;




        //修改原函数中的代码
        //实现JMP到我们实现的HOOK函数之中
        pulCode = (PULONG)((ULONG)szMycode + 1);
        *pulCode = (ULONG)ulMyFun - ulFunAddress - 5; //JMP
        RtlCopyMemory((PVOID)ulFunAddress,szMycode,ulLength);

        VirtualProtect((PVOID)ulFunAddress, ulLength, oldprotect, &oldprotect);
    } while (0);



    return bRet;


}

//=================================================================================================================
//函数名:MidRecoverFunRealAddr
//功能:  用于还原被Mid Inline HOOK的系统函数,
//
//参数:
//        IN ulFunAddress 函数首地址
//        IN code        相当于C,用于存放A的被HOOK的代码部分及JMP回B的代码为C
//        IN BeginLength  被HOOK的开始字节(相对于系统函数起始位置)
//        IN Length       被HOOK的字节长度
//        IN Sign            一般为FALSE,为了应用代码检测.
//返回值:
//        TRUE    成功
//        FALSE   失败
//=================================================================================================================
BOOLEAN RecoverFunRealAddr(ULONG ulFunAddress, PUCHAR szCode, ULONG ulBeginLength, ULONG ulLength, BOOLEAN bSign)
{
    BOOLEAN bRet = FALSE;
    DWORD oldprotect ;
    ULONG uli = 0;
    UCHAR ucTemp = 0;
    ULONG ulRecoverLength = 0;

    do
    {



        ulFunAddress = ulFunAddress + ulBeginLength;
        VirtualProtect((PVOID)ulFunAddress, ulLength, PAGE_EXECUTE_READWRITE, &oldprotect);
        ucTemp = *((PUCHAR)(ulFunAddress));
        if (0xE9 != ucTemp)
        {
            bRet = TRUE;
            break;
        }

        //for (uli = 0; uli < ulLength; uli++)
        //{
        //    if (0xE9 == szCode[uli])
        //    {
        //        break;
        //    }
        //}
        //if (ulLength == uli)
        //{
        //    break;
        //}
        //ulRecoverLength = uli;

        ulRecoverLength = ulLength;

        RtlCopyMemory((PVOID)ulFunAddress,szCode,ulRecoverLength);

        bRet = TRUE;
    }while(0);

    VirtualProtect((PVOID)ulFunAddress, ulLength, oldprotect, &oldprotect);

    return bRet;
}
 

你可能感兴趣的:(职场,休闲,MidHook代码)