Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

121112

.pdf
Скачиваний:
6
Добавлен:
23.02.2015
Размер:
317 Кб
Скачать
☆

И ЕЩЕ ОДИН СПОСОБ

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 ВЫХОДИТ НА СЦЕНУ

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]