邓全才 李军红 李鸿强 赵书银
(河北建筑工程学院,河北张家口075000)
钩子是Windows操作系统中非常重要的一种系统接口,用它可以轻松截获并处理在其他应用程序之间传递的消息,钩子技术可以获取各类键盘输入信息,本文使用VC++6.0通过Socket通信技术和Windows Hook的消息拦截技术,实现了对远程计算机隐蔽监控窗口及实时监视键盘输入信息的程序.
Windows操作系统是建立在事件驱动机制之上的,系统各部分之间的沟通也都是通过消息的相互传递而实现的.钩子机制可以看作是一个中转站,他可以插入消息系统,重新控制系统发出的消息和传递,利用钩子可以拦截系统发给应用程序的消息[1].
如果想要捕获和记录在其他计算机上任意窗口的键盘输入信息,需要采用全局钩子来拦截整个系统中的键盘消息和窗口创建消息.全局钩子处理函数必须以MFC DLL(动态链接库)的形式加载,在VC++6.0中有三种形式的DLL,本程序采用的是标准静态链接MFC DLL.本程序采用客户机/服务器工作模式,客户端为监控端,服务器端为被监控端[1].
本程序的最终目的是实现对远程计算机上的键盘输入信息实时监控,程序的主要功能如下[2][3]:
1)目标主机开机后能够自动启动服务器端.
2)目标主机程序上定义了快捷键能使程序窗口显示和隐藏.
3)目标主机程序上有退出按钮和卸载自动启动功能.
4)目标主机接入网络后,目标主机就进入等待连接的状态,随时等待远程客户端的连接,连接后客户端能够控制钩子的装入,以便监控目标主机的键盘输入信息.
5)够捕捉目标主机打开窗口的信息,能够清楚被监控者当前处于什么样的窗口下进行键盘的输入,例如word文档,txt文档或IE浏览器.
6)记录目标主机键盘输入的数据.在获得键盘输入情况的同时,在监控端能把目标主机端键盘输入的信息记录到一个文本文档里.
在程序中采用基于客户机/服务器的模式进行通信,并应用Socket技术完成监控端和被监控端的通信.通信模型如图1所示.
服务器端的程序设计如图2所示,其中包括主程序的初始化、钩子程序的启动、钩子程序的卸载3个阶段[4][5].
1)主程序的初始化阶段.在该阶段包括注册表的写入、通信线程的建立、快捷键后门.
第一、注册表的写入:在程序的启动时会自动通过代码将程序的路径写入到注册表的开机启动项中.程序在启动后运行窗口是隐藏的.这样以后被监控的目标机子在每次开机启动时程序会自动后台运行.
第二、通信线程的建立:在程序的启动时会建立一个通信的线程.在通信线程中会利用程序创建的套接字,并请求系统为其分配一个端口,然后等待客户机发起连接.建立连接后该线程能随时接收来自客户端发出的指令信息.
第三、快捷键后门:在程序的运行时,程序会定义快捷键后门.通过快捷键能让在被监控主机上的程序窗口显示和隐藏.
2)子程序的启动:在服务器端程序初始化后,建立的通信线程可以随时接收来自客户端的指令.当收到“打开监控”指令后服务器端会自动加载钩子程序,开始监控键盘的输入信息.当有键盘消息按下时,键盘钩子会自动记录下所按下键盘的信息,然后通过消息传递机制启动监控程序的通信,将键盘的消息传送给客户端.
3)子程序的卸载:在服务器端的通信线程收到“终止监控”命令后会自动卸载钩子程序,不在对目标机进行监控,同时也断开课服务器端和客户端的连接.在客户端的实施方案框架的流程如图3所示.
在发出连接请求客户端成功和服务器端建立连接后,客户端会创建一个通信线程开始和服务器端进行通信,然后客户端能向服务器端发送“打开监控”的命令.在接收到服务器端发送过来的信息时,会将信息写入到一个文本文档里进行保存.在不在对服务器端进行监控的时,可以向服务器端发送“终止监控”命令,同时断开与服务器端的连接,不再对服务器端进行监控.
准备两台可以相互通信的计算机C和S,在计算机S上安装被监控端,在计算机C上安装监控端.
在完成监控端和被监控端的安装后重新启动计算机S,被监控端将自动运行,此时程序在运行之初是隐藏的,通过热键让服务器端显示,测试效果如图4所示.
可以通过点击卸载自动启动按钮使开机自动启动项消失,同时也可以点击退出按钮使程序退出.
服务器端成功启动后,在计算机C上打开监控端,并点击“建立连接”按钮,完成与服务器的连接.客户机和服务器成功建立连接后,在计算机S上依次打开文本文档、Word文档、浏览器以及飞信,输入相关内容进行测试.
在计算机S上输入信息的同时,客户端能够根据按键的次序来判断服务器端所输入的字符信息,实验结果如图5所示.
通过图5发现,计算机S在文本文档下输入了:“this is a test”;在Word文档下输入了:“This is a test”,其中按下空格键用“space”来识别,在浏览形式下登陆了QQ邮箱,其中用户名为:1015210092,密码为:199009112815,并使用了“tab”键;登陆飞信时用户名为:13473300854.密码为:mxl09ll,并使用了“tab”键.针对上述实验分析表明,监控端可以确定服务器端打开的窗口类型和输入的键盘信息.
本论文对Hook技术、Windows消息机制工作原理及远程控制的关键技术进行系统的研究,重点对键盘信息的监控、受控端与控制端通信进行剖析,应用VC++6.0设计并实现了对远程计算机的键盘输入信息进行有效实时监视的系统,对于研究Hook技术具有一定的参考价值.本文只是针对Hook技术进行技术上的探讨和研究,切勿利用Hook技术进行窃取别人帐号和密码信息等非法活动.
[1]王仁明,张永.利用Windows Hook技术监控计算机的使用[J].计算机安全,2003,6
[2]倪步喜.Windows的钩子技术及实现[J].计算机与现代化,2007,1
[3]殷振岭,商书风.Windows系统钩子与键盘监控[J].网络与计算机技术,2004,5
[4]熊志勇.利用Hook技术实现屏幕热区[J].编程与应用起步,2002,12
[5]孙朝晖.基于木马的计算机远程控制研究与实现[D].同济大学,2007,5