c++ - 为游戏制作地址查找器

标签 c++ dll code-injection

好的,所以我在过去几天看了很多文章,描述了 .dll 注入(inject)的概念,使用工具在特定内存地址手动查找值等。但我有一些问题,我不是'通过我的研究无法回答。我需要提供一些关于我正在尝试做的事情的背景,以使其有意义。

我正在编写一个要与游戏通信的应用程序,该游戏并非设计用于与任何第三方应用程序通信。该程序将需要保留游戏中发生的某些事情的记录并将它们写入文件(例如,角色 x 死亡,总共 3 个角色死亡等)。我不是要恶意“破解”游戏或更改内存,只是阅读它。

所以我阅读了有关 dll 注入(inject)的文章,使用 CheatEngine 等工具,这就是我的困惑所在。我意识到我使用 CheatEngine 找到的地址在不同的计算机上加载时会有所不同,并且所以我不能只是将这些地址硬编码到 .dll 中。这个手动过程显然是行不通的,因为这个程序的目标用户群体是那些对内存黑客攻击比我更无能为力的人。

所以,我的问题归结为:是否有可能构建这些程序之一,根据某种类型的标准自动找到我想要的地址,并且(如果有人愿意这样做的话) ) 你能指出一些入门/引用资料来学习如何做到这一点吗?

我向任何愿意做出回应的人致以最诚挚的问候。

最佳答案

是的,其实很简单。

如果你这样做,例如 Foo* objPtr = new Foo();,你的 Foo 对象会在你每次启动应用程序时分配到不同的地方。不过,要找到它,您必须找到指向它的变量,objPtr 在这种情况下基本上是“静态”。然而,这可以通过多个级别。如果需要,您可以对该值进行硬编码,但这不是首选。

通常您搜索例如 getter,它为您提供全局对象或搜索直接引用这些全局对象的函数。通过这些全局对象,您现在可以获得所需的实际对象。

您可以通过搜索字节序列在运行时找到它们。想象一个非常简单的函数:

PUSH EBP
MOV EBP, ESP
MOV EAX, globalVar
POP EBP

您创建一个代表此代码片段(操作码等)的二进制模式,然后简单地遍历整个程序以尝试找到此特定方法。但是,您的模式需要是唯一的,它应该只匹配整个二进制文件中的一个位置。这有时会有点棘手,需要您发挥创造力。在这种情况下,可能无法找到唯一的模式(该函数太通用)。一旦找到这个函数,就可以调用它来获取对象或直接从中读取地址(解析MOV EAX, globalVar)。尽管调用可能更好,因为代码可能会更改,但其功能/签名通常不会。

实际上,如果您搜索函数,则不需要进行这种模式扫描,函数通常只在重新编译时移动,而不是在程序的每次启动时移动。但是,上面的示例应该让您对它是如何完成的有一个印象。另请注意,如果您不搜索方法而是对它们的地址进行硬编码,您的代码可能会在下一个游戏补丁中中断。

困难的部分是找到功能、识别结构并简单地了解您的目标程序在幕后做了什么/它是如何工作的。我们将此过程称为逆向工程。通常您总是需要进入应用程序的某种“入口点”(您可以想象,游戏实际上非常大)。这些可能是多种多样的,但最常见的肯定是像 Cheat Engine 与内存断点、目标程序中的引用字符串、库函数调用(公开可用名称,例如 Win32、第 3 方库)或已经可用的程序知识(例如:我知道这个对象是一个代理,所以在某个地方必须有一个位置成员)。 但是一旦你这样做了,实际上找到你在程序中反转的东西就很容易了。

关于c++ - 为游戏制作地址查找器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21742152/

相关文章:

C++ 变量声明

c++ - 为什么我的 32 位 Fortran/C DLL 不能在 MSYS2 中编译?

Javassist 注释 MemberValue 不带 Name

java - 与在 PHP 中运行的应用程序接口(interface)?

c++ - 提示编译器返回一个使 'auto' 表现良好的引用

C++ shared_ptr 从派生方法返回这个

dll - 同时注册32位和64位DLL

javascript - onClick 标签中的安全性如何防止 javascript 注入(inject)?

c++ - 为什么模板复制构造函数会覆盖默认复制构造函数?

.net - 是否可以从 Lua 代码加载 .net dll?