gpt4 book ai didi

objective-c - 以编程方式确定在另一个进程中加载​​了哪些模块? (OS X)

转载 作者:太空狗 更新时间:2023-10-30 03:31:19 65 4
gpt4 key购买 nike

我觉得我想做的事情很简单,只是不确定具体怎么做。

具体来说,我只想获取在另一个进程中加载​​的模块(共享/动态库)列表。以及获取该模块在给定进程中所在位置的起始地址。

使用 GDB 获取这些信息非常简单。您只需连接到该流程,然后输入“信息共享”。这正是我想要获得的信息类型。如:

Num Basename
Type Address Reason | | Source | |
| | | | | |
1 Adium
- 0x1000 exec Y Y /Applications/Adium.app/Contents/MacOS/Adium (offset 0x0) 2 dyld
- 0x8fe00000 dyld Y Y /usr/lib/dyld at 0x8fe00000 (offset 0x0) with prefix "__dyld_" 3 WebCore F 0x95b6a000 dyld Y Y /System/Library/Frameworks/WebKit.framework/Versions/A/Frameworks/WebCore.framework/Versions/A/WebCore at 0x95b6a000 (offset 0x95b6a000)

有谁知道如何以编程方式执行此操作?显然,模块加载的位置是动态的,因此我需要确定它的位置。

最佳答案

首先使用task_for_pid()获取任务端口。

然后使用task_info找到“dyld所有图片信息地址”:

struct task_dyld_info dyld_info;
mach_msg_type_number_t count = TASK_DYLD_INFO_COUNT;
if (task_info(task, TASK_DYLD_INFO, (task_info_t)&dyld_info, &count) == KERN_SUCCESS)
{
// retrieve dyld_info.all_image_info_addr;
}

这个地址会指向内存中的一个结构体dyld_all_image_infos:

struct dyld_all_image_infos {
uint32_t version;
uint32_t infoArrayCount;
const struct dyld_image_info* infoArray;
// ...
}

infoArrayCount 和 infoArray 条目在这里很重要。您必须检索这些值(使用 mach_vm_read)并遍历 infoArray。每个条目都是一个结构体 dyld_image_info:

struct dyld_image_info {
const struct mach_header* imageLoadAddress;
const char* imageFilePath;
uintptr_t imageFileModDate;
};

在此结构中,您有兴趣检索 imageLoadAddress(内存中库的地址)和 imageFilePath(内存中以 NULL 结尾的文件路径的地址)的值。

重要说明:在上面的结构中标记为指针或 uintptr_t 的字段具有不同的字节大小,具体取决于正在运行的进程是 32 位还是 64 位。您可以通过查看 dyld_info.all_image_info_format 是 TASK_DYLD_ALL_IMAGE_INFO_32 还是 TASK_DYLD_ALL_IMAGE_INFO_64 来确定指针大小(应该可以,但我自己还没有测试过)。

最后,这仍然不包括动态链接器本身的条目。要检索它,我发现的一种方法是遍历 vm 区域(即 mach_vm_region),并找到第一个看起来像 mach dylinker 的区域(检查 MH_DYLINKER 作为文件类型;参见 mach-o 文件格式获取更多信息)。最后我记得检查过,gdb 和/或 lldb 也有这样做的功能。解析 mach header 也是判断进程是 32 位还是 64 位的一种可能方法。

在检索所有 dyld 图像信息条目后,您可能还想按地址对它们进行排序。

我建议不要查看 newosxbook 的 vmmap 实现代码。它已经过时(因为它仍然使用 DYLD_ALL_IMAGE_INFOS_OFFSET_OFFSET),并且它做了一些不必要的暴力破解。

关于objective-c - 以编程方式确定在另一个进程中加载​​了哪些模块? (OS X),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4309117/

65 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com