为游戏制作地址查找器

时间:2014-02-12 23:27:28

标签: c++ dll code-injection

好的,所以我在过去几天看了很多文章,描述了.dll注入的概念,使用工具在某些内存地址上手动查找值等等。但我有一些问题我不是能够通过我的研究回答。我需要提供一些背景信息,说明我想要做的事情,以便有意义。

我正在编写一个与游戏进行通信的应用程序,此游戏并非旨在与任何第三方应用程序通信。该程序将被要求保存游戏中发生的某些事情的记录并将它们写入文件(例如,字符x死亡,3个总字符死亡等)。我不是试图恶意“破解”游戏或改变记忆,只是阅读它。

所以我阅读了关于dll注入的文章,使用CheatEngine等工具,这就是我的困惑所在。我意识到使用CheatEngine找到的地址在加载到不同的计算机时会有所不同,所以我不能将这些地址硬编码到.dll中。这个手动过程显然不起作用,因为这个程序的目标用户人口统计数据显示人们对内存黑客的了解比我更加无知。

所以,我的问题归结为:甚至可以构建其中一个程序,根据某些类型的标准自动找到我想要的地址,并且(如果有人这样做很好的话)你能指出一些入门/参考材料来学习如何做到吗?

我最热烈的问候,对任何一个有足够回应的人。

1 个答案:

答案 0 :(得分:1)

是的,它实际上非常简单。

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

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

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

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

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

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

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