为游戏制作地址查找器

Making address finder for a game

本文关键字:查找 地址 游戏      更新时间:2023-10-16

好的,所以我在过去几天里看了很多文章,描述了.dll注入的概念,使用工具手动查找某些内存地址的值,等等。但我有一些问题无法通过研究回答。为了让这件事有意义,我需要提供一些我正在努力做的事情的背景。

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

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

因此,我的问题归结为:是否有可能建立一个这样的程序,根据某种类型的标准自动找到我想要的地址,以及(如果有人愿意这样做)你能指出一些入门/参考材料来学习如何做到这一点吗?

我最热烈的问候任何善良的回应。

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

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

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

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

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

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

实际上,如果你搜索函数,就不需要这样的模式扫描,因为函数通常只在重新编译时移动,而不是在每次程序启动时移动。然而,上面的例子应该会给你一个印象,它是如何做到的。还要注意,如果你不搜索方法,而是硬编码它们的地址,你的代码可能会在下一个游戏补丁中中断。

最困难的部分是找到功能,确定结构,并简单地了解目标程序在引擎盖下做了什么/它是如何工作的。我们将此过程称为逆向工程。通常,您总是需要某种"入口点">进入应用程序(正如您所想象的,游戏实际上相当大)。这些可以是多种东西,但最常见的当然是一些程序,如结合内存断点的欺骗引擎、目标程序的引用字符串、库函数调用(公开公共可用名称,如Win32、第三方libs)或已经可用的知识(如:我知道这个对象是一个代理,所以其中一定有一个位置成员)。但一旦你做到了,在程序中找到你颠倒的东西就很容易了。