Двоичные файлы iPhone Mach-O, хранение строк, __TEXT / __ DATA - PullRequest
6 голосов
/ 10 октября 2011

Я пытаюсь прочитать постоянные (или инициализирующие) строки из двоичного файла iPhone Mach-O iPhone. Я понимаю, что 3 соответствующих сегмента сегмента: _ TEXT. _cstring _ TEXT. _ustring и _ DATA. _cfstring. Однако, хотя я знаю, что строковая информация хранится в этих трех блоках данных, которые я извлек, я не могу понять это, и все это выглядит как мусор - я не вижу никаких распознаваемых символьных строк. Может кто-нибудь пролить свет на это и дать мне представление о том, какие шаги необходимо предпринять, чтобы прочитать строковые данные?

Я посмотрел на некоторый код (GetAddrOfConstantCFString () из http://llvm.org/svn/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp),, но, опять же, не могу связать его с тем, что вижу в двоичных файлах.

В моем случае размеры рассматриваемых разделов:

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

Чтобы дать вам представление, первые 32 байта секции __cfstring, которые, как я думаю, будет содержать реальные строки, выглядят так:

Дамп _ ДАННЫЕ. _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 Ответ

4 голосов
/ 24 октября 2011

Ну, я нашел ответ.

1) файлы обычно зашифрованы (это можно проверить с помощью otool -l prog_file | grep -i crypt). Не все разделы зашифрованы, но обычно это первый блок, включающий _ TEXT. _text (код программы) и _ TEXT. _cstring. Раздел _ DATA. _cfstring в моем случае не был зашифрован.

2) как и ожидалось, __cfstring состоит из 16-байтовых структур (NSConstantString), где 3-е слово является указателем на память, в которой загружается _ TEXT. _cstring. 4-е слово - это длина.

Таким образом, в реальной жизни задача состоит в том, чтобы сначала расшифровать файл, а затем все становится видимым и доступным. Я все еще не удосужился сделать это должным образом, но выкинул часть памяти в gdb, которая затем заменила соответствующий раздел в файле.

...