2012-04-18 3 views
2

У меня есть три вопроса для вас, всех связанных с dyld :)dyld API на iPhone - странный выход

Я использую this dyld man page в качестве основы. Я скомпилировал следующий код и успешно выполнил двоичный код на моем джейлбрейк-устройстве.

#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 вывод почти такой же - я также получаю файловые пути - но файлов в указанном месте нет. (На мой макинтош с другой стороны, я могу найти файлы!)

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

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

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

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

+0

Вы должны добавить, что работаете на джейлбрейк-устройстве. Если вы не работаете на джейлбрейк-устройстве, то это аргумент в пользу неожиданного поведения, поскольку приложения изолированы песком и не имеют доступа к ним за пределами их маленькой песочницы. – Till

+0

Не размер библиотеки, хранящийся в заголовке? Else: указанных файлов нет, потому что на самом деле там нет! Они хранятся в кеше ядра, но у них есть путь к жесткому кодированию в файл dylib, поэтому dyld сообщает им, где они (на самом деле). –

ответ

2

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

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

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

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