您是在寻找在客户端本地修改的函数,还是试图确定一个函数来处理传出坐标数据以远程移动玩家?对于这个答案,我将假设前者。我还将 100% 坚持使用 Cheat Engine。无论如何,这并不全面,但从动态分析的角度来看,它应该能让您朝着正确的方向前进。
您发现的坐标数据可能在某个时候通过您感兴趣的函数提供,但问题是当您的坐标数据通过指令传递时,您可能深入到子程序中。因此,您可以首先检查向您找到的三个坐标地址中的任何一个写入的内容。
您可能有多个结果,而且任何给定的结果都可能是共享指令,因此通过右键单击指令并选择查看指令写入的地址来检查它。如果经过一些测试后只弹出一个地址,那么您就可以开始了。
在反汇编程序中查看该指令后,您将进入某种可能与坐标数据相关的例程。它直接是您感兴趣的功能吗?这是您必须花一些时间倒车才能找到的地方。
在此过程中可能会对您有所帮助的几件事如下:
Enumerate DLLs:在 Memory Viewer 窗口中,单击View -> Enumerate DLLs and Symbols。CE 可以收集到的与函数名称相关的任何信息都会在那里填充,因此您可以搜索您可能感兴趣的名称。可以在此处查看演示视频。
剖析代码:在内存查看器窗口中,单击工具 -> 剖析代码。这将在您反转时为您提供许多适用的附加信息,例如哪些 CALL 正在调用您可能会发现自己处于其中的例程等。
您还可以利用 CE 的中断/跟踪来查找传递给函数的参数。我喜欢从被调用的函数/方法的粗略视图开始,这导致了我所在的那个。为此,在 Break and Trace 窗口中,选中显示“Step over 而不是单步”的框。我还喜欢检查“保存堆栈快照”,以便我可以挑选一些东西。
最后,您可能需要考虑使用 Ultimap 或 Ultimap 2,可在“工具”下的“内存查看器”窗口中找到。它们允许您记录函数调用并过滤掉所有您知道不是您感兴趣的函数的调用。可以在此处和此处查看两个讨论 Ultimap 的视频。如果您的目标是 32 位,那么您可以使用一个很棒的小工具CDA:代码动态分析(此处的教程视频)来做与 Ultimap 相同的事情,但以不同的方式(基于时间线)并且没有额外的麻烦的 Ultimap 需要 DBVM 才能工作(Ultimap 2 不需要 DBVM,但确实需要正确的 CPU,因为它利用了Intel Processor Trace)。