微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我目前正在将这些游戏培训师当作一个小型项目。 我已经遇到了一个问题。 当你“进入一个不同的层次”时,诸如燃油,现金,子弹,地址等地址都会改变。 这也会发生,如果你要重新启动应用程序。

我怎样才能重新定位这些地址?

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

logging内存访问占用空间

为什么Linux有足够的内存,但使用交换

用C / C ++实现线程本地存储(TLS)(multithreading)

为什么在TOP命令的详细列表中列出的SWAP大于摘要

原生应用程序的初始内存占用空间较大

写入物理内存地址

如何分配页面大小alignment的内存?

如何查找或计算Linux进程的页表大小和其他内核记帐?

最有效的替代IsBadReadPtr?

如何testing主内存访问时间?

因为它严重依赖于你正在学习的程序,以及作者是否会走出困境,这是很难描述如何做到这一点的。 请注意,我只做过一次,但是即使我只知道一个小组件,它也能很好地工作。

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

首先你需要的是像OllyDbg这样的调试器,以及汇编的基本知识。 之后,首先在要检查的变量上设置读写断点。 既然你说过,你不能确切地知道变量的位置,你必须暂停进程,并在程序的内存中搜索这个值。 希望最终只能得到几个筛选结果,但是对堆栈中的任何东西都是可疑的,因为它可能只是一个函数调用或本地使用的副本。

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

保持专注于你的变量,只是继续检查代码,直到你最终找到可以是以下两件事之一的根:

具有静态地址的全局变量。 这是最简单的情况,因为您有一个静态地址直接写入代码,您可以使用它来可靠地遍历数据结构。

一个堆栈分配变量。 这是棘手的,我不完全确定如何可靠地处理这种情况。 大多数情况下,它的地址可能与堆栈的起始位置有相同的偏移量,但可能不会。 你也可以走堆栈找到相应的函数及其参数,但这有点棘手得到正确的。

一旦你有一个地址,所有剩下要做的就是使用ReadProcessMemory来使用你找到的信息来定位你的变量。 例如,如果你的地址代表一个指向0x40偏移量的数据结构的指针,那么你的燃料值就被存储起来了,那么你必须读取地址的值,加上0x40,然后再读取结果。

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

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

如果是esp加常量,那么我相信这是一个参数而不是局部变量(通过检查调用约定的布局来确认)。 如果是这样的话,那么你应该继续执行程序,直到它返回给调用者,找出如何设置参数(在调用指令前查找推送指令)并继续从那里进行探索。 当我这样做时,我不得不在展开一次或两次之前解开堆栈,然后才找到指向数据结构的全局指针。

此外esi注册是不相关的堆栈(我必须查找它 ),所以我会检查它是如何设置的。 这可能是它包含数据结构的地址,常量是变量的偏移量。 如果你知道寄存器是如何设置的,你将会更接近指针。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐