erstmal sorry für mein Deutsch, bin ein Ausländer
Also, ich schreibe zur Zeit einen kleinen KeyLogger mit masm32.
Das Projekt besteht aus einem *.exe sowie einen *.dll die funktionen InstallHook und UninstallHook exportiert.
Das ganze sieht so aus:
1. Nachdem start des EXE wird die Funktion InstallHook aus dem DLL aufgerufen.
2. Nachdem irgendeine Taste gedrückt wurde, sendet die DLL eine Message an das Hostanwendung mittels
SendMessage
3. EXE "empfängt" die Nachricht und verarbeitet ihn weiter
4. Nachdem das Fenster des EXE geschlossen wird, wird die Funktion UninstallHook aus dem DLL aufgerufen
um das Hook aufzuheben.
So nun zu meinem Problem.
Also wie gesagt alles funzt einwandfrei, bloss das Hauptfenster empfängt keine Nachricht von den DLL.
Dass die DLL richtig funktioniert, zweifele ich nicht, denn wenn ich das Host-Programm im C++ schreibe,
funzt es 100%.
Also es liegt beim *.exe und nicht beim *.dll
hier ist der Code des EXE
Code: Alles auswählen
.386
.model flat, stdcall
option casemap :none
include windows.inc
include kernel32.inc
include user32.inc
includelib kernel32.lib
includelib user32.lib
WndProc PROTO :DWORD, :DWORD, :DWORD, :DWORD
.DATA
szCaption db "rkl",0
szClassName db "rkl",0
hLib dd 0
szLibName db "hookdll.dll",0
lpfnInstHook dd 0
szInstHook db "InstallHook",0
lpfnUninstHook dd 0
szUninstHook db "UninstallHook",0
wc WNDCLASSEX<>
WM_KEYHOOK equ WM_USER+100
.DATA?
hInstance dd ?
hIcon dd ?
hCursor dd ?
hWnd dd ?
.CODE
;####################################################################################################
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke LoadIcon,hInstance,IDI_APPLICATION
mov hIcon, eax
invoke LoadCursor, NULL, IDC_ARROW
mov hCursor, eax
mov wc.cbSize,sizeof WNDCLASSEX
mov wc.style,CS_BYTEALIGNCLIENT or CS_BYTEALIGNWINDOW
push offset WndProc
pop wc.lpfnWndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
push COLOR_BTNFACE+1
pop wc.hbrBackground
mov wc.lpszMenuName,NULL
push offset szClassName
pop wc.lpszClassName
push hIcon
pop wc.hIcon
push hIcon
pop wc.hIconSm
push hCursor
pop wc.hCursor
invoke RegisterClassEx, addr wc
invoke CreateWindowEx, WS_EX_LEFT,addr szClassName,addr szCaption,
WS_OVERLAPPEDWINDOW, 250, 250, 250, 150, NULL, NULL, hInstance, NULL
mov hWnd, eax
invoke ShowWindow, hWnd, SW_SHOW ; SW_HIDE um im Hintergrung laufen zu lassen
invoke UpdateWindow,hWnd
call MsgLoop
invoke ExitProcess, eax
MsgLoop PROC
LOCAL msg:MSG
Startloop:
invoke GetMessage, addr msg, NULL, 0, 0
or eax,eax
je Exitloop
invoke DispatchMessage,addr msg
jmp Startloop
Exitloop:
mov eax, msg.wParam
ret
MsgLoop ENDP
WndProc PROC hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
;-------------------------------------------------------
.if uMsg == WM_CREATE
invoke LoadLibrary, addr szLibName
mov hLib, eax
invoke GetProcAddress, hLib, addr szInstHook
mov lpfnInstHook, eax
push hWnd
call dword ptr lpfnInstHook
xor eax, eax
ret
;--------------------------------------------------------
.elseif uMsg == WM_DESTROY
invoke GetProcAddress, hLib, addr szUninstHook
mov lpfnUninstHook, eax
call dword ptr lpfnUninstHook
invoke FreeLibrary, hLib
invoke PostQuitMessage, NULL
xor eax,eax
ret
;--------------------------------------------------------
.elseif uMsg == WM_KEYHOOK
invoke MessageBox, NULL, 0, 0, 0
xor eax, eax
ret
.endif
;--------------------------------------------------------
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc ENDP
END start
Code: Alles auswählen
.386
.MODEL flat,stdcall
OPTION CASEMAP:NONE
include windows.inc
include user32.inc
includelib user32.lib
.DATA
hDllInstance dd 0
hhkHook dd 0
WM_KEYHOOK equ WM_USER+100
szUninstalled db "Hook uninstalled",0
szInstalled db "Hook installed",0
Shared SEGMENT ;Shared Segment, Project mit "/SECTION:Shared,RWS" linken
hWindow dd 0
Shared ENDS
.CODE
KeyboardHookProc proc dwCode:DWORD, wParam:WPARAM, lParam:LONG
cmp dwCode, 0; 0 = HC_ACTION
jne nexthook
mov eax, lParam
and eax, 40000000h
cmp eax, 40000000h
je nexthook
invoke SendMessage, hWindow, WM_KEYHOOK, wParam, lParam
nexthook:
invoke CallNextHookEx, hhkHook, dwCode, wParam, lParam
RET
KeyboardHookProc EndP
InstallHook proc hParent:HWND
mov eax, hParent ; uebergebene Handle des Main-Window
mov hWindow, eax ; im hWindow für spater sichern
invoke SetWindowsHookEx, WH_KEYBOARD, KeyboardHookProc, hDllInstance, NULL
mov hhkHook, eax
.if eax != 0
invoke MessageBox, NULL, addr szInstalled, 0, 0
.endif
mov eax, TRUE
ret
InstallHook endp
UninstallHook proc
invoke UnhookWindowsHookEx, hhkHook
.if eax != 0
invoke MessageBox, NULL, addr szUninstalled, 0, 0
.endif
mov eax, TRUE
ret
UninstallHook EndP
DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
cmp reason, 1 ;1 = DLL_PROCESS_ATTACH
jne ende
mov eax, hInstance
mov hDllInstance, eax
ende:
mov eax,TRUE
ret
DllEntry Endp
End DllEntry
Warum empfängt das Fenster keine Nachricht "WM_KEYHOOK" ?????
Vielen Dank im voraus
Grüß
Peter