为游戏制作地址查找器
Making address finder for a game
好的,所以我在过去几天里看了很多文章,描述了.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)或已经可用的知识(如:我知道这个对象是一个代理,所以其中一定有一个位置成员)。但一旦你做到了,在程序中找到你颠倒的东西就很容易了。
- 如何为DNS查找反向IPv6地址-C++
- 如何使用C或C 查找给定的IPv6地址是否属于CIDR范围
- 在 c++ 中按地址查找可变名称
- C++如何使用读取进程内存查找进程内存中使用的最后一个(偏移量 - 地址)
- 仅通过参数查找重载地址
- 如何查找auto_ptr的地址
- 查找最低值.功能.错误:线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x7fff5fc89000)
- 为游戏制作地址查找器
- 是否可以使用内联汇编在 Visual Studio 2010 c++ 中查找代码的地址?
- 从地址中查找堆或堆块或段
- 查找地址属于哪个堆
- 如何使用字符指针查找字符串的地址
- 查找 DNS 服务器和网关的 IP 和 MAC 地址
- 如何在 64 位 DLL 中查找导出函数的地址?
- 使用GDB查找函数对应的内存地址/调试
- 如何查找继承类的分配地址
- 在 gdb 中查找指向地址的所有变量
- 如何查找 IP 地址是否为链路本地地址
- 从计算机名称中查找计算机 IP 地址
- 从另一个进程中查找变量的地址