Fenster empfängt nicht alle Nachrichten

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

Moderatoren: crack, Krüsty, Marwin

Beitragvon 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

Beitragvon 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

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

:) :) :)

Hey Leute hat sich erledigt :D

Aber trotzdem Danke ;)
Peter III
Member
 
Beiträge: 17
Registriert: Montag 16. August 2004, 13:53

Beitragvon 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
Benutzeravatar
Marwin
Moderator
 
Beiträge: 307
Registriert: Donnerstag 8. Mai 2003, 21:19
Wohnort: Seelow, Deutschland

Beitragvon 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
Peter III
Member
 
Beiträge: 17
Registriert: Montag 16. August 2004, 13:53


Zurück zu Assembler

 


  • { RELATED_TOPICS }
    Antworten
    Zugriffe
    Letzter Beitrag

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron