跳转至

设计条件断点

知道这些后,要在只打印“Player 1”时暂停执行,我只需在执行断点前检查当前玩家名字。用伪代码表示,新断点看起来像这样:

if (EAX[ECX].name == "Player 1") breakpoint();

一旦我想出新断点的形式,我需要在循环内访问 EAX[ECX].name。就是 OllyDbg 表达式引擎发挥作用的地方:我可以通过对汇编代码使用的表达式做修改来实现目标,得到这样的表达式:

[STRING EAX + ECX*0x90 + 0x50] == "Player 1"

我移除了 printText() 上的代码断点,用使用这个表达式的条件断点替换它,它告诉 OllyDbg 只在 EAX + ECX*0x90 +0x50 处存储的字符串值与 Player 1 的名字匹配时中断。这个断点只在绘制“Player 1”时触发,让我可以继续分析。

设计这个断点所花的工作量看起来可能很大,经过练习,整个过程会变得像写代码一样直觉化。有经验的黑客可以在几秒钟内完成。

在实践中,这个断点让我能够在“Player 1”一出现在屏幕上时就检查 playerStruct() 函数中的某些值。这样做很重要,因为这些值的状态只与我在玩家进入屏幕后的最初几帧内进行的分析相关。像这样创造性地使用断点,可以让你分析各种复杂的游戏行为。