基于NDIS中间层驱动的隐蔽通信研究与实现*

2014-05-22 02:25陆幼骊解海涛
通信技术 2014年6期
关键词:重传中间层服务端

鄢 明,陆幼骊,解海涛

(海军指军学院浦口分院,江苏 南京210000)

0 引言

随着网络防护手段日趋严密,一般情况下防火墙都会对数据包进行分析、选择和过滤[1]。因此,如果要实现隐蔽通信,就必须首先穿透防火墙[2]。传统计算机隐蔽通信方式大多数是基于HOOK的,不能从根本上解决通信数据包被防火墙截获丢弃的问题。NDIS中间层驱动技术常用于防火墙和抓包软件[3],数据包的发送和接收都需要经过中间层驱动,因此将NDIS中间层驱动技术应用于隐蔽通信,对于穿透防火墙比较理想。

为从根本上解决了防火墙穿透问题,最终实现隐蔽通信,文中提出了一种基于NDIS中间层驱动技术的隐蔽通信方法,并实现了一个通信例程。

1 NDIS中间层驱动

NDIS中间层驱动位于协议驱动和NDIS小端口驱动之间,在NDIS中起着转发上层驱动程序送来的数据包,并将其向下层驱动程序发送的接口功能[4]。NDIS中间层驱动层次关系如图1所示。

当前多数WINDOWS防火墙采用TDI层截取、分析数据包的技术[5]。而NDIS中间层驱动可以直接截获来自网络适配器来的数据包,比常见的WINDOWS防火墙更加底层[6],因此,采用NDIS中间层驱动技术实现通信,可以达到穿透防火墙通信的目的。

图1 NDIS框架Fig.1 NDIS framework

2 隐蔽通信实现方式

2.1 隐蔽通信数据流

基于NDIS中间层驱动的隐蔽通信由3部分组成,服务端、NDIS中间层驱动和客户端。数据流如图2所示。

图2 基于NDIS中间层驱动的隐蔽通信数据流程Fig.2 Convert communication data flow diagram based on NDIS intermediate driver

NDIS中间层驱动主要完成网络适配器的绑定,截获所有数据包,并且对所截获的数据包进行解析,如果是客户端发送过来的自定义协议通信数据包,则将它保存,并且激活服务端的数据等待事件,通知服务端程序来取数据。

服务端程序工作在应用层,程序初始化后,等待中间层驱动激活等待数据事件,如果事件被激活,则通过读取共享内存数据的方式,获出驱动中的通信数据包,然后进行解密、分析,再执行相应的指令,最后将执行结果加密后通过隐蔽通信通道发送给远程的客户端。

客户端程序工作在应用层,程序初始化后,等待应用层的发送给服务端的数据,当接收到发送数据后,用自定义协议对数据进行封装,并且对通信数据进行加密,最后发送给服务端,由服务端进行数据包的解析处理。

2.2 隐蔽通信设计

NDIS中间层驱动常被用于Windows防火墙设计,文中通过分析NDIS中间层驱动的原理,提出一种基于NDIS中间层驱动的隐蔽通信方式,并详细论述了实现过程。

2.2.1 NDIS中间层驱动的收发数据包原理

NDIS中间层驱动主要利用PtReceive和PtReceivePacket完成数据包的接收。数据包接收原理如图3所示。

图3 NDIS中间层驱动接收数据包原理Fig.3 Principle diagram of NDIS receives packets

当底层驱动通知接收数据包时,NDIS中间层驱动就用PtReceive或PtReceivePacket来获取完整的数据包。

NDIS中间层驱动主要利用MPSend和MPSend-Packet完成数据包的发送[7]。数据包发送原理如图4所示。

图4 NDIS中间层驱动发送数据包原理Fig.4 Principle diagram of NDIS Sending Packets

当协议驱动收到数据包后,调用NdisSend向下层发送数据报文,中间层驱动调用 MPSend或MPSendPacket函数将数据包继续向下发送。

2.2.2 隐蔽通信的实现原理

常见隐蔽通信技术有进程隐藏、端口利用、DLL注入和NDIS HOOK技术,基于NDIS中间层驱动的隐蔽通信主要通过中间层驱动的数据包接收和发送原理实现。驱动首先绑定网卡,截获网络数据包,再对数据包进行分析,如果是自定义协议数据包,则将其保存下来,不往上层协议传送;如果是普通数据包,则正常传递。具体做法是:修改PtReceive和Pt-ReceivePacket函数,添加数据包分析功能。NDIS中间层驱动首先通过PtReceive或PtReceivePacket接收数据包,在收到数据包后,进行解析,如果是自己定义的数据包,则直接截获,并申请一段内存,进行保存,将原来的数据包丢弃,再通过消息机制和共享内存的方法,将数据包传递给应用层的服务端,等待服务端的响应数据包,当收到服务端的响应数据包后,直接调用NDIS的发包函数NdisSend向下层的小端口程序发送数据包,这样利用我们自己设计的一套发送和接收数据包机制完成隐蔽通信。

2.2.3 自定义可靠报文传输协议

(1)报文格式

基于NDIS中间层驱动的隐蔽通信使用自定义的可靠传输协议。报文格式如图5所示。

图5 隐蔽通信可靠传输协议报文格式Fig.5 Reliable transport protocol message format of convert communication

报文头部大小为10个字节,各字段作用如下:

协议标志用于区分协议的类型,定义“HD”的ASCⅡ码来表示NDIS隐蔽通信协议,NDIS中间层驱动截获数据包后,通过分析数据包协议标志位来判断数据包的类型,并根据判断结果进行后面的处理。

命令类型用于区分发送给服务端的命令类型,“-c”表示cmd命令,“-f”表示文件传输命令,此标志位可以进行扩展。服务端根据命令类型,调用相应的模块,执行相应的命令。

数据包类型用于区分数据包类型,其中“1”表示命令数据包,“0”表示普通通信数据包。如果是命令数据包,NDIS中间层驱动将其转发给服务端执行命令,如果是通信数据包则将数据包进行正常的传输。

传输结束标志用于表示数据传输结束,为“1”时表示数据传输结束。

数据传输总长度用于记录传输的数据总长度,当接收方实际接收数据的总长度与数据传输总长度标志位的数值一样时,则表示传输完成,此时要将传输结束标志设置为“1”。

数据包序列用于记录数据包的传输序列,建立数据包确认重传机制。

数据包大小用于记录当前数据包的数据字段长度。

数据段存储用于传输数据。

(2)数据包封装流程

文中采用基于UDP协议扩展的自定义协议进行通信,数据包的封装逐层进行封装。流程如图6所示。

图6 数据包封装流程Fig.6 Flow chart of packet encapsulation

通信数据产生后,首先加上NDIS中间层传输协议的首部,然后向下层传输,在UDP层加上UDP协议首部,再往下传输,在IP层加上IP协议首部,最后加上以太网首部,封装成以太网帧。

(3)确认重传机制

由于网络的不稳定性,为了保证通信的稳定性,必须要建立数据传输的确认重传机制。由于是隐蔽通信,通信数据量不大,所以文中采用在串行传输的基础上实现序列确认重传的机制,具体设计为:在每次通信中,数据包发送方在发包后,等待确认报文,接收方接收到数据包后发一个数据包接收确认包,发送方收到数据包接收确认包后,再进行下一个数据包的发送,如果没有收到确认包则重发。

假设A向B发包,A发送数据包后等待B的确认报文,如果A收到确认报文,检测确认报文的包序列是否比A发送包序列大1,如果是,则继续发送数据包,直到A收到结束报文,否则重发。具体流程如图7所示。

图7 数据包确认重传机制流程Fig.7 Flow chat of packets confirmation and retransmission mechanism

(4)超时重传及流量控制

为保证传输的稳定性,文中设计了超时重传及流量控制机制,具体做法是:维护一个重传定时器,以进行超时重传,考虑到本系统的通信数据量较小,且对数据处理的实时性要求高,设计一个动态计算超时时间间隔的算法代价高,对本系统的意义不大,因此文中将重传定时器设定为固定值10 s,当超过这个时间,接收方仍没有收到确认报文,则认为上一个数据包没有收到,需要进行重传。同时考虑到通信时的网络链路状态,当超时重传的次数过多时,需要暂停通信,间隔一段时间后再重新传送数据,文中通过维护一个重传计数器,当通信数据包发生重传则加1,重传的次数大于5次时,进行流量控制,暂停通信,间隔60 s后重新发送当前数据包。

2.2.4 客户端设计

客户端采用B/S架构,需要解决通信数据的传输和接收问题。

客户端采用Windows Socket机制实现数据包的接收和发送,通信协议使用UDP。客户端数据包发送和接收流程如图8所示。

图8 客户端数据包发送和接收流程Fig.8 Flow chart of client data packets sending and receiving

当客户端需要发送数据时,首先建立Socket,需要设定的主要参数有通信IP地址和通信端口号,然后对通信数据进行封装,加上NDIS通信协议的首部,生成最终的发送数据包,最后直接调用Windows Socket的发送API进行发送。客户端发送完数据后,等待远程的服务端响应数据包,当接收到服务端的数据包后,对数据包进行解析,在客户端显示解析的结果,完成整个通信数据的发送和接收。

2.2.5 服务端设计

服务端主要是与和中间层驱动进行通信,需要解决和中间层驱动的交互问题,指令的获取和执行问题。

(1)驱动交互

服务端主要采用消息机制实现与NDIS中间层驱动的交互。主要消息有:取数据消息、客户端数据到来消息。具体的消息处理流程如图9所示。

图9 消息处理流程Fig.9 Message processing flow chart

NDIS中间层驱动初始化消息后,循环等待客户端的数据包,当接收到客户端数据包后,激活客户端数据到来消息,通知服务端来取数据,并且等待服务端的取数据消息。

服务端初始化消息后,循环等待NDIS中间层驱动激活客户端的数据到来消息,当消息被激活后,向驱动取来自客户端的指令数据,并且激活取数据消息。

(2)指令的获取与执行

服务端与NDIS中间层驱动的通信采用共享内存的方式,当NDIS中间层驱动收到客户端数据包后,将其拷贝至共享内存中,服务端通过访问共享内存获得客户端的指令数据。取指令流程如图10所示。

图10 服务端取指令流程Fig.10 Flow chart of server instruction fetching

服务端的指令执行采用CMDShell和管道技术实现。具体流程如图11所示。

图11 命令执行流程Fig.11 Flow chart of command execution

文中采用Windows提供的CMDShell执行命令。CMDShell是用户与操作系统对话的一个接口,客户端发送来的命令通过 CMDShell告诉操作系统执行。

管道技术是操作系统常用的进程间通信机制[8],它是一块内存缓冲区,进程间可通过管道进行通信。文中采用匿名管道实现命令执行结果的传输。

服务端获取客户端的命令数据包后,首先对数据包进行解析,获取命令,然后调用Windows CMDShell执行命令,再创建管道,将命令写入管道,获取最终的命令执行结果。

(3)数据包发送

服务端的数据包封装和数据包的发送,采用驱动通信和数据包封装技术实现。发送流程如图12所示。

文中采用的驱动通信技术主要是利用共享内存机制和IRP机制完成。服务端采用的数据包封装技术与客户端的数据包封装原理一样,采用逐层封装的方法。

图12 服务端数据包发送流程Fig.12 Flow chart of server sending packets

2.2.6 NDIS 中间层驱动设计

NDIS中间层驱动设计是文中的核心内容,主要完成数据包的截获、数据包的分析处理和数据包的接收发送,使用NDIS5.0进行开发。

(1)数据包分析处理

数据包的分析处理包括数据的截获、分析、处理。数据包的截获功能,采用数据包的拷贝和丢弃技术实现。流程如图13所示。

图13 数据包截获流程Fig.13 Flow chart of data packets interception

NDIS驱动绑定网卡后,可获得绑定网卡的所有通信数据包,通过分析数据包中的协议标志位,来判断是否是隐蔽通信数据包,如果是隐蔽通信数据包,则将数据包拷贝至驱动的数据链表,通知服务端程序取数据,并将包标志设为丢弃。如果不是,则不做处理,正常向上传递。

数据包的分析和处理主要采用协议解析技术和消息机制实现。流程如图14所示。

图14 数据包分析处理流程Fig.14 Flow chart of packet analysis

中间层驱动获得客户端的通信数据包后,首先根据NDIS通信协议进行解析,获得包类型大小,再将数据包存入共享内存,激活客户端的数据到来消息,通知服务端取数据,并且等待取数据消息的激活。

(2)数据包接收发送

NDIS中间层驱动的数据包接收发送采用共享内存、IRP请求实现。流程如图15所示。

图15 NDIS中间层驱动接收发送数据包流程Fig.15 Flow chart of NDIS receiving and sending packet

当服务端有数据向客户端发送时,首先服务端将数据包写入共享内存,并且向NDIS中间层驱动发IRP请求,NDIS中间层驱动响应IRP请求,从共享内存中取出发送数据包,最后通过调用NDIS的发包函数NdisSend向下层的小端口程序发送数据包。

3 测试与结果

3.1 测试环境

文中测试环境需要主机6台,其中:服务端主机5台,客户端主机一台,具体配置如表1所示。

表1 测试环境配置Table 1 Test environment configuration table

客户端主机分别安装ZonAlarm、金山卫士、Comodo防火墙、Mcafee个人防火墙和Mcafee专业版防火墙。服务端与客户端主机处于同一网段。

3.2 测试方法

测试采用对比测试法,即通过将基于NDIS中间层驱动的隐蔽通信程序与一个基于SOCKET通信的例程进行对比测试。

首先采用驱动安装工具或手动安装的方法,先将驱动安装在服务端主机上,再将服务端程序拷贝到服务端主机上,并在服务端主机安装测试用的防火墙,将防火墙设置为禁止服务端程序连接网络,然后在另一台客户端主机安装客户端程序,最后在客户端发送命令给服务端,检测通信情况并记录结果。

在服务端和客户端主机分别安装基于SOCKET通信的服务端程序和客户端程序,防火墙禁止服务端程序访问网络,相互发送通信数据,检测通信情况并记录结果。

3.3 测试结果

通过对比记录的通信情况,分析得到测试结果如表2所示。

表2 测试结果Table 2 Test results table

测试表明,在安装有金山卫士的计算机,采用传统SOCKET通信和文中介绍的基于NIDS中间层驱动的通信方式,服务端和客户端都能够进行正常通信。而对于其它工作在TDI层的防火墙,采用文中所述的隐蔽通信方式,可以穿透防火墙进行通信,如果采用传统SOCKET的通信方式,则通信完全被防火墙阻断。

4 结语

文中采用基于NDIS中间层驱动技术实现的隐蔽通信方式,相对于常见Windows防火墙在Windows网络体系中的所处的工作层次要低,因此,隐蔽性较高、穿透能力也较好。此外,NDIS中间层驱动技术不但可应用于隐蔽通信,而且可应用于木马通信、防火墙技术,对于信息安全和防火墙技术的研究有一定的启示作用。

[1]王正.网络安全中的防火墙技术探讨[J].通信技术,2008,41(08):218-220.WANG Zheng.Firewall Technology in Computer Network Security[J].Communications Technology,2008,41(08):218-220.

[2]宋志刚,郭林.基于NdisHook的木马隐蔽信道模型[J].计算机工程与设计,2007,28(15):3573 -3576.SONG Zhi- gang,GUO Lin.The Hidden Communication Model of NDIS Hook Based on Trojan[J].Computer Engineering and Design,2007,28(15):3573 -3576.

[3]范莉萍.基于NDIS技术的个人防火墙设计与实现[J].计算机应用与软件,2008(08):259 -260.FAN Li- ping.The Design and Implementation of NDIS Based on Personnel Firewall[J].Computer Applications and Software,2008(08):259-260.

[4]谭文,杨潇,邵坚磊.Windows内核安全编程[M].北京:电子工业出版社,2009:436-442.TAN Weng,YANG Xiao,SHAO Jian - lei.The Secure Programing of Windows Kernel[M].Bei Jing,Publishing House Of Electronics Industry,2009:436 -442.

[5]刘福超,倪佑生,付素明.个人防火墙穿透技术研究[J].信息安全与信息保密,2009(09):94-95.LIU Fu-chao,NI You-sheng,FU Su-ming.A Aersonal Firewall Penetration Technology Research[J].Information Security and Communications Privacy,2009(09):94 -95.

[6]刘文涛.基于NDIS驱动的网络数据捕获研究[J].电脑知识与技术,2010,6(03):571 -572.LIU Wen-tao.Network Data Capture Research based on NDIS Driver[J].Computer Knowledge and Technology,2010,6(03):571 -572.

[7]石磊,常桂然,曹斌.NDIS技术在个人信息安全方面的应用[J].网络安全技术与应用,2002(05):21-24.SHI Lei,CHANG Gui- ran,CAO Bing.Application of NDIS on Personal Information Security[J].Network Security Technology and Application,2002(05):21-24.

[8]周超,虞慧群.Windows命名管道技术的分析与实现[J].电脑与信息技术,2007,15(06):18 -20.ZHOUChao,YU Hu - qun.Analysis and Implementation of Windows Named Pipe Technology[J].Computer and Information Technology,2007,15(06):18 -20.

猜你喜欢
重传中间层服务端
适应于WSN 的具有差错重传的轮询服务性能研究
Zn-15Al-xLa中间层对镁/钢接触反应钎焊接头性能影响
基于TDMA的wireless HART网络多路径重传算法
无线网络中基于网络编码与Hash查找的广播重传研究
面向异构网络的多路径数据重传研究∗
新时期《移动Web服务端开发》课程教学改革的研究
如何利用合作教学激发“中间层”的活跃
浅谈通信综合营帐数据中间层设计原则与处理流程
摸清黑客套路防范木马侵入