6

iPhone Mach-O バイナリ ファイルから定数 (または初期化) 文字列を読み取ろうとしています。関連する 3 つの segment.sections が _TEXT であることを理解しています。_cstring_TEXT . _ustring および _DATA _cfstring. ただし、抽出したこれら 3 つのデータ ブロックに文字列情報が格納されていることはわかっていますが、意味がわかりません。すべてゴミのように見えます。認識可能な文字列は見当たりません。誰かがこれに光を当てて、文字列データを読み取るために必要な手順を教えてもらえますか?

私はいくつかのコード ( 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
...

助けてくれてどうもありがとう!

4

1 に答える 1

3

さて、私は答えを見つけました。

1) ファイルは通常暗号化されています (これは otool -l prog_file|grep -i crypt でテストできます)。すべてのセクションが暗号化されるわけではありませんが、通常は_TEXT を含む最初のブロックです。_text (プログラム コード) および _TEXT . _cstring です。_DATA . 私の場合、_cfstring セクションは暗号化されていませんでした。

2) 予想どおり、__cfstring は 16 バイトの構造体 (NSConstantString) で構成され、3 番目の単語はメモリへのポインタであり、_ TEXT. _cstring がロードされます。4 番目の単語は長さです。

したがって、実際には、最初にファイルを復号化してから、すべてを表示してアクセスできるようにするのが秘訣です。私はまだそれを適切に行うことができませんでしたが、メモリの一部を gdb にダンプし、ファイル内の関連するセクションを置き換えました。

于 2011-10-24T03:54:52.680 に答える