我有一个使用多个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(),意思是原始函数,然后编写我的代码。 所以我要做的是在调用函数后挂钩函数。
有人可以帮帮我吗?