功能挂钩

时间:2013-12-16 20:47:03

标签: c++ function hook

我有一个使用多个dll的游戏,有些是核心的,有些是自定义的,其中一个是我的。

我想要做的是从核心dll内部挂钩内部函数。 我可以很容易地得到函数的地址:

HMODULE h_fct = GetModuleHandle("variables.dll");
char* ptr = (char*)h_fct + 0x10000;
MakeJMP((BYTE*)ptr, (DWORD)MyVariableCall, 5);

然后我可以使用互联网上的一段代码轻松附加到它,但我不确定这是对的:

void MakeJMP(BYTE *pAddress, DWORD dwJumpTo, DWORD dwLen)
{
    DWORD dwOldProtect, dwBkup, dwRelAddr;
    VirtualProtect(pAddress, dwLen, PAGE_EXECUTE_READWRITE, &dwOldProtect);  
    dwRelAddr = (DWORD) (dwJumpTo - (DWORD) pAddress) - 5;

    *pAddress = 0xE9;    
    *((DWORD *)(pAddress + 0x1)) = dwRelAddr;

    VirtualProtect(pAddress, dwLen, dwOldProtect, &dwBkup);    
    return;
}

现在这里有踢球者,我的功能

typedef int __cdecl func(int a1, int a2, signed int a3, double* a4, int a5);
char* ptr2;

int FSAPI MyVariableCall(int a1, int a2, int a3, double* a4, int a5)
{
    int a = 2;
    func* f = (func*)ptr2;
    a = f(a1,a2,a3,a4,a5);
    //I want code to reach here so I can call other function to modify the a4 pointer
    MyModifyingcode(a4);
    return a;
}

ptr2是ptr + 0x5,这意味着它超过了5个字节。原始dll的前5个字节是

mov     edi, edi
push    ebp
mov     ebp, esp

//Here is the prototype function from a disassembler:
signed int __userpurge sub_10AC0000<eax>(double result<st0>, double st6_0<st1>, double st5_0<st2>, double st4_0<st3>, double st3_0<st4>, double st2_0<st5>, int a2, signed int a3, int a4, double *a5, int a6)

我的主要愿望是运行f(),意思是原始函数,然后编写我的代码。 所以我要做的是在调用函数后挂钩函数。

有人可以帮帮我吗?

0 个答案:

没有答案