在游戏中找到对象位置的好方法是什么

逆向工程 记忆
2021-07-09 01:57:01

因此,在给定的游戏中,地图周围随机放置了一些对象。我已经设法(通过在作弊引擎中使用内存)发现当某个对象在我的绘制距离内时,单个值会发生变化。它是一个布尔值 0 或 1。我曾期望能够搜索这些对象的位置(基于我在 x 和 y 中对象的 N、E、S 和 W 处的位置间隔)但是我惊讶地发现在这个范围内没有找到任何值!有没有一种软件/方法可以让我尝试解决这类问题?

我意识到这是一个广泛的问题 - 我不想将其限制在特定的游戏中,因为我希望将该方法应用于多个游戏。如果有其他方法可以使问题更狭窄,请在评论中说出来,我会修改!

1个回答

我将假设应用程序是用 Visual C++ 编写的。

CheatEngine 本身对于查找对象已经非常有用——首先,您需要在代码中找到创建这些对象的位置。例如在 C++ 中你会写:

GameObject* obj = new GameObject();

在汇编中,这通常被内联到 malloc 调用中。因此,如果您使用 IDA Pro 之类的工具来更准确地对程序集进行逆向工程,您可能会看到如下内容:

;; void* obj = malloc(64);

push  40h      ;; alloc 64 bytes
call  _malloc  ;; easilly detected only if program dynamically links to msvcrt.dll
add   esp, 4
mov   [esp+local_C0], eax

从中你可以看出你的对象的大小总是 64 字节(这只是一个例子,所以你的具体程序可能有更大的对象)。

如果您在 Visual Studio 中启动程序(文件 -> 打开.. -> 项目/解决方案.. -> YourProgram.exe),您可以强制它使用 Windows 调试堆,这将允许您遍历所有动态分配的堆节点并过滤掉所有大小为 64 字节的节点。

现在您应该拥有大量潜在的 GameObject 指针,过滤的最终级别将检测一些基本模式 - 例如,如果该类使用虚函数,则该对象的第一个字段将是其 VTable 条目,从而为您提供一个简单的标识符是否为游戏对象。

这可能不是一个完整的示例,但它应该足以让您朝着正确的方向前进。