编写检查生命值的表达式¶
和以前一样,我首先用 Cheat Engine 找到存储生命值的地址。用第五页「Cheat Engine 的内存扫描器」中描述的方法,我确定地址是 0x40A000。
接下来,我需要一个表达式,告诉 OllyDbg 在我的生命值低于最大值时返回 1,否则返回 0。知道我的生命值存储在 0x40A000,最大值是 500,我最初设计了这样的表达式:
这个表达式会在我的生命值低于 500 时触发中断(记住,十进制数字在表达式引擎中必须以句点结尾),但不是等待函数被调用,而是立即中断。为了确保它等到函数被调用,我追加了另一个使用 && 操作符的表达式:
在 x86 处理器上,EIP 寄存器存有执行的操作的地址,所以我决定检查 EIP 处的第一个字节①,看它是否等于 0xE8。这个值告诉处理器执行近函数调用,这正是我要找的调用类型。
开始跟踪之前,我必须做最后一件事。因为跟踪功能会反复单步执行(跟踪步入使用步入,跟踪步过使用步过,正如第二十四页「OllyDbg 用户界面速览」所述),我需要在任何可能更新生命值代码的级别或更高级别的位置开始跟踪。