跳转至

跳转钩子

跳转钩子允许你在没有可操纵分支代码的地方钩住代码。跳转钩子用无条件跳转替换被钩的代码,跳到蹦床函数。命中跳转时,蹦床函数存储所有当前寄存器和标志值,调用你选择的回调函数,恢复寄存器,恢复标志,执行被钩子替换代码,最后跳回钩子正下方的代码。这个过程如图 8-1 所示。

原始代码展示了一个你可能在游戏中找到的未修改汇编示例,被钩代码展示了这些汇编被跳转钩子钩住后的样子。蹦床框展示了一个示例蹦床函数(用汇编表示),回调代表你试图通过钩子执行的代码。在原始代码中,汇编从上到下执行。在被钩代码中,要从 SUB EAX,1 指令到达 RETN 指令,执行必须沿虚线箭头所示的路径。

 如果你的回调代码简单,可以集成到蹦床中。存储和恢复寄存器与标志也并不总是必要的,但这样做是好习惯。