![]() |
сплайсинг GetProcAddress + получение RetEIP
вот с какой задачей столкнулся, нужно перехватывать GetProcAddress в целях реверсирования одной байды. итак имеем следующее:
FARPROC (__stdcall* gGetProcAddress)(HMODULE,LPCSTR); - указатель на оригинальную функцию которая вызывается в конце, и собсна сам перехватчик: FARPROC __stdcall fGetProcAddress(HMODULE hmod, LPCSTR proc) { DWORD io; DWORD ret_eip; char buf[200]; __asm{ // вот хз как получить RetEIP push eax; mov eax,[esp+4]; //тут ясен хер в стеке переменные перехватчика mov ret_eip,eax; pop eax; } g_dwCallnum++; itoa(g_dwCallnum, buf, 10); WriteFile(g_hLog, buf, lstrlenA(buf), &io, 0); WriteFile(g_hLog, ") GetProcAddress: ", 18, &io, 0); WriteFile(g_hLog, proc, lstrlenA(proc), &io, 0); WriteFile(g_hLog, " RetEIP: ", 9, &io, 0); itoa(ret_eip, buf, 16); WriteFile(g_hLog, buf, lstrlenA(buf), &io, 0); WriteFile(g_hLog, "\r\n", 2, &io, 0); // В лог пишется таким образом: 1) GetProcAddress: ExitWindowsEx RetEIP: 40178A // Но ессна по вставке асма ясно что RetEIP будет полнейшим бредом. return gGetProcAddress(hmod,proc); } Какбы сделать так чтобы извлекать адрес возврата? была мысль оформить тело перехватчика в стиле __declspec(naked) __stdcall fGetProcAddress(HMODULE hmod, LPCSTR proc) { __asm { // тут код записи лога jmp gGetProcAddress; } } но этож заебешься писать. кто что может посоветовать? |
А че сплайсинг? Хук не катит? хотя что это изменит.. щас я пороюсь
|
>> // вот хз как получить RetEIP
Если не будет локальных переменных, то адрес возврата будет на вершине стека. Я так на асме писала - посмотри в отладчике сколько занимают локальные переменные и учитывай их |
Цитата:
Цитата:
|
я не говорю что их не юзать. я говорю посмотреть в отладчике
|
DWORD ret_eip = (DWORD)&hmod - 4;
вернее DWORD *p = (DWORD *)&hmod - 1; DWORD ret_eip = p[0]; |
>>а про push reg перед использованием
м=\. а ну да, ты прав Код:
1000102A 55 PUSH EBP |
всем спасибо, проблема решена :)
|
вот ещё одно отличие программиста от хакера с античата... программист не будет делать все через жопу ради быстрого эффекта, а подумает сначала (АСМ вставки это признак необразованости и их надо стараться избегать в программах на С и С++ как минимум)
Код:
FARPROC (WINAPI *gGetProcAddress)(HMODULE hModule,LPCTSTR lpProcName); |
| Время: 03:49 |