![]() |
Fensterbotschaften(Window Messages) auslesen
moin,
Wie kann ich mit einem Hook es hinkriegen alle Messages von Benutzer Prozesses auszulesen und einfach zu Protokolieren. Mein ziel ist es wie das Proggie Wininspector Spy diw Window Messages zu Sniffen. Reicht dazu SetWindowsHookEx ? Oder sollte ich es mit dll-injection mit hilfe der komponente von Madishi versuchen? Hat einer eine idee wie ich das könnte? |
Re: Fensterbotschaften(Window Messages) auslesen
Hallo,
ich würde in einer DLL mittels
Delphi-Quellcode:
nen hook setzen und dann die Nachrichten in der HookProc loggen:
HookHandle := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, hInstance, 0);
Delphi-Quellcode:
Gruß peanut.
function HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var AMessage: PMSG; begin AMessage := PMSG(lParam); // in AMessage^.message steht dann die Nachricht end; |
Re: Fensterbotschaften(Window Messages) auslesen
hi peanut danke für deine antwort,
also ich habe jetzt folgednes schonmal gemacht: Dll:
Delphi-Quellcode:
library
WndMsgSniffer; uses Windows, Messages; Type tag = record LPARAM :lParam; WPARAM :wParam; message:Cardinal; HWND :hwnd; end; PMsg = ^Tag; var HookHandle :Cardinal; TargetWindowHandle:Cardinal; OwnWindowHandle :Cardinal; function GetMsgProc(code: integer; wParam: WPARAM; lParam: LPARAM): LResult; stdcall; var var aCopy:TCopyDataStruct; begin if (code < 0) Then exit else begin {IPC zeugs} with aCopy do begin dwData := PMsg(lparam).Message cbData := 0; lpData := nil; end; SendMessage(ApplicationHandle, WM_COPYDATA, Longint(HookHandle),LongInt(@aCopy)); end; Result := CallNextHookEx(HookHandle, Code, wparam, lparam); end; function InstallHooks(Hwnd: Cardinal;OwnHwnd:Cardinal): Boolean; stdcall; begin TargetWindowHandle:=Hwnd; //Handle des zu schützenden Fensters OwnWindowHandle:=OwnHwnd; //Handle des Hauptprogramm-Fensters HookHandle := SetWindowsHookEx(WH_GETMESSAGE, GetMsgProc, hinstance, GetWindowThreadProcessId(TargetWindowHandle)); Result:=Hookhandle<>0; end; function UninstallHooks: Boolean; stdcall; begin result:=UnHookWindowsHookEx(HookHandle); end; exports InstallHooks, UninstallHooks; begin end. Hauptfenster:
Delphi-Quellcode:
Nur leider funzt es nicht,[...] private procedure HandleMessage(var Message: TWMCopyData); [...] var Form1: TForm1; implementation function InstallHooks(Hwnd: THandle;OwnHwnd:Cardinal): Boolean; stdcall; external 'WndMsgSniffer.dll'; function UninstallHooks: Boolean; stdcall;external 'WndMsgSniffer.dll'; {$R *.dfm} //ipc nachrichten empfangen procedure TForm1.HandleMessage(var Message: TWMCopyData); begin listbox1.items.add(IntToStr(Message.CopyDataStruct.dwData)); end; procedure TForm1.FormCreate(Sender: TObject); var Targethandle: Thandle; begin //nur zum testen Targethandle:= FindWindow(PChar('Notepad'),PChar('Unbenannt - editor')); SetForegroundWindow(targethandle); if InstallHooks(Targethandle,application.handle) then //Hooks installieren. ShowMessage('Installed Successfully.'); end; in der listbox wird leider reingarnix eingetragen, nein ich bekomme selbst nicht mal die "Installed Successfully" nachricht. bin jetzt verzeifelt.........was habe ich falsch gemacht?? danke für weitere antworten. |
Re: Fensterbotschaften(Window Messages) auslesen
schau dir mal die hilfe zu "SetWindowsHookEx" an und vor allem den letzten parameter. Zudem sollte dir klar sein das bei einem Hook die DLL in jedem Prozess erneut geladen wird wird. Somit geht es nicht das du innerhalb der DLL einfach an das Window nachrichten schickst was in einer anderen DLL instanz gesetzt wurde. Denn dieses Handle wurde eben in einer anderen DLL instanz gesetzt und nicht in jeder.
|
Re: Fensterbotschaften(Window Messages) auslesen
sry ich werd nicht ganz draus schlau...ich werd mir mal das tut von olli reinziehen.
aber irgendwie komme ich nicht weiter. |
Re: Fensterbotschaften(Window Messages) auslesen
Hallo Metal_Snake2,
Du musst im hook irgendwo an das Handle Deines Programms kommen, damit SendMessage überhaupt eine Wirkung hat (oder steckt das schon in ApplicationHandle ?). Um Dir IPC zu ersparen, kannst Du das Handle des Spys ja irgendwo in der Registry ablegen. Ist vielleicht nicht all zu schön, aber der Zweck heiligt ja bekanntermaßen die Mittel :-). Außerdem musst Du aufpassen, dass der Hook in Deinem Spy keine Nachrichten versendet, sonst wirst Du endlos mit Nachrichten bombardiert... Was Du mit HandleMessage machst, verstehe ich nicht? Ich hätte das wie folgt gelöst:
Delphi-Quellcode:
Grüße peanut.
[...]
private procedure WndProc(var Message:TMessage); override; [...] procedure TForm1.WndProc(var Message:TMessage); begin if Message.Msg = WM_COPYDATA then begin Memo1.Lines.Add('WM_COPYDATA'); [...] end; inherited; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz