进程间内存编辑 - 查找已更改的地址

时间:2011-06-18 06:31:52

标签: c++ windows winapi memory

我目前正在将其中一个游戏培训师作为一个小项目。我已经遇到了问题;当你“进入不同的水平”时,燃料,现金,子弹,地址等地址会发生变化。如果您要重新启动应用程序,也会发生这种情况。

如何重新找到这些地址?

我觉得这是一个相当基本的问题,但对我来说,这是“它是或不可能”的问题之一。我应该停止寻找并完全忘记这个概念吗? “太难了?”

1 个答案:

答案 0 :(得分:1)

要准确地描述如何做到这一点有点困难,因为它严重依赖于你正在学习的课程,以及作者是否因为他的方式让你的生活变得困难而离开了。请注意,我只做了一次,但即使我只知道一点组装,它也能很好地工作。

可能发生的情况是,使用对malloc / new的调用在堆上分配值,每次更改级别时,它们都会被清理并在其他位置重新分配。因此,我们的想法是查看程序的汇编代码,以找到malloc返回的指针所在的位置,并找出一种方法来可靠地读取指针的内容并找到您正在寻找的值。

您首先想要的是像OllyDbg这样的调试器以及汇编的基本知识。之后,首先在要检查的变量上设置读写断点。既然你说你无法确切知道变量的位置,你必须在它运行时暂停该过程并在程序的内存中搜索该值。希望你最终只能筛选一些结果,但要对堆栈中的任何内容产生怀疑,因为它可能只是函数调用或本地使用的副本。

设置断点后,只需运行程序直到发生中断。现在,您所要做的就是查看代码并检查变量的访问方式。如果它作为参数传递,请检查函数的调用站点。如果通过指针访问它,请记下它并开始检查指针。如果它作为指针的偏移量被访问,则意味着它是数据结构的一部分,因此记下它并开始检查另一个变量。等等。

专注于你的变量,并继续检查代码,直到你最终找到根,这可能是两件事之一:

  • 具有静态地址的全局变量。这是最简单的方案,因为您将一个静态地址直接硬编码到可用于可靠地遍历数据结构的代码中。

  • 堆栈分配变量。这比较棘手,我不完全确定如何可靠地处理这种情况。它的地址可能在大多数时间内与堆栈的开头具有相同的偏移量,但它可能不会。您也可以遍历堆栈以找到相应的函数及其参数,但这样做有点棘手。

如果您有地址,剩下要做的就是使用ReadProcessMemory使用您找到的信息找到您的变量。例如,如果您所拥有的地址表示指向数据结构的指针,其中存储偏移量为0x40的燃料值,则您必须读取地址处的值,向其添加0x40并对结果执行另一次读取。

请注意,只要可执行文件不以任何方式更改,该地址才有效。如果它被重新编译或修补,那么你必须重新开始。我相信你也必须小心Windows {{{}},这可能会在你每次启动程序时改变地址。


评论框太小,不适合这个,所以我会把它放在这里。

如果它是esp加上常量,那么我认为这是一个参数而不是局部变量(通过检查调用约定的布局来确认)。如果是这种情况,那么你应该执行该程序,直到它返回到它的调用者,弄清楚参数是如何设置的(在调用指令之前查找推送指令)并从那里继续探索。当我这样做时,我必须在找到指向数据结构的全局指针之前将堆栈展开一次或两次。

此外esi寄存器与堆栈无关(我必须ASLR)所以我会检查它是如何设置的。可能是它包含数据结构的地址,而常量是变量的偏移量。如果你弄清楚如何设置寄存器,那么你将更接近指针。