我将假设应用程序是用 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 条目,从而为您提供一个简单的标识符是否为游戏对象。
这可能不是一个完整的示例,但它应该足以让您朝着正确的方向前进。