iPhone Mach-O二进制文件,字符串存储,__TEXT / __ DATA

时间:2011-10-10 03:29:03

标签: iphone c binary constants mach-o

我试图从iPhone Mach-O二进制文件中读取常量(或启动)字符串。我知道3个相关的segment.sections是_ TEXT。 _cstring _ TEXT。 _ustring和_ DATA。 _cfstring。但是,即使我知道字符串信息存储在我提取的这三个数据块中,我也无法理解它,它看起来像垃圾 - 我看不到任何可识别的字符串。任何人都可以对此有所了解,并让我知道需要采取哪些步骤来读取字符串数据?

我已经查看了一些代码(来自http://llvm.org/svn/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp的GetAddrOfConstantCFString()),但是再一次,它与我在二进制文件中看到的并不完全相关。

在我的情况下,相关部分的大小是:

__TEXT.__cstring (99 K-bytes)
__TEXT.__ustring (<200 bytes)
__DATA.__cfstring (29 K-bytes)

为了给你一个想法,__ cfstring部分的前32个字节,我将包含实际的字符串,如下所示:

转储_ DATA。 _cfstring

00  00  00  00  c8  07  00  00  74  02  0d  00  15  00  00  00
00  00  00  00  c8  07  00  00  8c  02  0d  00  01  00  00  00
...

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:4)

好吧,我找到了答案。

1)文件通常是加密的(可以使用otool -l prog_file | grep -i crypt进行测试)。并非所有部分都是加密的,但通常第一个块包括_ TEXT。 _text(编程代码)和_ TEXT。 _cstring。在我的情况下,_ DATA。 _cfstring部分未加密。

2)正如预期的那样__cfstring由16字节结构(NSConstantString)组成,其中第3个字是指向内存的指针,其中_ TEXT。 _cstring被加载。第四个字是长度。

因此,在现实生活中,诀窍是首先解密文件,然后所有文件都可见且可访问。我仍然没有正确地做到这一点,但在gdb中转储了一块内存,然后替换了文件中的相关部分。