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


Social Bookmarking
Bookmark bei: Mr. Wong Bookmark bei: Del.icio.us Bookmark bei: Webnews Bookmark bei: Icio Bookmark bei: Oneview Bookmark bei: Linkarena Bookmark bei: Newskick Bookmark bei: Folkd Bookmark bei: Yigg Bookmark bei: Digg Bookmark bei: Reddit Bookmark bei: Simpy Bookmark bei: StumbleUpon Bookmark bei: Slashdot Bookmark bei: Netscape Bookmark bei: Furl Bookmark bei: Yahoo Bookmark bei: Spurl Bookmark bei: Google Bookmark bei: Blinklist Bookmark bei: Blogmarks Bookmark bei: Diigo Bookmark bei: Technorati Bookmark bei: Newsvine Bookmark bei: Blinkbits Bookmark bei: Ma.Gnolia Bookmark bei: Smarking Bookmark bei: Netvouz

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder