本文将详细讨论一个键盘监视器的C++/c#开发过程并针对反窥探提出一些建议,希望读者理解基于钩子技术的窥探软件的工作原理以便更好地对自己的软件加以保护。
(资料图片)
基于软件的键盘事件记录器是一个严重的安全威胁,因为它们通过捕获击键操作来监控用户的行动。监控器可以用于一些恶意的行为,诸如盗窃信用卡号码等。击键记录器是Trojans病毒的个基本组成部分,它们在后台安静地运行。伺机捕获用户的击键操作。击键事件被保存在经过良好隐藏的文件中,通过电子邮件或者FTP方式发送给窥探者。下面是一个简单的、直接使用钩子技术实现的例子。
键盘监视器体系结构
键盘监视器由3个模块组成:主模块、钩子过程和FTP模块。主模块负责安装一个全局钩子过程。该钩子的任务是把每次按键事件向主模块汇报,由主模块把所有的击键保存到一个文件中。当记录文件达到预定的大小时,主模块命令FTP模块把记录文件上载给一个FTP服务器。3个模块间的通讯是通过Windows消息机制实现的,如图1所示。
一个系统范围的钩子实际上是一个函数,它安装在当前运行的所有进程中.在被监视消息到达目标window过程之前予以监控。钩子过程用于监控系统中的各种类型的事件,例如击键,等等。可以通过调用Win:32 API函数SetWindowsHookEx来安装一个钩子过程,并指定调用该过程的钩子类型。一个WH_CBT钩子过程在窗口取得焦点并在击键事件从系统;肖息队列被清除之前调用。所有桌面应用程序都在自己的上下文中调用一个全局的钩子过程.所以该钩子过程必须驻留在一个独立于应用程序的DLL中来安装钩子过程。
一段DLL共享内存区域实际上是一个所有的DLL实例都可以看到的内存变量。主模块把它的窗口句柄保存在钩子DLL的共享内存区域中,该DLL使所有的钩子过程实例能够把窗口消息邮寄回主模块中。钩子过程共享内存区域并输出函数
函数的主模块代码如下
一个间谍程序为了防止自己被探测到,就必须隐藏好自己的踪迹。它们主要涉及3个技术区域任务管理器、防火墙、文件系统。我们在这里介绍前两个。
任务管理器盗窃
ADS(Alternate Data Streams)是一项NTFS文件系统特性,它能使你把文件数据送于存在的文件中而不影响它们的功能,资源管理器等浏览工具对它们的显示,带有ADS的文件用本地文件浏览技术几乎是不可能检测到的。一旦文件被注入该项特性,ADS即可被诸如传统的命令type等执行。在激活时.ADS执行体以原始文件的方式出现并运行可以用Windows资源管理器等进程观察器来试验。使用这种技术后,不仅能隐藏一个文件.而且能隐藏个非法进程的执行体部分。事实上,如果安装了NTFS系统,你是不可能本地探测出以ADS方式隐藏的文件的。ADS特性不能够被取消(dlsabled).目前为止还没有办法来针对用户已经对其具有存取权限的文件限制这种特性。示例程序为了简明目地没有使用ADS。你可以用下列方式手工操作ADS。
防火墙盗窃
大多数的防火墙软件都能探测和阻拦不经授权的程序接入因特网。主模块通过使用FTP模块把记录文件上载到一个FTP服务器。防火墙通过把FTP模块DLL注入到另外一个已经安装的应用程序中来实现盗窃。DLL注入意味着强制一个不能被挂起的进程必须接受一个自己从来没有要求的DLL文件。示例中,我选择把FTP模块注八或者Internet Explorer或者FireFox。DLL注入将会越过大多数防火墙软件的检测.特别在FTP服务器在监听80端口时。钩子过程DLL (它由函数SetWindowsHookEx自动加载进入所有正运行进程)检查是被装入到Internet Explorer还是FireFox并加载(用LoadLibrary)了FTP模块DLL。从DliMain中调用LoadLibrary函数是不允许的,因此DIIMain设置了一个布尔变量来让钩子过程调用LoadLibrary库函数。
下面是模块DlIMain中的钩子过程
把监视程序加入到下列注册表键处将使得它能够在系统启动时一起启动示例程序把spy.exe作为一项新注册表值加入。键盘监视的防范
下面介绍两种简单的技术来帮助你的应用程序反击基于钩子技术的键盘监视程序.具有防范监视功能的密码编辑控件。如图2所示。
免于监视的编辑控件将针对每次用户击键生成一个模拟的随机击键串。监视程序将截获用户的击键和伪击键.这样一来使它很难或者不可能检索实际的输入的文本。用户输入被存储于一个成员变量中,应用程序可以容易地通过编辑控件存取该变量的值。本例中的伪击键是通过调用Win32 APISendlnput来实现的。下面的代码实现了两个控件。一个MFC版本。一个.NET版本。
该编辑安全的控件假定函数Sendlneut生成击键的速度快于用户击键的速度,这可能导致编辑安全的控件在较慢的机器上返回错误的用户数据,特别是在运行c#实现版本时。先看VC++ MFC版本的CsafeEdlt类:
用c#实现的SafeEdit类
SpyRemover类如图3所示。
基于钩子技术的监视程序依赖于它们的钩子过程DLL。将钩子DLL从应用程序进程中移去,将使注入该应用程序的窥探程序失去窥探击键的功能。示例程序使用类SpyRemover来移去钩子DLL文件。SpyHemover构造器接收个“授权模块“的列表。如果一个模块只是装入到一个应用程序中,但是没有出现在该列表中,则被认为是没有授权的。SpyRemover通过枚举所有的应用程序进程模块来探测未经授权的模块。
小结
本文以软件保护为背景,详细讨论了一个键盘监视器的开发并针对反监视提出了一些建议。希望读者理解基于钩子技术的窥探软件的工作原理.更好地针对自己的软件加以保护
关键词: