基于Winpcap的多线程FTP文件还原系统的实现*
2010-04-26吴志强马春波敖发良
吴志强 马春波 敖发良
(桂林电子科技大学信息与通信学院 桂林 541004)
1 引言
随着网络技术的飞速发展和网络时代的到来,互联网的影响己经渗透到人民生活的各个方面,全社会对网络的依赖程度越来越大,整个世界通过网络正在迅速地融为一体。随着因特网接入技术的迅速发展,伴随着大容量硬盘、大容量磁带机等海量存储设备的大范围应用,越来越多的个人选择利用这些资源开设FT P服务。FTP服务器功能强大,在网络中发挥着重要的作用,因此FTP服务器的应用很广泛,对FTP服务器的监控有重要的作用。
在通常的网络环境之下,FTP的信息包括口令都是以明文的方式在网上传输的,只要将网络接口设置成混杂模式,WinPcap捕获数据包及对数据包的过滤,便可以源源不断地将网上传输的信息截获,因此进行网络监听从而获得FTP信息并不是一件困难的事。FTP文件内容信息的还原是本文的重点。本文的工作总结以下几点:在VC开发环境下,开线程实现了监视FTP的信息内容及文件的还原,还原文件可以进行保存,方便查看、处理和验证。这些技术可以对FTP服务器安全防范和保障网络安全;另外可以维护网络环境,监听在网上传播的不法文件信息,它在协助网络管理员监察维护网络环境安全等方面具有非常重要的作用。
2 网络数据包捕获及WinPcap工作原理
2.1 网络数据包捕获原理
网卡具有4种工作模式:广播模式、多播传送模式、直接模式、混杂模式[4]。网卡的缺省工作模式包含广播模式和直接模式,即它只接收广播帧和发给自己的帧。如果采用混杂模式,网卡将接受同一网络内所有主机所发送的数据包,数据包捕获程序就是在这种模式下运行的,这样就可以达到对所有数据包进行捕获的目的。
2.2 WinPcap工作原理
2.2.1 Winpcap组成
WinPcap为数据包捕获提供了Windows下的一个平台,它是由伯克利分组捕获库派生而来的分组捕获库,它是在Win32平台上来实现对底层包的捕获,它的体系结构是由一个核心的包过滤驱动程序,一个底层的动态连接库Packet.dll和一个高层的独立于操作系统的库(Wpcap.dll)组成[6]。
2.2.2 Winpcap捕获过程
捕获过程按先后顺序具体可分为以下几个步骤,即寻找系统中可用的接口列表、打开接口准备捕捉、编译和设置过滤器、读取捕捉数据包、关闭捕获套接字下面以一个具体的事例来说明各函数是如何使用的,至于所用函数的原形可查阅相关的WinPcap资料[7]。实验室电脑分别用网线与HUB相连。利用WinPcap函数进行如下编程操作,写一个捕获数据包过程函数getpacket()调用了如下函数:
主要函数说明:
1)pcap_findalldevs_ex(pcap_src_if_sting,null,&alldevs,errbuf)
能返回远程适配器信息和一个位于所给的本地文件夹的pcap文件列表。
2)pcap_t*pcap_open_live(const char*device,int snaplen,int promisc,intto_ms,char*ebuf)
函数功能:用于打开device监听设备,并得到设备描述符。
参数说明:device为监听设备,snaplen为设定的捕获数据的最大长度,promis为混杂模式,to_ms为设定的超时时间,ebuf用于传递错误信息。
3)int pcap_compile(pcap_*P,struct bpf_Program*fp,char*str,int optimize,bpf_u_int32 netmask)
函数功能:对过滤字符串进行编译。
参数说明:p为得到的设备描述符,fp用于存放编译结果,str为过滤字符串,optimize用于设定是否对编译后的代码进行优化,netmask为本地网络的网络掩码。
4)int pcap_setfilter(pcap*p,struct bpf_program*fp)
函数功能:用于设置过滤器。
参数说明:fp存放着经pcap_compile()编译后的代码。
5)pcap_dumper_t*pcap_dump_open(pcap_t*p,char*fname)
函数功能:打开用于保存捕获信息的文件。
参数说明:p为设备描述符,fname为要打开的文件名。
6)int pcap_loop(pcap_t*p,int cnt,pcap_handler callback,u_char*user)
函数功能:捕获并处理每一个数据包。
参数说明:cnt用于设定最多处理的数据包数,-1表示处理所有数据包;callback为回调函数,该回调函数带有三个参数,第一个参数为pcap_loop()的第四个参数user,第二个参数为指向数据包头部的指针pcap_pkthdr*ptrPktHdr,第三个参数为指向数据包的指针化char*ptrPkt。在本模块中,使用void pcap_dump(u_char*user,struct pcap_kthdr*h,u_char*sp)作为回调函数,该函数用于将捕获的数据包记录到指定的捕获文件中。
此函数还可以使捕包程序性能的调整,如调整函数pcap_open_live()中的读操作等待时间值。通常出于效率可将该值设置的比较大:但当对响应时间要求比较高时,应将该值改小[8]。对应用层数据包的抓获,可对pcap_compile()函数第三个参数设置过滤条件。
3 监控FTP上传和下载文件及还原文件的分析与设计
3.1 系统框架
整个系统的设计分为两个部分,一个FTP监听部分,监听机运行在Windows系统下,目的是截获网络中的F TP文件数据包。另一个是FTP解析和管理部分,主要目的是对截获的上传和下载的文件进行解析,还原成原来的文件类型和内容,并对还原后的文件进行阅读查看、删除等管理操作,可以运行在监听机上也可以运行在其它机器上。系统的总体框架如图1所示。
图1 系统的总体框架
3.2 FTP协议分析和还原算法及流程图
FTP是基于TCP/IP的文件传送协议,为用户提供一种在两个主机之间传送文件的标准方法,典型应用是,用户连接上一个远程计算机(计算机上运行FTP服务器程序),查看远程计算机有哪些文件,然后把文件从远程计算机上传送到本地计算机,或把本地计算机的文件送到远程计算机去。下面我们先介绍FTP协议,然后用面向应用层协议的数据分析还原模型,实现TFP协议的分析还原。
FTP协议位于OS1网络七层模型的应用层,同时也是TCP/IP协议族的一部分。FTP协议的原始设计目标有4个:1)促进文件(包括程序和数据)的共享;2)鼓励间接地或隐式地(通过程序)来使用远程计算机;3)使得不同主机的不同文件存储系统对用户来讲是透明的;4)高效可靠地传输数据[9]。
3.2.1 FTP协议传输文件过程
FTP传输有两种模式,即Port模式和Passive模式。FTP根据不同的模式,使用不同的TCP端口号。下面以FTP Port模式为例,说明FTP步骤如下:
1)客户端发送一个TCP SNY(TCP同步)包给服务器段众所周知的FTP控制端口21,客户端使用暂时的端口作为它的源端口;
2)服务器端发送SNY AKC(同步确认)包给客户端,源端口为21,目的端口
为客户端上使用的暂时端口;
3)客户端发送一个ACK(确认)包:客户端使用这个连接来发送PORT命令,服务器端使用这个连接来发送FTP应答;
4)当用户请求一个列表(List)请求或者发起一个要求发送或者接受文件的请求,客户端软件使用PORT命令,这个命令包含了一个暂时的端口,客户端希望服务器在打开一个数据连接时候使用这个暂时端口:POTR命令也包含了一个IP地址,这个IP地址通常是客户自己的IP地址,而且TFP也支持第三方(third-party)模式,第三方模式是客户端告诉服务器端打开与另台主机的连接;
5)服务器端发送一个SNY包给客户端的暂时端口,源端口为20,暂时端口为客户端在PORT命令中发送给服务器端的暂时端口号;
6)客户端以源端口为暂时端口,目的端口为20发送一个SNY ACK包:
7)服务器端发送一个AKC包;
8)发送数据的主机以这个连接来发送数据,数据以 TCP段(注:segmnet,第4层的UDP)形式发送(一些命令,如STOR表示客户端要发送数据,RETR表示服务器段发送数据),这些TCP段都需要对方进行AKC确认(注:因为TCP协议是一个面向连接的协议);
9)当数据传输完成以后,发送数据的主机以一个FNI命令来结束数据连接,这个FIN命令需要另一台主机以AKC确认,另一台主机也发送一个FIN命令,这个FNI命令同样需要发送数据的主机以ACK确认;
10)客户端能在控制连接上发送更多的命令,这可以打开和关闭另外的数据连接;有时候客户端结束后,客户端以FIN命令来关闭一个控制连接,服务器端以ACK包来确认客户端的FIN,服务器同样也发送它的FIN,客户端用ACK来确。
FTP和网络应用程序的不同的是,它在主机之间使用了两个并行的TCP连接来传送文件,一条连接用于数据传送,而另一条端口用于传送控制信息(命令和响应)。把命令与数据的传送分开使得FTP效率更高。FTP协议规定,使用端口21作为控制连接,在会话过程中分配一个端口作为数据连接,在实际应用中,数据传输端口可以有公式计算(下面表给以说明)。
客户端数据一般包含以下三个部分:命令行、用户名和密码以及文件数据。对客户端数据以行为单位进行分析,即可提取出FTP的命令字段。如表1所示。
表1 常用到的一些FTP命令
3.2.2 FTP还原总流程图及还原算法
从上面的FTP介绍知道,FT P除了具有命令方式外,还会根据数据传输情况产生新的数据传输方式。因此,TFP协议的应用层分析和还原包括两部分:
1)FTP命令的还原,即将客户端访问FTP服务器的命令及FTP服务器的响应进行还原,进而实现FTP操作过程的重组。
2)F TP传输内容的还原,即将客户端和服务器之间传递的文件进行保存,和还原,进而实现FTP传输数据的重组。
FTP命令非常简单,这里我们不再介绍。下面我们介绍如何使用面向应用层协议的数据分析还原总流程图2所示。
下面分析思路:为了提高运行速度,防止丢包现象,及还原文件效率,优化程序,作者创建三个线程分别实现不同的作用,主进程是WinPcap抓包,这是主线,整个系统贯彻这主线的基础上才有下面的研究,对网络层,传输层和应用层的分析,线程1是协议分析,网络通信有很多协议,因此协议分析是关键,针对不同的协议有不同的分析方法,这是还原文件的前提,同时也是提高监听速度,线程1不是本文的重点,就不详细介绍了,本文是对FTP上传和下载文件的分析并还原,因此当有FTP数据包时,我们打开线程2,不过这时是休眠状态,可能客服端只是对FTP服务器的一般访问,没有具体的操作,即可能没有什么下载或上传文件的动机,因此要仔细观察和分析整个F TP交互过程,在FTP服务器和客户端的会话过程,如果客户希望服务器下载文件或者目录或者向服务器上传一个文件时,触发并打开线程2,这时作者设计了FTP文件还原子流程图如图3所示。
图2 还原FTP上传和下载文件数据总体流程图
掌握FTP还原流程,就可以实现还原FTP协议的传输文件,下面分析FTP还原算法描述:
第一步:首先,确定会话开始标志
TFP协议传输内容的会话开始标志出现在PORT命令中。这个命令包含了一个暂时的端口,客户端希望服务器在打开一个数据连接时候使用这个暂时端口。
设置会话开始标志为POTR。
第二步:确定会话结束标志
FTP协议在会话结束时通常没有专用的标志(部分特殊应用除外),因此,可以使用TCP的断开连接标志位来作为FTP会话结束标志.例如,使用数据包的TCP RST标志和TCP FIN标志。
第三步:还原步骤
下面是应用层数据重组的策略也是文件还原系统的核心:
1)根据PORT命令的参数,提取临时端口,然后与控制端口21结合来分析服务器与客服端之间的交互过程;
2)对数据包数据进行匹配,当匹配的字符串是STOR时,说明客服端要向FTP服务器上传资料,这时打开线程进行监听,捕获上传文件,跳至3);当匹配的字符串是RET R时,说明客服端要向FTP服务器下载资料,这时打开线程进行监听,捕获下载文件,跳至1);其他命令时,跳至10);
图3 FTP还原子流程图
3)如果是第一个数据包,获取响应包附带的参数,初始化流状态的部分状态值,获得当前序列码为sequence和数据偏移量data_len,下一个包的序列码为next_seq_num。其大小为:next_seq_num=sequence+data_len;是为了在多文件上传时确保不会导致接收数据混乱,并采取一边获取数据包一边写入文件的形式还原重组文件,此时跳至8);
4)当实验环境是在Internet Explorer下载文件时,跳至5);当实验环境是在Windows资源管理器界面下载文件时,跳至6);
5)当下载方式是Windows系统自带的下载方式即“另存为”,则调用函数f1处理数据包,这里主要是对下载目录技巧问题的处理,则跳至7);
6)下载方式是把文件用复制方式保存在客服端目标主机上,调用函数f2分析数据包,并还原文件内容,跳至7);
7)开始获得下载文件数据包的当前序列码即为sequence和数据偏移量data-len,并设下一个包的序列码为 next_seq_num。其值为:next_seq_num=sequence+data_len,当下一个数据包的序列码等于next_seq_num时,则为该文件的数据,不等则丢弃,这样的目的是为了在多文件上传时确保不会导致接收文件数据时混乱;
8)根据数据包的长度和数据偏移,将包的应用层数据部分保存到文件中。用面向应用层协议的数据分析还原模型,然后在会话标志集中设置好的标志、策略,即可实现PTP协议的还原重组;
9)当发送数据的主机以一个FNI命令来结束数据连接,这个FNI命令需要另一台主机以AKC确认,表明数据传输结束则跳至10);否则跳至7);
10)关闭文件,关闭线程,结束则停止FTP还原子程序。
从还原算法可以得出,要获取有用的数据需要对数据包进行解码。从链路层协议开始进行解码分析,一直到应用层的协议,重点是应用层对应用层数据的还原,在分析过程中,可以知道下载方式的不同,客户端和服务器交互过程是不同的,响应的关键字也有所不同,但传输数据原理是相同的,这里针对不同的情况进行分析,还原出原文件。文件是以原文件的格式保存,保存在硬盘上方便查看和验证。
4 结语
面向应用层协议的数据分析还原算法建立在基于Winpcap基础之上,因此,其保留了基于Winpcap的抓包的特点,同时克服了部分不足。主要体现在以下两点:
1)进一步提高了分析的速度,同时大大提高分析的准确性。基于应用层字符串的协议分析主要用在基于会话的网络协议的分析上。比如,假设一次会话有100个报文通讯,而真正产生应用层数据的数据包在第5到第90个之间,则我们只关心这个会话的第5到第90个报文,只有这些报文才存在着有用信息,而对于这次会话的其他报文我们就没有必要去分析和处理。这就使得我们分析的报文数量下降了。
2)节约了协议分析时间。实践证明,使用本模型分析应用层协议,可以大大提高效率。在该监听系统,作者开了三个线程,有针对性的处理不同的问题,特意有一个线程是用来分析协议的。
该系统在局域网内能正常运行,性能良好,当然,系统还有一些方面的改进和优化,以便扩充与增强系统的性能。
[1]李亚恒,唐毅.网络安全监测系统[J].计算机工程,2001,27(4):127~129
[2]Gerhard Steinke.Data privacy approaches from US and EU perspectives[J].Telematics and Infoematics,2002(19):193~200
[3]谭国亮.监听与隐藏[M].北京:人民邮电出版社,2002
[4]秦根建,张秉权.网络数据包截获机制研究[J].兵工自动化,2003,22(6):2~3
[5]Behrouz A Forouzan,Sophia Chung Fegan.TCP/IP协议族[M].谢希仁,译.北京:清华大学出版社,2006:24~29
[6]张伟,王韬,潘艳辉,等.基于WinPcap的数据包捕获及应用[J].计算机工程与设计,2008,29(7):1649~1651
[7]循序渐进学习使用WinPcap.中国协议分析网[EB/OL].http://www.cnpaf.net/,2005
[8]李雪莹,刘宝旭,许榕生.基于WinPcap的网络监控系统性能优化[J].计算机工程,2004,30(1):8~9
[9]罗军舟,波涛.TCP/PI协议及网络编程技术[M].北京:清华大学出版社:111~114