Привет всем! (просьба ногами не пинать - я начинающий ) Пытаюсь написать программу перехватывающую в себе вызов WinExec. Читаю статью: http://www.wasm.ru/article.php?article=apihook_2 (огромное спасибо автору!) Код: ;================================= .586 .model flat,stdcall option casemap:none include GenIncs.inc include Macro.inc .data sz_PL db "cmd",0 dd_MainMH dd 0 dd_AWinExecute dd 0 dd_OriginalWinExecute dd 0 dd_BytesWritten dd 0 .code start: invoke WinExec, ADDR sz_PL, 1 invoke GetCurrentProcess mov dd_MainMH, eax ;Получили хєндл основного приложения: ;PrintDec dd_MainMH invoke GetModuleHandle, SADD("kernel32.dll") invoke GetProcAddress, eax, SADD("WinExec") ;Получили Адресс процедуры WinExec: ;PrintDec eax ;Сохраняем старое начало функции invoke ReadProcessMemory, dd_MainMH, dd_AWinExecute, dd_OriginalWinExecute, ???, dd_BytesWritten (тут ещё писать и писать ... :-() invoke ExitProcess, 0 ret end start ;================================= Оригинал: //================================= Procedure SetHook; var HKernel32, HUser32: dword; begin CurrProc := GetCurrentProcess; //получение адреса CreateProcessA AdrCreateProcessA := GetProcAddress(GetModuleHandle('kernel32.dll'), 'CreateProcessA'); //инициализация структуры перехвата CreateProcessA JmpCrProcA.PuhsOp := $68; JmpCrProcA.PushArg := @NewCreateProcessA; JmpCrProcA.RetOp := $C3; //сохраняем старое начало функции ReadProcessMemory(CurrProc, AdrCreateProcessA, @OldCrp, SizeOf(OldCode), bw); //записываем новое начало CreateProcessA WriteProcessMemory(CurrProc, AdrCreateProcessA, @JmpCrProcA, SizeOf(far_jmp), Writen); end; //================================= Как сделать аналог OldCode? Это структура задана как: type fr_jmp = packed record PuhsOp: byte; PushArg: pointer; RetOp: byte; end; OldCode = packed record One: dword; two: word; end; Как такое на МАЗМ32 сделать? Помогите пожалуйста! -- Огромное спасибо заранее!
Вот пример установки хуков путем сплайснга с дизассемблером длин. Правда там синтаксис фасма, но авось чем-нибудь поможет. Код (Text): HookCode: ; fnAddr, NewAddr push ebp mov ebp, esp sub esp, 10h push esi push ebx lea eax, [ebp-4] mov dword [eax], 0 lea ebx, [ebp-8] mov dword [ebx], 20 invokex ZwAllocateVirtualMemory, -1, eax, 0, ebx, MEM_COMMIT + MEM_RESERVE, PAGE_EXECUTE_READWRITE test eax, eax jnz @F push edi mov edi, [ebp-4] mov esi, [ebp+8] lea ebx, [edi+5] mov edx, esi sub edx, edi sub edx, 5 hCopy: push esi call SizeOfOpcode mov ecx, eax rep movsb cmp edi, ebx jna hCopy mov byte [edi], 0E9h mov dword [edi+1], edx pop edi lea eax, [ebp-10h] mov ebx, [ebp+8] mov [eax], ebx lea ebx, [ebp-8] lea ecx, [ebp-0Ch] invokex ZwProtectVirtualMemory, -1, eax, ebx, PAGE_EXECUTE_READWRITE, ecx test eax, eax jnz @F mov ecx, [ebp+8] mov edx, [ebp+0Ch] sub edx, ecx sub edx, 5 mov byte [ecx], 0E9h mov dword [ecx+1], edx mov eax, [ebp-4] @@: pop ebx pop esi leave retn 8
http://www.wasm.ru/src/6/oapihook.zip Own API Hooker by comrade MASM | 6.42 kb Программа перехватывает сама в себе API-функцию MessageBoxIndirectA Комментариев: 0 (http://www.wasm.ru/srclist.php?list=6)
Насколько я знаю масм32 вставляет переходники на функции. Ну типа когда вы делаете invoke MessageBoxA, 0, addr buff, addr buff, 0 Реально управление передаётся на код следушего содержания jmp RealMessageBoxA. Тоесть если подредактировать данные переходники то можно будет хукать функции в себе. Посмотрите под олли дебагером по какому адресу лежат даные переходники и пишите туда.