2015-08-18 4 views
0

Я использовал Detours (http://research.microsoft.com/en-us/projects/detours/) под для Windows, но теперь я с помощью Linux Ubuntu и я хочу Объезд/Hook функции. Я хочу объединить функцию с моей, после этого я хочу вызвать исходную функцию. (Я могу подключить функцию, но после этого я не могу использовать оригинал).функция объезд под Linux Ubuntu

Итак, я решил написать обход функции. Прежде всего, я скопировал функцию в другое место, но я не смог ее выполнить. Можете ли вы мне помочь, почему я не смог ее выполнить? У меня возникла ошибка сегментации.

Мой код:

int (* h_Com_Printf)(const char *fmt, ...); 
... 
void *memBuffer; 
int size = 0x4F; // size of the function 

memBuffer = (void*)malloc(size); 
memcpy(memBuffer, (void*)0x08060DEA, size); // copy the function 

h_Com_Printf = (int (*)(const char *fmt, ...))memBuffer; 
h_Com_Printf("print function: %d\n", 1); // segmentation fault HERE 

Спасибо!

Com_Printf в "исполняемый файл" (IDA Pro): Изображение: http://kepfeltoltes.hu/150818/ida_printf_www.kepfeltoltes.hu_.png

Linux работает в VirtualBox. (Может быть, проблема?)

+0

я нашел [это] (http://aimbots.net/threads/14469-Detours-for-Linux-amp-Windows) часть шаблонного благя, * возможно * быть полезными для вас , – DevSolar

+0

Это не сработало :(Повторная попытка Segmetation ... – Adam

+0

Что заставляет вас думать, что память с явно произвольным адресом 0x08060dea содержит инструкции для функции? Не говорю, что это не так - но это определенно не [ MCVE] (http://stackoverflow.com/help/mcve) как есть ... – twalberg

ответ

1

Простое копирование функции байтов недостаточно, даже если вы знаете точный размер if (что не всегда так), потому что есть много инструкций, которые относятся к EIP (например, вызовите _vsnprintf в вашем примере). Поэтому, что обычно делается (и, по сути, что делает Detours), нужно скопировать только байты, которые были перезаписаны кодом hook (JMP или CALL) и пересчитать смещения, связанные с EIP. Для этого вам нужен дизассемблер, который способен декодировать инструкции и, при необходимости, пересчитывать относительные смещения. Объемы фактически включают один. Я предлагаю вам взглянуть на источники Detours, чтобы лучше понять, что делается, чтобы поместить крючок.

Надеется, что это помогает