为游戏制作地址查找器

3

好的,最近几天我看过很多关于.dll注入概念的文章,使用工具手动查找某些内存地址的值等等。但是我有一些问题无法通过我的研究回答。为了理解这个问题,我需要先介绍下我正在做的事情。

我正在编写一个应用程序,将与游戏通信,这个游戏不是设计用来与任何第三方应用程序通信的。该程序需要记录游戏中发生的某些事件并将它们写入文件中(例如:角色x死亡,共计3个角色死亡等)。我并不试图恶意地“黑客”游戏或更改内存,只是读取它。

因此,我阅读了关于dll注入的文章,使用诸如CheatEngine之类的工具,这就引起了我的困惑。我意识到使用CheatEngine找到的地址在加载到另一台计算机上时会发生变化,因此我不能将这些地址硬编码到.dll中。这个手动过程显然行不通,因为这个程序的目标用户人群甚至比我对于内存黑客还要无知。

因此,我的问题归结为:是否有可能构建这些程序,以自动查找我想要的地址,基于某种标准,以及(如果有人这样做)是否可以指向一些入门/参考材料来学习如何完成这个任务?

对于任何友好回复,我表示最热情的谢意。


每个DLL/EXE都有一个基地址。找出该地址属于哪个DLL/EXE,并从两个地址创建偏移量。然后,在进行注入时,找到目标DLL/EXE,获取其基地址,然后使用先前获取的偏移量进行调整。完成! - Captain Obvlious
1个回答

2

是的,实际上很简单。

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

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

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

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

您需要创建一个二进制“模式”,代表这段代码(操作码等),并简单地迭代整个程序,试图找到这个特定的方法。然而,您的模式需要是唯一的,它应该只匹配整个二进制文件中的一个位置。这有时可能有点棘手,需要您有创意。在这种情况下,可能无法找到唯一的模式(该函数过于通用)。一旦找到此函数,您可以调用它以获取对象或直接从中读取地址(解析MOV EAX,globalVar)。尽管如此,调用通常更好,因为代码可能会更改,但其功能/签名通常不会更改。
实际上,如果您正在寻找函数,则不需要进行此类“模式扫描”,因为它们通常仅在重新编译时移动,而不是在每次启动程序时移动。但是,上面的示例应该让您了解如何完成此操作。还请注意,如果您不搜索方法而硬编码其地址,则您的代码可能会在下一个游戏补丁上中断。
难点在于找到函数,确定结构并简单地了解您的目标程序在底层执行什么/如何工作。我们称此过程为“逆向工程”。通常,您总是需要某种应用程序“入口点”(可以想象,游戏实际上相当大)。这些可以是多种东西,但最常见的是像作弊引擎之类的程序与内存断点,目标程序中引用的字符串,库函数调用(公开可用名称,例如Win32、第三方库)或已经可用的知识(例如:我知道此对象是代理,因此必须在其中有一个位置成员)。
但是一旦完成了这些工作,实际上在程序中找到您反转的内容就非常容易了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接