从另一个进程中加载​​的dylib读取数据字段

时间:2016-12-12 23:02:18

标签: c macos mono dynamic-linking mach-o

我正在编写一个试图从另一个进程的内存中读取一些数据的应用程序。另一个进程是加载目标数据(程序集)所在的libmono.0.dylib。

使用一些基于mach-o的代码,我可以迭代目标进程的加载dylib并获得上面lib的mach头基址。从这里我可以到达符号表,该表给出了返回带有相关数据的struct的函数的地址:

_mono_get_root_domain symbol

在单声道源代码中,它看起来像

MonoDomain* mono_get_root_domain (void) { return mono_root_domain; }

我的假设是否正确0x18a934的地址是否包含返回的结构?如果是,这个地址是相对于dylib头(= header_addr + addr)还是我还需要添加一些幻灯片,或者只是按原样使用它? 当我按照这个地址时遇到的每个其他地址都一样吗?

1 个答案:

答案 0 :(得分:0)

  

我正在编写一个试图从另一个进程的内存中读取一些数据的应用程序

每个进程都有自己的虚拟内存空间,并受内核保护。可以共享dylib,如果函数返回一个地址,它将位于调用该函数的进程的虚拟内存映射(VMMap)中。

为了将目标进程的内存地址映射到您自己的进程地址空间,您需要目标的任务端口。您曾经能够调用task_for_pid从其pid获取进程的任务,但自OS X 10.10(El Capitan)和系统完整性保护(SIP)引入以来,这已不再可能

如果数据位于已加载的dylib中,只需使用dlopen将dylib加载到您自己的进程中,并通过调用dlsym获取该函数的地址。