1

与我之前的问题类似,在这里这里,我正在尝试从 dyld 共享缓存中提取 dylib。虽然我遇到了一个问题,在此处引用,其中 rebase 信息以及 LINKEDIT 段中的其他数据正在被读取data_offset + 0x1000

例如,当我使用“DYLD_PRINT_REBASINGS=1”打开 dylib 时,我得到以下信息,

TestMachoRunner: pre-load: VoiceShortcutsMod
dyld: rebase: voiceShortcutsMod:*0x103000000 += 0xFFFFFFFF5D8B9000
TestMachoRunner: dlopen(/var/root/voiceShortcutsMod, 1): bad rebase type 0 in /var/root/voiceShortcutsMod

与我在数据前面添加 0x1000 字节时相比,

TestMachoRunner: pre-load: VoiceShortcutsMod
dyld: rebase: voiceShortcutsMod:*0x121F862F8 += 0xFFFFFFFF5AF3D000
dyld: rebase: voiceShortcutsMod:*0x121F86300 += 0xFFFFFFFF5AF3D000
dyld: rebase: voiceShortcutsMod:*0x121F86308 += 0xFFFFFFFF5AF3D000
...

并作为参考,一个普通的图书馆,

TestMachoRunner: pre-load: TestMacho
dyld: rebase: TestMacho:*0x1003D0018 += 0x1003C8000
dyld: rebase: TestMacho:*0x1003D0038 += 0x1003C8000
dyld: rebase: TestMacho:*0x1003D0048 += 0x1003C8000
...

可能的解决方案

1. 将 0x1000 字节的数据添加到所有内容中

     虽然,虽然我可以对其他所有内容执行我对 rebase 信息所做的操作,但这感觉不是一个好的解决方案,因为会大大增加最终 dylib 的大小,并且不确定它是否会增加 0x1000 字节每次。

2. 移动段地址。

     在 dyld 中,每个图像的每个段都被组合和排序(更多信息在这里),因此在提取 dylib 时,这些段具有非常高的 vmaddress 并且它们之间的间隙很大。例如,

1A5747000 __TEXT
1C70492F8 __DATA_CONST
1CB44F160 __DATA
1CD79F3C8 __DATA_DIRTY
1D0014000 __LINKEDIT

为了测试我的理论,我将 vmaddresses 设置为与文件偏移量相同,这将使它更像一个常规库,例如,

5B000 __TEXT
5C000 __DATA_CONST
70000 __DATA
78000 __DATA_DIRTY
7C000 __LINKEDIT

令我惊讶的是,这有效并且数据被正确读取。尽管这带来了另一个问题,但如果我这样做,__text 部分中的所有代码都会中断,因为这些段将在内存中以不同方式映射。然后我做了更多的挖掘,发现在构建 DYLD Cache 时,它​​实际上修复了这个调整(源代码)。不幸的是,要做到这一点,它依赖于 dylib 中不存在的 LC_SEGMENT_SPLIT_INFO。


结论

     我相信转移细分市场有最好的工作机会,但我坚持没有segment_split_info。如果您有任何想法,我很想听听,谢谢!

4

0 回答 0