如何用C ++生成0xE8(调用)操作码

时间:2014-06-08 18:27:43

标签: code-injection dll-injection

基本上,我所拥有的是一款具有MyFunc()功能的游戏,它在游戏中的4个位置被调用。其中一个地址是0x10002000,字节是E8 0B 83 01 00

我正在注入一个DLL,并希望将0xE8(调用)修补到我自己的地址。当我使用Cheat Engine的Auto Assembler并编写call MYADDRESS时,它会生成正确的操作码和正确的字节。

但是,如果我使用DLL,这就是我得到的: Cheat Engine

我想要达到的是call 74C611CC。所以我需要生成操作码的字节,就像我想要的那样,而不是它当前的内容(在屏幕截图中)

我使用这种代码:

*(BYTE*) dwPatchAddr = 0xE8;
*(DWORD*) (dwPatchAddr + 1) = (DWORD) myFunc;

1 个答案:

答案 0 :(得分:1)

e8指令是相对调用指令,而不是绝对指令。因此接下来的4个字节需要是处理该指令时pc与目标函数之间的差异。所以你想要的是:

*(BYTE *)dwPatchAddr = 0xE8;
*(DWORD *)(dwPatchAddr + 1) = (DWORD)((char *)myFunc - (char *)(dwPatchAddr + 5));

请注意,用于计算偏移量的PC地址实际上是调用后 next 指令的地址(也将作为返回地址推送)。