dyld API на iPhone - странный вывод

У меня к вам три вопроса, все связанные с dyld :)

Я использовал эту справочную страницу dyld в качестве основы. Я скомпилировал следующий код и успешно запустил двоичный файл на своем взломанном устройстве.

#include <stdio.h>
#include <mach-o/dyld.h>

int main(int argc, const char* argv[]) {
   uint32_t image_count, i;
   image_count = _dyld_image_count();
   for (i = 0; i < image_count; i++) {
        printf("%s\n", _dyld_get_image_name(i));
   }
   return 0;
}

Я думал, что эти функции позволяют мне найти все общие библиотеки, загруженные в адресное пространство моей программы. На моем Mac вывод довольно прост: он показывает пути ко всем библиотекам, которые в данный момент загружены в память. На моем iPhone вывод почти такой же — я также получаю пути к файлам, но в указанном месте нет файлов. (С другой стороны, на моем Mac я могу найти файлы!)

Это пример строки из вывода: /usr/lib/system/libdyld.dylib

Согласно ls, iFile и всем другим инструментам, которые я использовал, этот каталог (/usr/lib/system/) пуст. Почему? Где эти файлы?

Еще одна вещь, которую я хотел бы знать: можно ли найти библиотеку в памяти? По какому смещению по какому смещению библиотека отображается в память? Кажется, я знаю, как найти начало, но понятия не имею, как найти конец библиотеки. Чтобы найти начало, я бы использовал адрес, возвращаемый _dyld_get_image_header. Это правильно?

Последний вопрос: я хотел загрузить динамическую библиотеку для всей системы, поэтому я предположил, что могу использовать DYLD_INSERT_LIBRARIES для этого. Однако каждый двоичный файл, который я пытаюсь выполнить после вставки моей библиотеки, падает и выдает ошибку шины! Я что-то забыл или это динамическая библиотека вызывает сбой?


person 0xdead10cc    schedule 18.04.2012    source источник
comment
Вы должны добавить, что вы работаете на взломанном устройстве. Если вы не работаете на взломанном устройстве, то это причина неожиданного поведения, поскольку приложения изолированы и не имеют доступа за пределами своей маленькой песочницы.   -  person Till    schedule 18.04.2012
comment
Разве размер библиотеки не хранится в заголовке? Остальное: указанных файлов нет, потому что их на самом деле нет! Они хранятся в кеше ядра, но их пути жестко запрограммированы в файле dylib, поэтому dyld сообщает, где они находятся (на самом деле это не так).   -  person    schedule 18.04.2012


Ответы (1)


библиотеки расположены по адресу: /System/Library/Caches/com.apple.dyld/dyld_shared_cache_armv6 (_armv7) Это большой файл, в котором все отдельные библиотеки были объединены в одну большую.

См. http://iphonedevwiki.net/index.php/MobileSubstrate для перехвата взломанного устройства.

Да, можно определить положение dylib в памяти даже на устройствах без джейлбрейка. проанализируйте LC_SEGMENT(_TEXT)-Section Header(_text) библиотеки, тогда вы сможете получить базовый адрес библиотеки и размер сегмента TEXT __text. Затем запросите файл vmslide. Добавьте это к базовому адресу TEXT __text.

Подробное описание формата файла mach-o можно найти здесь: https://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/MachORuntime/Reference/reference.html. Обратите особое внимание на структуру «segment_command».

person n80fr1n60    schedule 04.07.2012