基本上,我所拥有的是一款具有MyFunc()
功能的游戏,它在游戏中的4个位置被调用。其中一个地址是0x10002000
,字节是E8 0B 83 01 00
。
我正在注入一个DLL,并希望将0xE8
(调用)修补到我自己的地址。当我使用Cheat Engine的Auto Assembler并编写call MYADDRESS
时,它会生成正确的操作码和正确的字节。
但是,如果我使用DLL,这就是我得到的:
我想要达到的是call 74C611CC
。所以我需要生成操作码的字节,就像我想要的那样,而不是它当前的内容(在屏幕截图中)
我使用这种代码:
*(BYTE*) dwPatchAddr = 0xE8;
*(DWORD*) (dwPatchAddr + 1) = (DWORD) myFunc;
答案 0 :(得分:1)
e8
指令是相对调用指令,而不是绝对指令。因此接下来的4个字节需要是处理该指令时pc与目标函数之间的差异。所以你想要的是:
*(BYTE *)dwPatchAddr = 0xE8;
*(DWORD *)(dwPatchAddr + 1) = (DWORD)((char *)myFunc - (char *)(dwPatchAddr + 5));
请注意,用于计算偏移量的PC地址实际上是调用后 next 指令的地址(也将作为返回地址推送)。