121112
.pdf
И ЕЩЕ ОДИН СПОСОБ
CreateProcess();
WriteProcessMemory();
ResumeThread();
И ЕЩЕ ОДИН СПОСОБ
PROS
Нет странного VirtualAllocEx
Нет второго потока
ÀТЕПЕРЬ ВС¨ ВМЕСТЕ
1.launcher.exe
|
CreateProcess(target) |
|
WriteProcessMemory(cave,LoadLibrary(inject.dll)) |
|
ResumeThread(target) |
2. |
inject.dll |
|
DllEntryPoint |
|
Set up hook 1 |
|
Set up hook 2 |
|
... |
3. |
target.exe |
|
WinMain |
LAUNCHER.EXE V1
void main()
{
MEMORY_BASIC_INFORMATION mbi; STARTUPINFOA si;
char path[] = "target.exe";
memset( &si, 0, sizeof( si ) ); si.cb = sizeof( si );
CreateProcess( 0,path,0,0,0,CREATE_SUSPENDED,0,0,&si,&target ); VirtualProtectEx(
target.hProcess,
(void *) TEXT_START, TEXT_SIZE, PAGE_EXECUTE_READWRITE,&mbi.Type);
WriteProcessMemory(target.hProcess,
(void *) CAVE_ADDR, loader, 28, NULL); WriteProcessMemory(target.hProcess,
(void *) WINMAIN_CALL, call, 5, NULL); ResumeThread(target.hThread);
}
LAUNCHER.EXE V1
uchar loader[28] = {0x68,0x00,0xF4,0x98,0x00,0xFF,0x15,0xCC,0x02,0x 99,0x00,0xE9,0x40,0x19,0xCC,0xFF,0x63,0x6F,0x6E,0x73,0x6F,0x6C,0x65 ,0x2E,0x64,0x6C,0x6C,0x00};
push |
offset dllname |
call |
dword ptr [LoadLibrary] |
jmp |
WinMain |
dllname db 'inject.dll',0
uchar call[5] = {0xE8,0xF1,0x2E,0x0B,0x00};
call cave
INJECT.DLL V1
bool APIENTRY DllMain (HANDLE hModule, DWORD ul_reason_for_call, LP VOID lpReserved) {
if(ul_reason_for_call == DLL_PROCESS_ATTACH) { DisableThreadLibraryCalls((HINSTANCE) hModule); init();
}
return 1;
}
void init() {
inject_code( (uchar *)addr1, (int)&hook_for_addr_1, 7 ); inject_code( (uchar *)addr2, (int)&hook_for_addr_2, 5 );
...
}
INJECT.DLL V1
#define HOOK_FUNC(a) void cdecl a(int flags, int edi, int esi, int ebp, int esp, int ebx, int edx, int ecx, int eax)
HOOK_FUNC(hook_for_addr_1) { int arg_0 = *(int*)(esp+4); int arg_4 = *(int*)(esp+8);
print_call_stack( (int *)esp );
}
void inject_code( uchar *ea, int our_hook, int N ) {
uchar *stub = &hooks_playground[MAX_HOOK_SIZE * hooks_count]; memcpy( stub, templ, 9 );
memcpy( stub + 9, ea, N );
memcpy( stub + 9 + N, templ + 9, 5 ); memcpy( ea, templ + 9, 5 ); *((int*)(ea+1)) = (int)stub - (int)ea - 5;
*((int*)(stub+3)) = our_hook - (int)stub - 7; *((int*)(stub+10+N)) = (int)ea - (int)stub - 14; hooks_count++;
}
ЧТО У НАС ЕСТЬ СЕЙЧАС
launcher.exe и inject.dll шаблонные.
имя исследуемой программы
начало секции кода
размер секции кода
адрес cave
адрес WinMain
адрес вызова WinMain
размеры блоков инструкций
КАК БЫ ХОТЕЛОСЬ ЖИТЬ
1.Один и тот же launcher.exe для всех исследуемых программ.
2.Исходник inject.dll сам генерится на основе исследуемой программы.
3.Установка хуков без размера блока инструкций:
inject_code( 0x008cf139, &ssl_send_hook );
IDA PRO ВЫХОДИТ НА СЦЕНУ
