6

我正在尝试从 iPhone Mach-O 二进制文件中读取常量(或初始化)字符串。我知道这 3 个相关的 segment.sections 是 _ TEXT。_cstring _文本。_ustring 和 _数据。_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 个字节,我认为它包含实际的字符串,如下所示:

转储_数据。_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
...

非常感谢你的帮助!

4

1 回答 1

3

嗯,我找到了答案。

1)文件通常是加密的(这可以用 otool -l prog_file|grep -i crypt 测试)。并非所有部分都被加密,但通常第一个块包括_TEXT。_text(程序代码)和_TEXT。_cstring 都是。_数据。_cfstring 部分在我的情况下没有加密。

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

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

于 2011-10-24T03:54:52.680 回答