大多数情况下,您可以创建一个处理更新的脚本。例如,找到地址后,右键单击并执行“找出访问此地址的内容”。等待更改值,然后弹出的窗口将显示更改该地址的代码。右键单击其中一个结果并打开反汇编程序。假设这是movsd xmm0,[ecx]
这里的行:
8B 01 - mov eax,[ecx]
89 06 - mov [esi],eax
EB 54 - jmp Game.exe+45951
F2 0F10 01 - movsd xmm0,[ecx]
F2 0F11 06 - movsd [esi],xmm0
选择该行并按 CTRL+A 打开自动汇编器窗口。然后从模板菜单中选择“AOB 注入”。将此保存到您的表格并关闭窗口,然后打开该新脚本。顶部附近会有一条以 开头的线aobscanmodule
。如果您在此处看到错误,则无法确定该内存位置的唯一签名。如果没有错误,那么当游戏更新,地址发生变化时,应该还是能找到的。应该有一个部分如下所示:
code:
movsd xmm0,[ecx]
movsd [esi],xmm0
jmp return
这是重新定位的代码。游戏中的原始代码被替换为一个新分配的内存区域的 jmp,在该内存区域组装该代码,然后jmp return
返回到原始内存区域中的该代码之后。
你需要知道一点组装。该指令movsd xmm0,[ecx]
将 ecx 指向的内存位置中的浮点值加载到 xmm0 寄存器中。这会访问您关心的内存位置,因此您可以像这样设置该值:
code:
mov [ecx],(float)500.0 // set value to 500.0
movsd xmm0,[ecx]
movsd [esi],xmm0
jmp return
现在,每当程序尝试运行访问该内存位置的代码时,它将跳转到新的内存位置,将该地址处的值更新为 500.0,然后运行原始代码并跳回。
当该aobscanmodule
行确实显示错误时,这意味着有太多太相似的代码部分。逻辑向后和向前查看几行汇编并查找十六进制字节,忽略如果游戏更新可能会更改的地址。例如,当游戏更新时,该代码中的任何内容都可能不会改变,没有指针,只有一条相当接近的 jmp 指令。
要格外小心,您可能需要停止正在查找访问该地址的代码的窗口,然后右键单击该代码行并选择“找出该指令访问的地址”。如果窗口中出现多个地址,那么您在没有更多帮助的情况下有点搞砸了,因为它是用于更多值的通用代码,而不仅仅是您关心的值。