我正在编写一个试图从另一个进程的内存中读取一些数据的应用程序。此其他过程正在加载libmono.0.dylib,目标数据(程序集)应驻留在该文件中。
使用一些基于mach-o的代码,我可以迭代目标进程的已加载dylib,并获取上述lib的mach头基址。从这里我可以进入符号表,该表为我提供了返回带有相关数据的结构的函数的地址:
在单声道源代码中,它看起来像
MonoDomain* mono_get_root_domain (void) { return mono_root_domain; }
我的假设正确吗,即0x18a934的地址包含返回的结构?如果是,此地址是相对于dylib标头(= header_addr + addr)还是我还需要添加一些幻灯片,还是直接使用它?
当我关注该地址时,我遇到的所有其他地址都一样吗?
最佳答案
我正在编写一个试图从另一个进程的内存中读取一些数据的应用程序
每个进程都有自己的虚拟内存空间,并受内核保护。 dylib可能是共享的,如果函数正在返回地址,它将在调用该函数的进程的虚拟内存映射(VMMap)中。
为了将目标进程的内存地址映射到您自己的进程地址空间,您需要目标的任务端口。您曾经能够调用task_for_pid
从其pid获取进程的任务,但是由于OS X 10.10(El Capitan)和引入了系统完整性保护(SIP),因此不再可能。
如果数据驻留在已加载的dylib中,则只需使用dlopen将dylib加载到您自己的进程中,并通过调用dlsym来获取函数的地址。
关于c - 在另一个过程中从加载的dylib读取数据字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41111135/