Allah rızası için WindowsHookEx

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
fatihbarut

Allah rızası için WindowsHookEx

Mesaj gönderen fatihbarut »

Ya arkadaşlar,
günler değil haftalardır uğraşıyorum ve ne hikmetse bulduğum hiç bir kodu da anlayadım.

Kısaca bir application ın windowsa gönderdiği bir mesajı (yani mesajlar arasından birini) yakalamak istiyorum.

kısaca şöyle->

winexec(filan program);

prosedure hook (filan program falan mesajı gönderdimi bakbakalım)

if filan program falan mesajı gönderdiyse göbek at;

yani şu kodu yazamadım.

Varsa bi Allahın kulu yardım etsin yahu...

dll ler içinde boğuldum kaldım.

sevgiyle ve sağlıcakla kalın bir dahaki programda görüşmek dileğiyle
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Allah rızası için WindowsHookEx

Mesaj gönderen Lost Soul »

arkadaş içtenlikle düşüncelerini yazmış.
üstelik şu an bu düşüncelere ben de haizim.
Bir mubarek şahsiyet biraz bilgi verirse arkadaşınkinin üzerine benim dualar da eklenir :)
forumda her mesajın dibinde forumda aratırsan hook hakkında bilgi bulabilirsin diyor ama aratınca tek bulduğum şey
"forumda aratırsan hook hakkında bilgi bulabilirsin" oluyor :)
bilgi nereye kaçmış bulamadım :)
Yani dll dosyalarında
örneğin keyboard'a hook atıyor. tutup sonra veriyi dosyaya yazıyor. vs.

hook nasıl atılır. ne zaman çalışır. döngü mü gerekir kendi mi çalışır.
hook ile elde edilen birlgiye nasıl müdahale edilir.
ille de hook atmak için dll yapmak mı lazım.
programdan hook atıp kullanmaz mıyım.
vs. vs.
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Allah rızası için WindowsHookEx

Mesaj gönderen emin_as »

Basit bir hook örnegi, amacı internet explorer üzerindeyken sag dügmeyi engelliyor, TWebbrowser ile kullanıyorum.

Kod: Tümünü seç

var
  mousehook : HHook; // Önceki hook bilgilerini saklıyoruz

function MouseProc(nCode: Integer; wParam, lParam: Longint): LongInt; stdcall;
var
  classbuf: array[0..255] of Char;
const
  ie = 'Internet Explorer_Server';
begin
  case nCode < 0 of
    True:
      Result := CallNextHookEx(MouseHook, nCode, wParam, lParam) ;
    False:
      case wParam of
      WM_RBUTTONDOWN, WM_RBUTTONUP:
      begin
        GetClassName(PMOUSEHOOKSTRUCT(lParam)^.HWND, classbuf, SizeOf(classbuf)) ;
        if lstrcmp(@classbuf[0], @ie[1]) = 0 then
          Result := HC_SKIP
        else
          Result := CallNextHookEx(MouseHook, nCode, wParam, lParam) ;
      end
      else
      begin
        Result := CallNextHookEx(MouseHook, nCode, wParam, lParam) ;
      end;
    end; //case wParam
  end; //case nCode
end; (*MouseProc*)
Bu basit bir fonksiyon, tek yaptıgı sag dügmeyle tıklanırsa, internet explorer olup, olmadıgına bakıyor.

Hook u çalıştırmak için windows apisinden ilgili çagrıyı yapmak gerekiyor.

Kod: Tümünü seç

  //   Mouseproc    hook için yazdıgımız fonksiyon
  // mousehook ise önceki hook fonksiyonun adresi
  MouseHook := SetWindowsHookEx(WH_MOUSE, MouseProc, 0, GetCurrentThreadId()) ;
Programı kapatırken artık hook a ihtiyacımız kalmıyor ve eski haline döndürüyoruz

Kod: Tümünü seç

  if MouseHook <> 0 then UnHookWindowsHookEx(MouseHook) ;
Bu tür hook fonksiyonları alt düzey işlemlerdir ve windows mesaj yapısını iyi bilmeli ve dikkatli kod yazmalısınız.
Aşagıdaki linkten teknik bilgi alabilirsiniz.
http://msdn.microsoft.com/en-us/library/ms997537.aspx
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Allah rızası için WindowsHookEx

Mesaj gönderen Lost Soul »

cevabınız için teşekkür ederim.
Cevabınıza göre şöyle bbirşey hazırladım.

Kod: Tümünü seç

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  myHook : HHook;

implementation

{$R *.dfm}

function myKeyProc(nCode: Integer; wParam, lParam: Longint): LongInt; stdcall;
Var
  xKey : byte;
Begin
  if nCode<0 then
  Begin
    Result:=CallNextHookEx(myHook,nCode,wParam,lParam);
  End
  else
  Begin
    if ((lParam and KF_UP)=0) and (wParam>=65) and (wParam<=90) then
    begin
      xKey:=wParam;
      form1.Memo1.Lines.Text:=form1.Memo1.Lines.Text+chr(xKey);
      CallNextHookEx(myHook,nCode,wParam,lParam);
    end;
  End;
End;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if myHook <> 0 then UnHookWindowsHookEx(myHook) ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 myHook := SetWindowsHookEx(WH_KEYBOARD, myKeyProc, 0, GetCurrentThreadId()) ;
end;
yukarıda ki kod projeme ait pencerede isteneni yapıyor ancak diğer pencereler aktifken çalışmıyor.
yani kancayı doğru yere atamadık :)
neden olabilir acaba?
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Allah rızası için WindowsHookEx

Mesaj gönderen emin_as »

GetCurrentThreadId() fonksiyonunu kullanırsan, hook sadece ilgili thread için geçerli olur.
Sistem için geçerli olmasını istiyorsan 0 kullanmalısın.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Allah rızası için WindowsHookEx

Mesaj gönderen Lost Soul »

myHook := SetWindowsHookEx(WH_KEYBOARD, myKeyProc, HInstance, 0{GetCurrentThreadId()}) ;
şu şekilde kullandım :)


hehehe :) notepad da klavyeye basınca notepad hata veriyor :)
bu da bişeydir e azıdan programın dışına çıktım :)
Resim

Veri Yürütme Engellemesini AnlamaVeri Yürütme Engellemesi (DEP), yalnızca Windows ve diğer programlar tarafından kullanılması gereken bellek konumlarından zararlı kodlar çalıştırarak (yürüterek) hasar oluşturabilecek virüs ve diğer güvenlik tehditlerine karşı bilgisayarınızın korunmasına yardımcı olur. Bu tür tehditler, program tarafından kullanılan bir veya birkaç bellek konumunu ele geçirerek zarar verir. Ardından, diğer programlara, dosyalara ve hatta e-posta kişilerinize yayılarak bunlara da zarar verebilir.

Güvenlik duvarı veya virüsten korunma programlarından farklı olarak, DEP zararlı programların bilgisayarınıza yüklenmesini önlemeye yardımcı olmaz. Bunun yerine, programlarınızı izleyerek sistem belleğini güvenli bir şekilde kullanıp kullanmadıklarını belirler. Bunu yapmak için DEP bağımsız olarak veya uyumlu mikro işlemcilerle birlikte çalışarak bazı genel bellek konumlarını "yürütülemez" olarak işaretler. Bir program korunan bir konumdan —zararlı veya zararsız— bir kod çalıştırmayı denediğinde, DEP programı kapatır ve size haber verir.

DEP yazılım ve donanım desteğinden yararlanabilir. DEP'yi kullanmak için, bilgisayarınızda Microsoft Windows XP Service Pack 2 (SP2) veya daha yenisi ya da Windows Server 2003 Service Pack 1 veya daha yenisi çalışıyor olmalıdır. DEP yazılımı tek başına belirli türden zararlı kod saldırılarına karşı koruma sağlanmasına yardımcı olur, ancak DEP'nin sunabileceği korumadan tam olarak yararlanabilmek için işlemcinizin "yürütme koruması" desteği sağlaması gerekir. Bu, bellek konumlarının yürütülemez olarak işaretlenmesi için tasarlanmış donanım tabanlı bir teknolojidir. İşlemciniz donanım tabanlı DEP desteği sunmuyorsa, yürütme koruma özellikleri sunan bir işlemciye yükseltme yapılması önerilir.
kodun tümü bu. nerde hata yapmış olabilirim. :)

Kod: Tümünü seç

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  myHook : HHook;

implementation

{$R *.dfm}

function myKeyProc(nCode: Integer; wParam, lParam: Longint): LongInt; stdcall;
Var
  xKey : byte;
Begin
  if nCode<0 then
  Begin
    Result:=CallNextHookEx(myHook,nCode,wParam,lParam);
  End
  else
  Begin
    if ((lParam and KF_UP)=0) and (wParam>=65) and (wParam<=90) then
    begin
      xKey:=wParam;
      form1.Memo1.Lines.Text:=form1.Memo1.Lines.Text+chr(xKey);
      CallNextHookEx(myHook,nCode,wParam,lParam);
      Result:=0;
    end;
  End;
End;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if myHook <> 0 then UnHookWindowsHookEx(myHook) ;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 myHook := SetWindowsHookEx(WH_KEYBOARD, myKeyProc, HInstance, 0{GetCurrentThreadId()}) ;
end;

end.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Re: Allah rızası için WindowsHookEx

Mesaj gönderen Murat DİCLE »

vERDİĞİNİZ ÖRNEKLERDEKİ KANCALAMAYI SİSTEM GENELİNE YAPACAKSANIZ,

Bunu bir DLL içine koymanız gerekmektedir. Bu sitede buna örnek verilmiştir. Başka şekillerde kancalamada yapılıyor ama biraz karışık, o nedenle hazır kütüphanelerden faydalanabilir. Bir programın çalışmasını engellemek. Bir portu ebediyen kapatmak. Web filtre vb. herşeyi kancalama ile yapabilirsiniz.

System Wide Hook, şeklinde bir araştırma yapınız. Bu tip kancalar her zaman DLL içinde olmalıdır. Ki her programa ayrıca enjekte edilebilsinler. Vista ve Windows 7 ile birlikte kancalama biraz daha zorlaştı. Ama bir kaç değişiklikle mümkün.

-- DLL ile ana programınız arasında haberleşmeye ihtiyacınız olacaktır. Bu size zor anlar yaşatabilir. Vista ve Windows 7'de Postmessage fonksiyonu (sanırım) başka uygulamadan başka uygulamaya yemiyor. Bu yeni işletim sistemlerinde güvenliği arttırmışlar. IPC mesajlaşmayı araştırın.

-- Bu işletim sistemlerinde Hook yapmak için enjektör programın YÖNETİCİ OLARAK çalıştırılması gerekmektedir. Tabi eğer SystemWide (sistem geneline) olarak kancalama yapacaksanız.

-- Bu tip işlerle ilgileniyorsanız, sık sık sisteminizin çökmesiyle karşılaşacaksınız. Tavsiyem, sanal PC kullanın. MS Virtual PC, SUN VirtualBox vb.

-- Windows XP SP1 ve SP2 ve SP3 , Windows Vista ve Windows 7 'de kancalamalar farklılık gösterebiliyor. Ne için neye kanca atacağınıza bağlı olarak. Her işletim sistemindeki benze API parametreleri diğerinde farklı ve değişmiş olabiliyor çünkü.

-- Son olarak MS Virtual PC'de Windows 7 yüklemeyin yüklenmiyor. Bunun yerine VirtualBox'u kullanın.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Allah rızası için WindowsHookEx

Mesaj gönderen Lost Soul »

murat hocam. Cevabınız için teşekkür ederim.
Aslında amacım keylogerdan ziyade Klavye tuşlarını değiştirme. mesajımdaki işi yapmak.
bu işe en yatkın kod da yukarıda yazdığım keylogerdan bozma kod.

mesajınızdan anladığım kadarıyla dll windows'un ortalığı velveleye vermesinin sebebi dll den değil de apllication içinden kodu çalştırmam. doğru mudur?
bi de dll den deneyeyim. :)

bu arada Klavye tuşlarını değiştirme. konusunda bir tavsiyeniz var mı acaba.
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Re: Allah rızası için WindowsHookEx

Mesaj gönderen Murat DİCLE »

Evet DLL olması gerekiyor.
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Allah rızası için WindowsHookEx

Mesaj gönderen emin_as »

Programın hata vermesinin nedeni, hook içinde form1 e ait bileşenleri kullanıyorsun. Eger o bölümü silersen hook çalışır. Post message larla programa bilgi göndermeyi deneyebilirsin, yine de en sorunsuzu dll içinde bu işlemlerin yapılmasıdır.

Bu tür hook işlemleri genellikle ugraştırır, çalışanlar örnekler üzerinden daha rahat işlem yapabilirsin.

Aşagıdaki örneklerin faydası olur diye düşünüyorum.

http://delphi.about.com/od/windowsshell ... sehook.htm
http://delphi.about.com/od/kbwinshell/a/delphi_hook.htm
http://delphi.about.com/od/windowsshell ... d_hook.htm
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Allah rızası için WindowsHookEx

Mesaj gönderen Lost Soul »

emin_as yazdı:Programın hata vermesinin nedeni, hook içinde form1 e ait bileşenleri kullanıyorsun. Eger o bölümü silersen hook çalışır. Post message larla programa bilgi göndermeyi deneyebilirsin, yine de en sorunsuzu dll içinde bu işlemlerin yapılmasıdır.

Bu tür hook işlemleri genellikle ugraştırır, çalışanlar örnekler üzerinden daha rahat işlem yapabilirsin.

Aşagıdaki örneklerin faydası olur diye düşünüyorum.

http://delphi.about.com/od/windowsshell ... sehook.htm
http://delphi.about.com/od/kbwinshell/a/delphi_hook.htm
http://delphi.about.com/od/windowsshell ... d_hook.htm
evet hakıylmışsınız forma ait bileşeni kaldırınca düzeldi.

Kod: Tümünü seç

ve Result:=1 
diyince de bütün tuşlara baılmayı engelledi.

Kodun en sade hali aşağıdaki gibi.
şimdi burada nasıl birşey yapmalıyım ki. A harfine nasıldığında basılan tuşu değiştirip B yapsın.

Kod: Tümünü seç

function myKeyProc(nCode: Integer; wParam, lParam: Longint): LongInt; stdcall;
Var
  xKey : byte;
Begin
  if nCode<0 then
  Begin
    myKeyProc:=CallNextHookEx(myHook,nCode,wParam,lParam);
    
  End
  else
  Begin
    if ((lParam and KF_UP)=0) and (wParam>=65) and (wParam<=90) then
    begin
      xKey:=wParam;
//    eğer key =a ise key =b gibi bi kod yazmam gerekiyor ama bunu 
//    @wparam:= hedehödü şeklinde mi yapmalıyım 
//   yoksa
//   Result:= wparam,lparam vsvs şeklinde mi
    end;
    CallNextHookEx(myHook,nCode,wParam,lParam);
    myKeyProc:=0;
 
  End;
End;
Cevapla