Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 29.01.2010, 23:03   #1
Рыцарь
 
Аватар для destructor
 
Регистрация: 26.06.2009
Сообщений: 2,433
Сказал Спасибо: 154
Имеет 692 спасибок в 426 сообщенях
destructor на пути к лучшему
По умолчанию

4)
собственно сам "сплайсинг"
идея заключается в том чтобы в начале оригинальной функции записать "jmp куда_нам_надо" и тогда поциэнт будет вызывать "то_что_нам_надо"

код инструкции jmp xxxxx выглядит так:
1байт опкод 0xe9 + 4 байта смещение(какраз 5 байт, тоже "совпадение"),
"смещение" означает сколько байт нам надо перепрыгнуть,
если нам надо прыгнуть на 500 байт вперед, пишем туда 500,
если нам 300 байт назад пишем туда -300.

вычеслить нужное нам значение нужно так:
v = targetaddr - posjmpaddr;
targetaddr, адрес куда надо прыгнуть (в нашем случае это адрес hookMessageBoxW)
posjmpaddr, адрес инструкции jmp + ее размер (+5 байт).

тоесть,
c++ Код:
//делаем доступной память для записи. target = (DWORD)GetProcAddress(LoadLibrary("user32.dll"),"MessageBoxW"); VirtualProtect((void*)target,PAGE_EXECUTE_READWRITE,10,&oldprotect); //вычисляем адрес куда будем писать опкод: BYTE * pE9 = (BYTE*)target; //вычисляем адрес, куда будем писать смещение DWORD * pofset = (DWORD*)(pE9+1); //пишем в память: *pE9 = 0xe9; *pofset = (DWORD)hookMessageBoxW - (target+5);


5)
собираем в кучу написанное выше и оформляем в виде длл:
c++ Код:
#include <Windows.h> //трамлин DWORD addr; int __stdcall jmpMessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption, UINT uType) {     __asm jmp &#91;addr]; }; //обработчик int __stdcall hookMessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption, UINT uType) {        int result = 0;     if(lstrcmpW(lpCaption,L"угнова(c)")==0)     {         //если в заголовке окна есть нецензурное слово, вызываем оригинал со своими параметрами         result = jmpMessageBoxW(hWnd, L"слава роботам!!! убить всех человеков!!", L"какойто робот(с)", MB_ICONINFORMATION);     }     else     {         //если в заголове чтото другое, ничего не трогаем, вызываем оригинал         result = jmpMessageBoxW(hWnd, lpText, lpCaption, uType);     };     return result; }; BOOL WINAPI DllMain( HINSTANCE hModule,DWORD  Reason, LPVOID lpReserved ) {     DWORD target;     DWORD oldprotect;     BYTE * pE9;     DWORD * pofset;     switch(Reason)     {     case DLL_PROCESS_ATTACH:         target = (DWORD)GetProcAddress(GetModuleHandleW(L"user32.dll"),"MessageBoxW");         if(!VirtualProtect((void*)target,10,PAGE_EXECUTE_READWRITE,&oldprotect))return FALSE; // а вдруг?         //настраиваем трамплин         addr = target + 5; //прыгать мы будем не в "начало" функции, а на пять байт дальше.         //правим оригинал, в начало записываем джамп на наш обработчик         pE9 = (BYTE*)target;         pofset = (DWORD*)(pE9+1);         *pE9 = 0xe9;         *pofset = (DWORD)hookMessageBoxW - (target+5);            break;         case DLL_PROCESS_DETACH:         //тут выгрузка длл         //надо восстановить оригинальный код функции,         //но нам по*уй, такой херней страдают только в конец задроченные ботаны,         //а все чоткие праграмисты знают что "меньше кода = меньше багов"         break;     };     return TRUE; };
жмем компилить, должна получится tabletka.rar
теперь если рядом с нашим поциэнтом положить таблетку, мы сможем наблюдать чудесное исцеление.

какашками кидацо незя, т.к. это часный\стерильный случай
__________________
Шожиделать.. ботить хочется..

Последний раз редактировалось destructor, 29.01.2010 в 23:32.
destructor вне форума   Ответить с цитированием
За это сообщение destructor нажился 7 спасибками от:
Старый 30.01.2010, 00:29   #2
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

destructor, то что первые 5 байт совпали в этом примере эт конечно хорошо, но это довольно редкий случай и охрененно упрощающий код притом. А вот если первые 5 байт не совпадают, то начинается веселье, надо переместить первые инструкции (естественно целое количество инструкций) которые заполняют первые 5 или больше байт куданить себе в массив и ещё дописать в массив джамп на оригинальную функцию (со смещением равным количеству списанных из начала байт), оформить этот массив как имеющий возможность быть выполненным (ну VirtualProtect'ом обработать опять же), а вот уже дальше записать на место первых 5 байт оригинала джамп, ну и в своей функции вместо оригинала уже вызывать не оригинал со смещением, а наш массив.
ЗЫ и эт ещё хорошо если мы можем функцию перехватываемую в дизассемблере посмотреть и посчитать сколько байт занимает целое число команд в начале, а если не можем то надо ещё как то программно это определять...
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
За это сообщение xkor нажился 3 спасибками от:
Старый 30.01.2010, 17:16   #3
Рыцарь
 
Аватар для destructor
 
Регистрация: 26.06.2009
Сообщений: 2,433
Сказал Спасибо: 154
Имеет 692 спасибок в 426 сообщенях
destructor на пути к лучшему
По умолчанию

Цитата:
Сообщение от xkor Посмотреть сообщение
но это довольно редкий случай
такие совпадения это довольно частый случай,
во всех основных винапи майкрософт специально дали нам эти 5 байт (добавли 2 nop в начале),
Цитата:
Сообщение от xkor Посмотреть сообщение
и охрененно упрощающий код притом.
ну тут какбы ключевая фраза




Цитата:
Сообщение от xkor Посмотреть сообщение
или больше байт куданить себе в массив и ещё дописать в массив джамп на оригинальную функцию
я "массив" готовлю так:
c++ Код:
int __stdcall jmpMessageBoxW(HWND hWnd,LPCWSTR lpText,LPCWSTR lpCaption, UINT uType) { __asm nop __asm nop __asm nop __asm nop __asm nop __asm nop __asm nop __asm jmp &#91;addr]; };
адрес jmpMessageBoxW это начало "массива",
потом просто делаю копипасту нужного количества инструкций:
memcpy(jmpMessageBoxW,MessageBoxW, X);
и все, код не сильно усложняется
__________________
Шожиделать.. ботить хочется..

Последний раз редактировалось destructor, 30.01.2010 в 17:19.
destructor вне форума   Ответить с цитированием
За это сообщение destructor нажился 3 спасибками от:
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 17:53.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!