Allah rızası için WindowsHookEx
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Allah rızası için WindowsHookEx
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
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
Re: Allah rızası için WindowsHookEx
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.
ü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.
Re: Allah rızası için WindowsHookEx
Basit bir hook örnegi, amacı internet explorer üzerindeyken sag dügmeyi engelliyor, TWebbrowser ile kullanıyorum.
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.
Programı kapatırken artık hook a ihtiyacımız kalmıyor ve eski haline döndürüyoruz
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
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*)
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()) ;
Kod: Tümünü seç
if MouseHook <> 0 then UnHookWindowsHookEx(MouseHook) ;
Aşagıdaki linkten teknik bilgi alabilirsiniz.
http://msdn.microsoft.com/en-us/library/ms997537.aspx
Re: Allah rızası için WindowsHookEx
cevabınız için teşekkür ederim.
Cevabınıza göre şöyle bbirşey hazırladım.
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?
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;
yani kancayı doğru yere atamadık

neden olabilir acaba?
Re: Allah rızası için WindowsHookEx
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.
Sistem için geçerli olmasını istiyorsan 0 kullanmalısın.
Re: Allah rızası için WindowsHookEx
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


şu şekilde kullandım

hehehe


bu da bişeydir e azıdan programın dışına çıktım


kodun tümü bu. nerde hata yapmış olabilirim.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.

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.
- 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
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.
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.
Re: Allah rızası için WindowsHookEx
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.
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.
- 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
Evet DLL olması gerekiyor.
Re: Allah rızası için WindowsHookEx
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
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
Re: Allah rızası için WindowsHookEx
evet hakıylmışsınız forma ait bileşeni kaldırınca düzeldi.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
Kod: Tümünü seç
ve Result:=1
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;