在目标进程内存空间之外定义指针

逆向工程 记忆 Python
2021-06-24 01:11:21

我正在为用 Python 编写的应用程序制作内存编辑器。我已经使用 kernel32.dll 中的 OpenProcess 和 ReadProcessMemory 函数成功地从目标进程中获取了内存数据。获得数据后,我会使用 python 相应地对其进行操作,然后将其传递到我创建的 gui 中。

我想要做的是:因为我抓取的数据包含静态内存地址,并且没有其他方法可以在不再次调用 WriteProcessMemory 的情况下写回内存,我想创建直接指向静态内存地址的指针,以便通过在 gui 中进行一些调整,这些值将立即返回内存。

我尝试使用 ctypes cast 函数执行此操作,该函数成功创建了指针(至少它不会产生任何错误)但是当我尝试获取指针内容时,python 崩溃了,因此唯一合乎逻辑的解释是 python 脚本执行不能直接访问进程内存空间以加载数据。

由于我缺乏这方面的经验,我不知道我能做些什么来使这成为可能。这是 dll 注入派上用场的地方吗?我唯一的其他选择是将内存数据作为文件对象存储在 python 中,不要使用静态指针(这意味着很多转换),进行更改并使用 WriteProcessMemory 将数据放回。

任何帮助表示高度赞赏

2个回答

几乎所有现代操作系统中的内存都是虚拟化的,这意味着每个进程都有自己的地址空间。这意味着相同的地址在您的 Python 程序中拥有与在调试对象中不同的值。

因此,修补该内存唯一方法是WriteProcessMemory,无法使用任何类型的指针访问调试对象的内存。

如果将 DLL 注入到调试进程中,则该 DLL 可以直接访问该进程的内存,但是,这仍然会给您带来如何与 DLL 通信的问题,因为如果它不在您的进程空间中。结合这可能导致的所有其他问题,我强烈建议不要这样做。

根据 Windows 的设计,每个进程都有自己的虚拟地址空间,因此如果没有专门创建共享内存,则无法创建指向另一个进程内存的指针,这就是 RPM/WPM 存在的原因。

另一方面,DLL 注入允许您将代码注入目标进程,因此您可以直接访问目标进程内存。这当然是访问数据的最高效方式,但是如果要将数据导出到外部(套接字、共享内存等),则必须编写接口代码。基本上,您必须执行 RPM/WPM 为您做的事情。

在我看来,RPM/WPM 应该足以满足您的需要,您可以每秒多次调用它而不会遇到太多麻烦。