【问题标题】:iPhone Mach-O binaries, string storage, __TEXT/__DATAiPhone Mach-O 二进制文件、字符串存储、__TEXT/__DATA
【发布时间】:2011-10-10 03:29:02
【问题描述】:

我正在尝试从 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 个字节,我认为它包含实际的字符串,如下所示:

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

非常感谢您的帮助!

【问题讨论】:

  • 认为它的目标是 iPhone,可能会以某种方式被压缩。
  • 我认为__cfstring 部分将仅包含对象数据,这意味着它将具有指向__cstring 部分的指针,该部分随后包含原始字符串字符。
  • ughoavgfhw,这听起来很合理,并且可以解释为什么 __cstring 比其他部分大。问题是 __cstring 数据看起来像垃圾。我试图将它解码为 UTF-16,但它没有产生一个普通的字符串。

标签: iphone c binary constants mach-o


【解决方案1】:

嗯,我找到了答案。

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

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

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

【讨论】:

    猜你喜欢
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多