从 dyld_shared_cache 中的 __objc_selrefs 获取方法名称

Get method name from __objc_selrefs in dyld_shared_cache

我正在尝试制作类似于 dyld_decache and dsc_extractor 的 dyld 提取器。但是我在解析 __objc_selrefs 部分时遇到问题。

出于测试目的,我使用了 libsystem_trace.dylib,并且能够找到并解析它的 mach_header 及其片段和部分。但是查看 __DATA.__objc_selrefs 部分我发现像 0x201b8647fc8 和 0x201b860d716 这样的指针太高并且指向缓存之外。

相比之下,在普通的 Macho 文件中,__objc_selrefs 部分中的指针指向它们在 __TEXT.__objc_methname 部分中的相应字符串。

我知道dyld slides 和rebases sections,但经过大量修改后,我仍然无法修复指针。任何指导都会很棒,特别是考虑到那里的资源很少。

这些 "addresses" 不只是指向缓存之外,它们指向最大范围 iOS 分配给用户空间地址 space.
问题是这些不是原始地址,它们是混合了一些标志的地址。我至少见过 0x20000000000 和 0x40000000000,它们似乎是 Objective-C 代码所独有的。我不知道它们是什么意思,也不知道这些标志的真正位掩码是什么,但到目前为止,保留地址的低 40 位 (0xffffffffff) 对我来说已经完成了工作。
那会变成例如您的 0x201b8647fc8 值转换为 0x1b8647fc8,它应该位于共享缓存边界内。