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

| 我目前正在将其中一个游戏培训师作为一个小项目。我已经遇到了问题;当您“进入另一个级别”时,诸如燃料,现金,子弹之类的东西的地址就会改变。如果您要重新启动应用程序,也会发生这种情况。 如何重新定位这些地址? 我觉得这是一个相当基本的问题,但这对我来说是“可能或不可能”的问题之一。我是否应该停止寻找并完全忘记这个概念? \“太难?\”     
已邀请:
确切地描述如何执行此操作有点困难,因为它很大程度上取决于您正在研究的程序以及作者是否会因为自己的方式使生活变得困难而走出去。请注意,我只做过一次,但是即使我只懂一点汇编,它也能正常工作。 可能发生的情况是,使用对malloc / new的调用在堆上分配了值,并且每次更改级别时,它们都会被清理并重新分配到其他位置。因此,其想法是查看程序的汇编代码,以查找malloc返回的指针存储在何处,并找到一种可靠地读取指针内容并查找所需值的方法。 您需要的第一件事是像OllyDbg这样的调试器和汇编的基本知识。之后,首先在要检查的变量上设置读写断点。由于您说的是变量的确切位置,因此您必须在进程运行时暂停该进程,并在程序的内存中搜索该值。希望您最终只能筛选出一些结果,但是对堆栈中的任何内容都感到怀疑,因为它可能只是用于函数调用或本地使用的副本。 一旦设置了断点,就运行程序直到发生断点。现在,您要做的就是查看代码并检查如何访问变量。如果将其作为参数传递,请检查该函数的调用站点。如果正在通过指针访问它,请记下它并开始检查指针。如果将它作为指针的偏移量进行访问,则意味着它是数据结构的一部分,因此请记下它并开始检查另一个变量。等等。 专注于变量,并继续检查代码,直到最终找到根,这可能是两件事之一: 具有静态地址的全局变量。这是最简单的方案,因为您已将静态地址直接硬编码到代码中,可用于可靠地遍历数据结构。 堆栈分配的变量。这比较棘手,我不确定如何可靠地处理这种情况。大多数情况下,其地址与堆栈起始处的偏移量可能相同,但可能不同。您也可以遍历堆栈以找到相应的函数及其参数,但这有点棘手。 一旦有了地址,剩下的就是使用ReadProcessMemory根据发现的信息查找变量。例如,如果您拥有的地址表示一个指向数据结构的指针,该数据结构在偏移量0x40处存储了您的燃料值,那么您将必须读取该地址处的值,将其添加0x40并再次读取结果。 请注意,该地址仅在可执行文件没有任何更改的情况下才有效。如果重新编译或打补丁,则必须重新开始。我相信您还必须注意Windows的ASLR,它可能会在每次启动程序时更改地址。 评论框太小,无法容纳,所以我将其放在此处。 如果它是
esp
加一个常量,那么我认为这是一个参数,而不是局部变量(请通过检查调用约定的布局进行确认)。如果真是这样,那么您应该逐步执行程序,直到程序返回到其调用方,确定如何设置参数(在调用指令之前查找推送指令),然后从那里继续进行探索。当我这样做时,我不得不解开堆栈一次或两次,然后才找到指向数据结构的全局指针。 另外,“ 1”寄存器与堆栈无关(我必须查找它),因此我将检查其设置方式。可能是因为它包含数据结构的地址,而常量是变量的偏移量。如果您知道寄存器的设置方式,您将离指针更近了。     

要回复问题请先登录注册