Комментарии 14
НЛО прилетело и опубликовало эту надпись здесь
Сказ о SIMBL-подобном внедрении и swizzling'е методов уже на стадии подготовки :)
Замечательная статья.
Добавлю еще до кучи пример с __interpose секцией из cегмента __DATA (впрочем можно и без отдельной секции обойтись, главное что DYLD_INSERT_LIBRARIES может обеспечить нам загрузку раньше остальных библиотек и поэтому можно перекрыть чужие экспорты, при этом остается возможность работы из замененной функции с оригинальной при самостоятельной подзагрузки библиотеки):
Добавлю еще до кучи пример с __interpose секцией из cегмента __DATA (впрочем можно и без отдельной секции обойтись, главное что DYLD_INSERT_LIBRARIES может обеспечить нам загрузку раньше остальных библиотек и поэтому можно перекрыть чужие экспорты, при этом остается возможность работы из замененной функции с оригинальной при самостоятельной подзагрузки библиотеки):
testlib.c
#include <stdio.h>
void libtest()
{
puts("hello world");
}
test.c
extern void libtest(void);
int main (int argc, const char * argv[])
{
libtest();
return 0;
}
libwithhook.c
#include <stdio.h>
typedef struct interpose_s {
void *new_func;
void *old_func;
} interpose_t;
int new_puts(const char *);
static const interpose_t interposers[] \
__attribute__ ((section("__DATA, __interpose"))) = {
{ (void *)new_puts, (void *)puts },
};
int new_puts(const char *str)
{
return puts("hello from hook!");
}
Интересно, зачем вам такие извращения? надо патчить какую-то кривую проприетарную программу с закрытым кодом? ну-ну, пишите дальше костыли, которые могут сломаться в любом новом релизе.
Быть может не в тему напишу, но так хочется запускать программы для IPhone через valgrind. В инете даже есть что-то вроде инструкции (http://landonf.bikemonkey.org/code/iphone/iPhone_Simulator_Valgrind.20081224.html), но, к сожалению, оно не работает из-за символов типа ...$UNIX2003. Может быть у местных гуру будут какие-нибудь советы на этот счёт? =)
А почему вас кстати не устраивают стандартные инструменты?
Насчет valgrind ничего не скажу, а вот $UNIX2003 это так называемые Symbol Variants необходимые для обратной совместимости developer.apple.com/library/mac/#releasenotes/Darwin/SymbolVariantsRelNotes/_index.html
Вот пример кода который перехватывает все варианты функций с помощью DYLD_INSERT_LIBRARIES github.com/anatol/tup/blob/2379478c8671ecfa32ad5a45a68f6a1424bb3901/src/ldpreload/ldpreload.c
Вот пример кода который перехватывает все варианты функций с помощью DYLD_INSERT_LIBRARIES github.com/anatol/tup/blob/2379478c8671ecfa32ad5a45a68f6a1424bb3901/src/ldpreload/ldpreload.c
замечательная статья, но непонятен вот какой вопрос, каким образом перехватить скажем тот же puts у какого-то уже запущенного приложения, скажем сафари
с DYLD_INSERT_LIBRARIES все понятно, главное перед загрузкой сделать setenv
с DYLD_INSERT_LIBRARIES все понятно, главное перед загрузкой сделать setenv
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Перенаправление функций в Mach-O библиотеках