Binary MachO LINKEDIT段偏移错误0x1000

Binary MachO LINKEDIT段偏移错误0x1000,binary,extract,dyld,mach-o,position-independent-code,Binary,Extract,Dyld,Mach O,Position Independent Code,与前面的问题类似,我正在尝试从dyld共享缓存中提取DYLIB。尽管我遇到了一个问题,引用了,其中在data\u offset+0x1000处读取重基信息以及LINKEDIT段中的其他数据 例如,当我用“DYLD\u PRINT\u rebagins=1”打开动态库时,我得到以下结果: TestMachoRunner: pre-load: VoiceShortcutsMod dyld: rebase: voiceShortcutsMod:*0x103000000 += 0xFFFFFFFF5D8

与前面的问题类似,我正在尝试从dyld共享缓存中提取DYLIB。尽管我遇到了一个问题,引用了,其中在
data\u offset+0x1000处读取重基信息以及LINKEDIT段中的其他数据

例如,当我用“DYLD\u PRINT\u rebagins=1”打开动态库时,我得到以下结果:

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字节的数据 虽然我可以像对其他所有内容的重基信息那样做,但这并不是一个好的解决方案,因为它会将最终动态库的大小增加很多,并且不确定每次是否会增加0x1000字节

2.移动段地址。 在dyld中,来自每个图像的每个片段都被组合和排序(更多信息),因此在提取动态库时,这些片段具有非常高的vmaddress,它们之间有很大的间隙。e、 g

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
令我惊讶的是,这起到了作用,数据被正确读取。虽然这会带来另一个问题,但如果我这样做,_文本部分中的所有代码都将中断,因为这些段在内存中的映射方式不同。然后我做了更多的挖掘,发现当构建DYLD缓存时,它实际上修复了这个调整()。不幸的是,要做到这一点,它依赖于动态库中不存在的LC_段_分割_信息


结论
我相信转换片段有最好的工作机会,但我坚持没有片段分割信息。如果你有什么想法,我很想听听,谢谢

那么,是什么阻止了您将
LC\u SEGMENT\u SPLIT\u INFO
添加到提取的动态库中呢?SPLIT INFO包含数据,让我来移动这些片段。除非它在dyld中的某个地方,否则我不知道这一点,但也许您可以修改dylib可执行文件本身并手动添加它(在十六进制编辑器或其他地方)。有一些插入LC的工具,理论上可能也适用于您的案例。但我如何生成它?分段分割信息的全部要点是,它告诉我在哪里以及如何调整文件。那么,是什么阻止您将
LC\u segment\u split\u info
添加到提取的动态库中?分割信息包含数据,让我来移动分段。除非它在dyld中的某个地方,否则我不知道这一点,但也许您可以修改dylib可执行文件本身并手动添加它(在十六进制编辑器或其他地方)。有一些插入LC的工具,理论上可能也适用于您的案例。但我如何生成它?段分割信息的全部要点是,它告诉我在哪里以及如何调整文件。