扫描器可划分为4个功能模块:扫描模块、截包模块、分片模块及发送模块。系统结构如图2(上)所示。
如图2所示,用户通过人机交换模块对相关的扫描参数和目标网络信息进行配置,扫描分析模块根据这些信息,发送针对目标网络的扫描数据包。数据包在流经本地网卡时被截包模块截取,传递给分片模块进行分片重叠处理,之后发送至目标系统。所得信息回传至扫描分析模块进行分析整理,最终将扫描结果通过人机交互模块显示在界面上。
这里没有将扫描数据包直接分片,而是将其在流经网卡时截取下来再进行处理。这一方法的好处是一方面避免了在windows环境下使用原始套接字构造数据包的复杂过程,另一方面使整个系统更加模块化。由于不需要修改数据包的发送方法,直接集成截包和分片模块即可实现分片重叠功能,扫描器的主要功能模块可以直接参考普通扫描器的实现设计。其他需要实现隐蔽相同功能的系统也可以很方便地集成相应的功能模块。
(三)截包模块的原理及实现
“截包”不同于“抓包”,后者只是简单复制流经网卡的数据包然后进行分析,现有的很多工具都可实现,比如Winpcap等;截包”则是在复制数据包的同时拦截使其不能发送至目的地。复制的数据经过处理后再发送出去,从而实现敏感信息的隐藏。
截包模式一般分为用户态网络数据包拦截方式和驱动程序拦截网络数据包方式。用户态技术包括WinsockLayeredServiceProvider和Windows 2000包过滤接口。驱动程序技术包括TDI过滤驱动、NDIS中间层驱动、Win2K Filter-Hook Driver、NDIS Hook Driver。用户态下拦截数据包有一些局限性,在用户态下拦截数据包只能在Winsock层次上进行,对于网络协议栈中底层协议的数据包无法进行处理。截包模块希望在应用层中获得一个通用的处理方式,应该在IP层之下进行拦截。综合比较,驱动程序拦截方式中的NDIS中间层驱动模式较为适合。
截包模块示意图如3所示,接收报文时,网络接口首先接收,中间层截取后,通过2送到应用层处理。之后送回中间层处理结果,选择将处理后的报文通过1送到IP协议及上层应用程序,或者丢弃该报文。
发送报文时,上层应用程序通过IP协议发送数据到网络接口,过程中报文被中间层截取,通过2送到应用层处理,之后送回中间层处理结果,中间层选择丢弃该报文,或者将处理后的报文发送到网络上。具体模快流程如图1和图4所示。
(四)分片重叠模块的实现
分片重叠模块的工作原理是TCP/IP协议中分片重叠部分的内容,因此该模块的实现较为简单,关键是如何采用简单高效的方法实现功能。
本模块的实现思想是将截取IP包的数据段分割成规定长度的若干段,再将每一段数据封装成一个IP包,这些包的IP包头信息大多直接复制原始数据包的包头信息,但包长、校验和以及OFFSET、MF两个标志位需要重新赋值。这些IP包就成为原始IP包的分片包。分片包以链表的形式进行存储。这样,模拟分片包在传输过程中的乱序和重发现象,只需基于该链表进行简单的处理即可实现。最后,这些分片包也将按照链表中的次序进行发送。
这里,需要对分片包重叠的实现进行简要的说明。我们通过在两个分片包中间插入数据段为blank的数据包(称为空白包)来简单地实现这一功能。如图5所示,这些空白包被精心构造为原始数据包的一个分片,而其OFFSET段的值则与已存在的分片包重复。如前文所述,不同的操作系统对重叠的分片在重组时有不同的处理方式,因此需要特别注意空白包在分片包链表中的位置。对于采用新数据重组的操作系统,空白包需插入到正确分片之前;对于采用旧数据重组的操作系统,空白包需插入到正确分片之后。这样,既可以最大限度地混淆目标系统的网络防护系统,又不会影响目标系统对数据包的正确重组。