2004年2月到7月,我们用VC6.0开发了一个小型项目。下面整理一下主要技术,希望各位同仁批评指正。
一、键盘挂钩程序
在此之前,我做了一个键盘记录程序。是参考《编程技巧与维护》某一期的一片文章写的。使用了全局Hook技术,程序由keyexe.exe和keydll.dll两个文件组成,功能就是简单地记录击键字符和每次被激活窗口的标题及IE地址栏内容,存放到一个文件中,后来又增加了两个功能:在密码编辑框中有字符输入的时候,把屏幕截取下来,同时提示这是密码。
Windows的消息处理机制为了能在应用程序中监控系统的各种事件消息,提供了挂接各种反调函数(HOOK)的功能。这种挂接函数类似扩充中断驱动,系统产生的各种消息首先被送到各种挂接函数,挂接函数根据各自的功能对消息进行监视、修改和控制等,然后交换控制权或将消息传递给下一个挂接函数以致最终达到窗口函数。WINDOWS系统的这种反调函数挂接方法虽然会略加影响到系统的运行效率,但在很多场合下是非常有用的。
挂接函数可以是用来监控所有线程消息的全局性函数,也可以是单独监控某一线程的局部性函数。如果挂接函数是局部函数,可以将它放到一个.DLL动态链接库中,也可以放在一个局部模块中;如果挂接函数是全局的,那么必须将其放在一个.DLL 动态链接库中。
在这个程序中,挂接了三种过滤函数:WH_CBT、WH_KEYBOARD 、WH_GETMESSAGE,实现的功能分别是:记录被激活的窗口标题,如果窗口类名是IE...则用FindWindowEx得到URL;记录击键字符;标记密码框的输入。
上面提到过,keydll.dll要于用户在密码框中有输入时把整个屏幕截取下来。这个功能的实现,我是直接去网上寻找源代码,略加修改,使抓取的位图每个像素只有一个字节的数据。
这就是我的程序的第一个版本。
我写程序的时候,遇到一些问题就去网上找现成的源代码,懒得自己去钻研。问题解决了也很少再去分析这些源代码的原理。以至于
我总是怀疑自己,虽然写了这么多程序,但真正属于自己的有多少呢?
二、进程隐藏
我要使这个键盘记录函数在