调试游戏以收集更多数据¶
让我们暂时抛开这个假设的文件读取,看看 Process Monitor 如何让你从事件记录过渡到调试。Process Monitor 为每个事件存储完整的调用栈,显示导致事件触发的完整执行链。你可以在「事件属性」窗口的「栈」选项卡中查看这些调用栈(双击事件或按 ctrl-P),如图 3-3 所示。

调用栈显示在一个表格中,以「帧」列①开始,它显示执行模式和栈帧索引。这一列中的粉色 K 表示调用发生在内核模式,蓝色 U 表示发生在用户模式。由于游戏黑客通常在用户模式下工作,内核模式操作通常没有意义。
「模块」列②显示调用代码所在的可执行模块。每个模块只是发起调用的二进制名称;这让你很容易识别哪些调用实际上来自游戏二进制内部。
「位置」列③显示发起每个调用的函数名以及调用偏移量。这些函数名是从模块的导出表中推断出来的,游戏二进制内部的函数通常不会有。当没有函数名时,「位置」列会改为显示模块名和调用相对于模块基址的偏移量(调用在内存中距离起始地址有多少字节)。
注 在代码的语境中,偏移量是某个条目与它的起点之间的汇编代码字节数。
「地址」列④显示调用的代码地址,这非常有用,因为你可以跳转到 OllyDbg 反汇编器中的该地址。最后,「路径」列⑤显示发起调用的模块的路径。
在我看来,调用栈是 Process Monitor 迄今为止最强大的功能。它揭示导致某个事件的完整上下文,在调试游戏时极其有用。你可以用它找到触发事件的精确代码,沿调用链向上爬,看看它如何到达那里,甚至确定完成每个动作确切使用了哪些库。
Process Monitor 的姊妹应用 Process Explorer 并没有多少超出 Process Monitor 或 OllyDbg 的能力。但它确实更有效地暴露了其中一些能力,使它在某些情况下成为理想选择。