Как стать автором
Обновить

Комментарии 14

НЛО прилетело и опубликовало эту надпись здесь
Сказ о SIMBL-подобном внедрении и swizzling'е методов уже на стадии подготовки :)
Спасибо за статью, было интересно почитать! Как раз смотрю в сторону рантайма Obj-C для написания настраиваемого логгера функций.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Замечательная статья.

Добавлю еще до кучи пример с __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
замечательная статья, но непонятен вот какой вопрос, каким образом перехватить скажем тот же puts у какого-то уже запущенного приложения, скажем сафари
с DYLD_INSERT_LIBRARIES все понятно, главное перед загрузкой сделать setenv
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории