您好,欢迎来到360论文服务中心!设为首页 | 加入收藏

360论文服务中心

客服中心

全国咨询电话:18810141013

QQ :点击这里给我发消息 80017332

 点击这里给我发消息 634602927

手机:18810141013

邮箱:634602927@qq.com

短信:18810141013

本站介绍

360论文服务中心是最受欢迎的论文发表与论文编辑服务网站。

360论文服务中心于2000年创建,注册用户量已突破152万人,并帮助近380万人次顺利发表论文。14年来,360论文服务中心始终遵循热情快捷、安全可靠的服务宗旨,深受广大网民青睐。360论文服务中心主要设有论文发表部、论文创作部、期刊合作部、论文采编部、技术运营部和市场推广部等多个部门,是目前国内论文行业,规模最大、服务人员最多的正规网站。

创作发表说明

1. 如果您没有论文,还要评定职称,需要发表论文,请联系我们,客服人员会及时处理;

2. 教授、博士组成的论文指导团队,专业打造高品质论文;

3. 合作期刊,全国最全,与杂志社关系稳定,保证刊期。

360论文服务中心 > 论文写作 > 理工毕业论文 > 计算机论文 >

电子文档保护系统WINDOWS HOOK技术的研究

2016-04-24 18:40 字体:   打印 收藏 

2.2.1  动态链接库
(1) 动态链接
动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。换句话说,函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生的重定位 信息,Windows才转去执行DLL中相应的函数代码。
(2) 动态链接库
动态链接库(Dynamic Link Library,缩写为DLL)是一个包含可由多个程序同时使用的代码和数据的库,是各个库的资源和函数的集合。DLL不是可执行文件,但相对独立,有自己的模块句柄和自己的资源。多个模块可以使用一个DLL模块。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 是一个包含可由多个程序同时使用的代码和数据的库。
(3) 动态链接库的特点
动态链接库使资源数据独立于可执行的应用程序之外,但又能较方便快速地访问它。在DLL中旋转函数减小了每个组件的尺寸,降低应用程序各模块的代码量,节省了安装、存储和传输的文件数据量。提高硬盘、光盘空间利用率。允许同步开发DLL和EXE,软件升级更为简单。减低系统内存空间的开销。由于程序是在运行时动态加载,因此动态链接库中的程序代码只在程序运行时才加载到内存中,从而节省了系统运行的内存空间。不同应用程序可共享DLL,有利于软件打包和分发。
一般情况下,如果一个应用程序使用了动态链接库,Win32系统保证内存中只有DLL的一份复制品,这是通过内存映射文件实现的。DLL首先被调入 Win32系统的全局堆栈,然后映射到调用这个DLL的进程地址空间。在Win32系统中,每个进程拥有自己的32位线性地址空间,如果一个DLL被多个进程调用,每个进程都会收到该DLL的一份映像[14,15]
2.2.2  钩子函数
钩子技术是WINDOWS的主要特性之一。利用它们,可以捕捉自己进程或其它进程发生的事件。通过“钩挂”,可以给WINDOWS一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生程序感兴趣的事件时,WINDOWS都将调用该函数。系统中使用钩子技术来捕获用户对文档的操作,从而实现对文档的保护和控制。
钩子函数的工作原理:创建一个钩子时,WINDOWS会先在内存中创建一个数据结构,该数据结构包含了钩子的相关信息,然后把该结构体加到已经存在的钩子链表中去。新的钩子将加到老的前面。当一个事件发生时,假如安装的是一个局部钩子,进程中的钩子函数将被调用。假如是一个远程钩子,系统就必须把钩子函数插入到其它进程的地址空间,要做到这一点要求钩子函数必须在一个动态链接库中,所以想要使用远程钩子,就必须把该钩子函数放到动态链接库中去[16-19]
钩子一共有十五种,下面对钩子的响应条件和功能进行简单介绍。
(1) WH_CBT Hook
在窗口变化之前、系统命令完成之前、事件从消息队列移走之前等事件发生之前被调用。主要用于CBT(Computer Based Training)请求时。这一类型的Hook特别适用于计算机辅助教学或训练软件的研发当中。挂上该Hook之后,Windows在产生、最大化、最小化、移动或缩放一个视窗时之前,或是在令一个视窗成为活动视窗之前,就会调用相应的filter函数。Windows同时也会在完成一个系统命令之前,或是在线程的硬件输入队列中移出鼠标或键盘事件之前,或是在设定输入焦点之前,或是在收到WM-QUEUESYNC消息之前,调用对应filter函数。这个Hook可以让程序监视使用者的演变发展,可以自动执行某些工作进而辅助使用者。
(2) WH_CALLWNDPROC Hook
当SendMessage被调用时响应。当一个线程调用SendMessage函数时,Windows会先检查看是否有一个WH_CALLWNDPROC型的Hook被挂在这个线程上,如果有,则调用其Filter函数。由于Windows环境中消息的发送非常频繁,所以挂上该Hook会对Windows操作系统的运行效率产生很大的影响,通常可用于软件调试(Debug)的目的。
(3) WH_DEBUG Hook
主要用于调试,同时它还可以用来通过当前的呼叫来阻止其它的Filter的响应。每当Windows将要调用一个Filter时,这一类型的Hook就会响应并被Windows调用。
(4) WH_CALLWNDPROCRET Hook
当SendMessage返回时响应。它与WH_CALLWNDPROC除了具体的响应时间不同之外,其他并无太大区别。
(5) WH_FOREGROUNDIDLE Hook
用于前台线程空闲时。即当前线程下其所属进程处于输入空闲状态时,会被Windows调用。多为Windows内部使用。如果它被用作线程指定的钩子函数的话,则是在当前线程下,没有针对当前线程的输入的情况下被响应。
(6) WH_GETMESSAGE Hook
当GetMessage()或PeekMessage()被调用时响应。虽然它同WH_CALLWNDPROC型的Hook以及WH_CALLWNDPROCRET型的Hook的响应条件不同,但有一点类似,就是会在消息的发送过程中会被调用,所以,它的使用也存在由于Windows中消息的频繁发送而对操作系统带来一定影响。
(7) WH_JOURNALPLAYBACK Hook
当从系统队列中询问一个输入事件时被响应。例如有键盘或鼠标事件时,可用它来做相应的记录或播放。它可以用来模拟鼠标或者键盘的输入,例如在Microsoft Excel中,就使用了这一Hook来实现它的SEND.KEYS这一功能函数。
(8) WH_JOURNALRECORD Hook
当从系统队列中移走事件时被调用。这一类型的Hook与上面的WH_JOURNALPLAYBACK有很多共同之处,只不过它多被用于记录,而WH_JOURNALPLAYBACK则多被用于播放或模拟。
(9) WH_KEYBOARD Hook
当消息队列中GetMessage()或PeekMessage()响应事件为WM_KEYUP、WM_KEYDOWN、WM_SYSKEYUP、WM_SYSKEYDOWN或者WM_CHAR时被调用。如果是特定线程中使用的话,则要求待响应的消息必须是指定线程的消息队列中的。
(10) WH_MSGFILTER Hook
当对话框、菜单及滚动条将处理消息时响应。此外,当用户按下ALT+TAB键或ALT+ESC键的时候,如果已经设置了WH_MSGFILTER型Hook,Windows也会激活这一类型的Hook。常见的一种应用,就是可以通过使用这一类型的Hook,针对对话框、菜单、消息框等来提供F1帮助功能。
(11) WH_KEYBOARD_LL Hook
当键盘输入事件将被送往一个线程的输入队列中时被调用。
(12) WH_MOUSE Hook
当消息队列中GetMessage()或PeekMessage()接收事件鼠标消息时被调用。例如,若想让使用者知道如何使用所开发的某一软件,可以在该软件中挂上一个WH_MOUSE型Hook,即使在程序没有得到鼠标的捕捉权时,程序也能够检测到鼠标移动和鼠标的按键状态。当使用者将鼠标移动到屏幕上某个元素,如系统选单、标题栏、滚动轴时,由相应的过滤函数来判断鼠标目前的位置,并显示一些说明文字到说明视窗中,从而达到教学目的,同时又不会与正常的鼠标动作的处理有任何冲突。
(13) WH_MOUSE_LL Hook
当鼠标输入事件将被送往一个线程的输入队列中时响应。
(14) WH_SHELL Hook
当要激活一个窗口或者创建以及取消一个窗口时响应。这类型的Hook通常是针对当前窗口而言的。
(15) WH_SYSMSGFILTER Hook
为全局hook,响应条件与WH_MSGFILTER大致相同。
以上类型中,除WH_SYSMSGFILTER、WH_JOURNALRECORD及WH_JOURNALPLAYBACK仅为全局Hook外,其他即可为线程也可为全局Hook。而除了WH_JOURNALRECORD及WH_JOURNALPLAYBACK以外,使用其他类型的Hook时,若Hook是全局钩子,则需将钩子函数包含在一个独立的DLL中[20-23]
总体上,Hook可分为local hook(本地钩子)及remote hook(远程钩子)。local hook对自己进程中发生的事件进行监视,而remote hook则监视其他进程中所发生的事件。在remote hook中,又可分为Thread Specific(线程专用)和System-Wide(全局)两种类型。线程专用Hook监视的是发生在其他进程中的指定线程中的事件,而全局Hook则监视的是系统中所有进程中的所有线程中的指定事件。所以在选用Hook之前,首先应该了解自己要选用的是何种Hook类型。local hook影响面小,相对要安全一些。在remote hook中,相对于线程专用,全局Hook的影响面更广些,在实际使用时要小心。
本系统开发过程中使用到WH_KEYBOARD、WH_MOUSE、WH_CBT 三种。WH_KEYBOARD钩子用于捕获键盘操作消息;WH_MOUSE钩子用于捕获鼠标操作消息;WH_CBT钩子用于捕获窗口创建、销毁的消息[24-27]




联系我们

全国免费热线:400-086-0807
咨询QQ:634602927
投稿邮箱:634602927@qq.com