Здравствуйте! Помогите, пожалуйста, начинающему. Немогу разобраться с CBT хуком. В отладчике (OllyDbg) ошибка возникает (т.е. все начинает глючить) при установке хука (SetWindowsHookEx). Мне кажется, я напутал с HookProc или CallNextHook. DLL: Код (Text): .586 .model flat, stdcall DLL_PROCESS_DETACH equ 0 DLL_PROCESS_ATTACH equ 1 DLL_THREAD_ATTACH equ 2 DLL_THREAD_DETACH equ 3 Public HookProc1,HHM extern CallNextHookEx@16:near extern MessageBoxA@16:near includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib .data hdl dd ? hh dd ? ;handle of hook text1 db 'message',0 text2 db 'message from HookProc',0 .code code: mov eax,dword ptr [ebp+0ch] cmp eax,0 jne d1 jmp _EXIT d1: cmp eax,1 jne _EXIT mov edx, dword ptr [ebp+08h] mov hdl,edx _EXIT: mov eax,1 ret 12 HHM proc export push ebp mov ebp,esp mov eax,dword ptr [ebp+08h] mov hh,eax pop ebp ret 4 HHM endp HookProc1 proc export push ebp mov ebp,esp push dword ptr [ebp+010h] push dword ptr [ebp+0ch] push dword ptr [ebp+08h] push hh call CallNextHookEx@16 push 0 push offset text1 push offset text2 push 0 call MessageBoxA@16 _EX: pop ebp ret HookProc1 endp end code ------------------------------------------------------------- EXE: Код (Text): .586 .model flat, stdcall extern ExitProcess@4:near extern GetSystemTime@4:near extern MessageBoxA@16:near extern CreateFileA@28:near extern WriteFile@20:near extern CloseHandle@4:near extern LoadLibraryA@4:near extern GetProcAddress@8:near extern FreeLibrary@4:near extern GetMessageA@16:near extern TranslateMessage@4:near extern DispatchMessageA@4:near extern SetWindowsHookExA@16:near extern UnhookWindowsHookEx@4:near includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib msgstruct struc mshwnd dd ? msmesage dd ? mswparam dd ? mslparam dd ? mstime dd ? mspt dd ? msgstruct ends .data msg msgstruct <?> hlib dd ? ;handle of dll hh dd ? ;handle of hook libr db 'DllMainSorce.dll',0 ; name dll nameproc db '_HookProc1@0',0 ; name proc HookProc1 addrproc dd ? ; addres of proc HookProc1 hhm db '_HHM@0',0 ; name proc HHM hhmaddr dd ? ; addres of proc HHM .data? .code code: push offset libr call LoadLibraryA@4 mov hlib,eax push offset nameproc push hlib call GetProcAddress@8 mov [addrproc],eax push offset hhm push hlib call GetProcAddress@8 mov [hhmaddr],eax push 0 push hlib push addrproc push 05h ;WH_CBT call SetWindowsHookExA@16 mov hh,eax mov eax, hhmaddr push hh call eax ; save handle of hook in dll MSG_LOOP: push 0 push 0 push 0 push offset msg call GetMessageA@16 cmp eax,0 je END_MSG_LOOP push offset msg call TranslateMessage@4 push offset msg call DispatchMessageA@4 jmp MSG_LOOP END_MSG_LOOP: push hh call UnhookWindowsHookEx@4 push hlib call FreeLibrary@4 push 0 call ExitProcess@4 end code
NumberOne Для начала неплохо было бы написать нормальный код - которых хотя бы проверяет возвращаемые значения функций. По вопросу - Сама хук процедура принимает три параметра - стало быть и выталкивать из стека она должна три, а у Вас нуль.