C++ 为游戏制作地址查找器

C++ 为游戏制作地址查找器,c++,dll,code-injection,C++,Dll,Code Injection,好的,在过去的几天里,我看了很多文章,描述了.dll注入的概念,使用工具手动查找某些内存地址的值,等等。但是我有一些问题,我无法通过研究回答。我需要提供一些背景资料,说明我正在尝试做什么,以便让这一切变得有意义 我正在编写一个与游戏通信的应用程序,这个游戏不是为与任何第三方应用程序通信而设计的。该程序需要保存游戏中发生的某些事情的记录,并将其写入一个文件(例如,角色x死亡,总共3个角色死亡,等等)。我不是想恶意“黑客”游戏或改变记忆,只是读一下 所以我读了一些关于dll注入的文章,使用了诸如Ch

好的,在过去的几天里,我看了很多文章,描述了.dll注入的概念,使用工具手动查找某些内存地址的值,等等。但是我有一些问题,我无法通过研究回答。我需要提供一些背景资料,说明我正在尝试做什么,以便让这一切变得有意义

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

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

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


我最诚挚的问候任何有爱心的人。

是的,其实很简单

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

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

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

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

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

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

每个DLL/EXE都有一个基址。找出地址属于哪个DLL/EXE,并从两个地址创建一个偏移量。然后当你进行注入时,找到目标DLL/EXE,得到它的基址,然后使用以前获得的偏移量调整它。塔达!