游戏中控制流的操作与钩子技术
在游戏操作中,我们可以通过多种方式来操纵游戏,如添加代码、劫持线程、创建新线程,甚至从执行流中移除现有代码。而将这些方法结合起来,就形成了一种更强大的操作方法——钩子(Hooking)。钩子允许我们拦截精确的执行分支,并将其重定向到我们编写的注入代码中,从而控制游戏的下一步操作。下面将介绍四种强大的游戏黑客钩子方法。
1. 调用钩子(Call Hooking)
调用钩子直接修改 CALL 操作的目标,使其指向新的代码段。在 x86 汇编中,CALL 操作有几种变体,但调用钩子通常只用于近调用(near call),近调用将立即地址作为操作数。
1.1 内存中的近调用
在汇编程序中,近调用看起来像这样:
CALL 0x0BADF00D近调用由字节 0xE8 表示,但在内存中的存储方式并非简单的0xE8 0x0BADF00D。实际上,近调用存储的是相对于调用后地址的偏移量,计算公式为:calleeAddress – (callAddress + 5)。
例如,如果CALL 0x0BADF00D在内存中的地址是0xDEADBEEF,那么 0xE8 后面的值是:
0x0BADF00D – (0xDEADBEEF + 5) = 0x2D003119