一种新的教学用轻量级网络数据包抓取方法
2016-08-29田增山
何 维, 李 亮, 田增山, 周 牧, 张 毅
(重庆邮电大学 重庆市移动通信技术重点实验室, 重庆 400065)
一种新的教学用轻量级网络数据包抓取方法
何维, 李亮, 田增山, 周牧, 张毅
(重庆邮电大学 重庆市移动通信技术重点实验室, 重庆400065)
用API拦截和函数入口指令替换的方法,能够对网络数据包方便、快捷地抓取。该方法通过HOOK远程注入技术,修改系统程序的运行逻辑,使程序跳转到自定义的函数中运行,调用Windows 部分API实现网路数据包的抓取,不涉及Windows驱动开发等专业知识。该方法主要应用于计算机相关专业的教学演示,具有技术实现简单、无需驱动编程的知识、代码量小、易于学生理解等特点。
数据包抓取; API拦截; 网络实验教学; 互联网
由于互联网技术的普及,尤其是近年来移动互联网技术的突起,网络通信技术成为学生学习、研究的热点。而在网络通信技术中,网络协议起着十分重要的作用,学习、分析、研究网络协议成为掌握网络通信技术的重要途径[1-2]。
在不开源的Windows平台下,要分析网络协议,首先要解决如何抓取本机的网络通信数据包的问题。目前比较成熟的此类商业软件有Winpacp和Wireshark等[3],这些软件产品稳定可靠、使用方法简单,但缺点是不开源,学生只能知晓如何使用这些软件抓取网络数据包,却无法知晓抓取数据包的内在方法。在Windows平台下,要实现网络数据包的抓取,开源的做法有以下两种。
其一是采用Windows提供的原始套接字(RAW SOCKET),通过把网卡设置为混杂模式,抓取经过本机网卡的IP数据包[4]。这个方法的缺点是只能用于Windows 2000及以前的平台,并不支持后续平台。
其二是通过编写网络过滤驱动(filter driver),通过在套接字接口层与TCP/IP设备对象层之间或网络协议栈和物理网卡之间加入一层过滤驱动,来实现网络数据包的拦截[5]。这个方法的优点是适用所有的Windows平台,通用性非常好,缺点是需要有Windows驱动编程的知识和驱动开发包。编写代码对学生知识层次要求过高、代码量大,且稍有不慎,驱动的不稳定即会引起操作系统崩溃。
因此,开发一个简单实用的网络数据包抓取方法,在高校关于计算机网络协议的教学中具有比较重要的实际意义。对于教学而言,只有理论是不够的,在讲解理论知识的基础上,给出一个可编程实现的、简捷的抓包方法,对学生更有吸引力,更能激发学生的创造性。
1 数据包抓取模型
1.1现有数据包抓取模型
由于现有计算机大多已不再运行Windows 2000及以前的操作系统,所以现有主流数据包抓取方法多采用过滤驱动法[6]。过滤驱动分为传输层过滤驱动和中间层过滤驱动两种形式(见图1)。
图1 网络过滤驱动模型
传输层过滤驱动使用NDIS(network driver interface specification)技术,又称为TDI(tran-sport driver interface)编程[7]。Windows 2000和Windows XP操作系统中的TCP/IP协议作为系统驱动程序,在系统启动时载入系统内存,以TCP/IP设备对象的形式供应用程序或其他系统程序调用。传输层过滤驱动程序创建一个或多个设备对象,并直接挂接到TCP/IP设备对象之上。
挂接成功后,当其他程序使用网络传输功能,调用TCP/IP设备对象时,操作系统首先将该调用映射到TCP/IP设备对象所挂接的传输层过滤驱动程序。通过传输层过滤驱动程序,再调用下层的TCP/IP设备对象,从而完成网络访问功能。同样,从TCP/IP层上传至应用程序的网络封包,也要经传输层过滤驱动程序后,再转发至目标应用程序端口。基于此工作原理,可以在传输层过滤驱动程序中实现网络封包截获。
中间层过滤驱动与传输层过滤驱动的基本原理一致,也是使用NDIS技术。主要差别在于,中间层驱动程序挂接在协议设备对象(包括TCP/IP设备)和网卡设备对象之间,任何进出网卡的网络封包均须先经过中间层驱动程序的处理。中间层驱动程序更像一个虚拟网卡,该虚拟网卡封装了物理网卡,对物理网卡的一切网络访问操作,均须先经虚拟网卡处理。
1.2新的数据包抓取模型
由于现有的数据包抓取方法对于学生的学习和实践都过于复杂,本文设计了一种轻量级的计算机网络数据包抓取方法,其流程如图2所示。
图2 网络数据包抓取实现流程
轻量级网络数据包抓取方法是通过HOOK远程注入技术[8],修改系统程序的运行逻辑,使得程序跳转到自定义的函数中运行,实现需要的功能。采用上述方式只需要调用Windows 部分API即可实现网路数据包的抓取,不涉及Windows驱动开发等专业知识,适合教学研究。
2 新数据包抓取方法的实现
数据包抓取流程的具体实现方法如下。
首先,利用Windows的HOOK技术,把编写的抓取网络数据包功能的动态链接库(dynamic link library,DLL)程序模块注入到计算机上的每一个进程中[9],并通过枚举系统的全部进程,选择需要抓包的目标进程。
然后,在DLL中通过拦截进程对操作系统套接字函数接口(SOCKET API)的调用,并利用Windows运行时动态装载技术[10],获取套接字函数接口的地址。主要代码如下:
(1) HMODULE hWsock = LoadLibrary(L“Ws2_32.dll” );
(2) g_pBind = ( DWORD )GetProcAddress( hWsock, “bind” );
(3) g_pConnect = ( DWORD )GetProcAddress( hWsock, “connect” );
(4) g_Send = ( DWORD )GetProcAddress( hWsock, “send” );
执行以上第一行代码,实现动态装载Windows套接字接口32位API库模块[11]的功能;执行第二行代码,获取套接字接口中的Bind函数接口的地址[12];执行第三行代码,获取套接字接口中Connect函数接口的地址,这个函数用于建立客户端和服务器端的TCP协议逻辑连接;执行第四行代码,可获取套接字接口中Send函数接口的地址,这个函数用于发送TCP协议数据包,根据协议分析的需求,可以获取需要拦截的每一个套接字函数的接口地址。
经过上述的过程后,还需读取函数接口地址的指令,为以后恢复原始调用做准备,并且在待拦截套接字函数地址入口处写入自己构造的汇编指令。构造的汇编指令为MOV EAX, JMP EAX。查找X86架构CPU的汇编手册[13],可以很容易得到如上两条汇编语句的机器指令,其十六进制代码为:0xB8 0x00 0x00 0x40 0x00 0xFF 0xE0 0x5F,其中斜体部分地址用自定义函数接口地址替代即可。
如此,当进程调用正常的套接字函数接口时,会自动转到自定义的函数体中执行,直接拷贝函数的接收/发送缓冲区参数即可得到相应的网络数据包;然后利用前面所保存的信息恢复原套接字函数入口指令,并调用该套接字函数,执行正常的函数功能,并再次修改该套接字函数的入口指令,为下次拦截做好准备。
在自定义函数中,当拦截到进程对套接字函数接口的调用时,截获这些函数参数中缓冲区字段参数,即可获得网络数据包。例如拦截到对Send函数的调用,即可抓取出本机通过网卡发出的TCP协议网络数据包;拦截到Recv函数调用,即可抓取到本机通过网卡接收到的TCP协议网络数据包;拦截到Sendto函数的调用,即可抓取到本机通过网卡发出的UDP协议的网络数据包;拦截到Recvfrom函数调用,即可抓取到本机通过网卡接收到的UDP协议的网络数据包。
在抓取相应网络数据包之后,恢复函数入口指令,然后调用原API函数,即恢复原始调用。最后在待拦截套接字函数地址入口处再次写入自己构造的汇编指令,即可为下次拦截做好准备。
3 新数据包抓取方法的优势
笔者所设计的计算机网络数据包抓取方法,是一个简单、简捷的网络数据包抓取方法。该方法的技术实现门槛低,只需普通Windows API调用,无需专业的驱动开发知识,适合教学研究。该方法改变了计算机网络协议教学中只能使用专业不开源软件抓取网络数据包的限制,学生可以深入到程序内部,甚至自己编写抓包程序,关键代码甚至不超过50行。
此方法还可以配合Windows路由表设置,用于多网卡主机平台上的网卡负载均衡调度,即实现进程与不同网卡的绑定。目前,在多网卡Windows主机环境下,不依赖三方软件无法控制网卡之间的负载均衡,即:假设某张网卡上即使在负载过大、而其他网卡闲置的情况下,Windows也不会主动去调度其他网卡分担负荷;而用轻量级网络数据包抓取方法,拦截到目标进程通信的目的地址后,在Windows的路由表中添加该目的地址的输出路由表,即可将不同的进程的原IP地址绑定到不同的网卡上,从而实现多网卡之间的负载均衡调度。
4 结语
本文所设计的轻量级计算机网络数据包抓取方法,在教学领域具有普遍意义。本方法利用API拦截和函数入口指令替换实现计算机网络数据包的抓取,技术实现简单,完全克服了现有网络数据包抓取方法不开源的缺点,学生可深入程序内部,了解其抓包原理。本方法还可以实现多网卡之间的负载均衡调度,从而提高计算机网络通信效率。
References)
[1] 廖敏,吴文庆.Windows平台下网络数据包捕获的设计与实现[J].电脑知识与技术,2008(4):28-30.
[2] 王维颀.局域网数据包抓取与分析器的设计[J].科技资讯,2011(32):15.
[3] 张昊.计算机网络数据包捕获技术浅析[J].合肥学院学报:自然科学版,2009,19(2):46-48.
[4] 李浪,徐雨明,魏书堤.数据包截获仿真实验平台研究与实现[J].衡阳师范学院学报,2008,29(3):97-101.
[5] 杨晓勇.计算机网络数据管理及信息传输环节安全性探讨[J].信息通信,2013(10):128.
[6] 朱莉,曾慧,代杰.基于Tcpdump命令网络抓包脚本工具的设计[J].指挥信息系统与技术,2011(3):53-57.
[7] 刘捷,朱程荣,熊齐邦.分布式网络自动抓包管理系统的设计与实现[J].计算机工程与设计,2009,30(22):5091-5093.
[8] 何杰惠.网络数据捕获技术的探究[J].电子制作,2013(22):141.
[9] 于杰,朱有忠.简单实用的网络嗅探器的设计与实现[J].吉林大学学报:信息科学版,2010,28(4):423-427.
[10] 唐小婕.一种网络数据包分析工具的设计与实现[J].科技信息,2013(26):298-299.
[11] 李延会,岳彩祥,徐金艳,等.基于Winpcap的数据包捕获和协议分析系统的设计与实现[J].中国科技信息,2009(10):123-124.
[12] 翟佩超.网络数据包的截取及解析[J].太原城市职业技术学院学报,2013(10):167-168.
[13] 李革新.网络数据包捕获工具的开发与实现[J].计算机工程与设计,2007,28(8):1834-1836.
A new teaching method for data packet capture based on lightweight computer network
He Wei, Li Liang, Tian Zengshan, Zhou Mu, Zhang Yi
(Chongqing Key Laboratory of Mobile Communications Technology, Chongqing University of Posts and Telecommunications, Chongqing 400065, China)
This paper uses API interception technology and function entry instruction replacement technology to achieve computer network data packet capture. This method through the HOOK remote injection technology modifies the system running logic, so that the program can jump to a custom function to operate. Calling part of the Windows API to achieve the capture of network data packets does not involve Windows driver development and other professional knowledge. This method is mainly used in teaching demonstration in the field of computer teaching. It features simple technology, it is not necessary to drive programming knowledge, its code amount is small and it is easy to understand for students.
data packet capture; API interception; network experimental teaching; Internet
DOI:10.16791/j.cnki.sjg.2016.04.037
2015- 09- 04
重庆市教改项目“运用计算机虚拟技术构建通信系统实践教学新模式”(133017);重庆邮电大学教改项目“移动通信系统仿真平台的设计与实现”(XJG1302)
何维(1980—),男,重庆,硕士,讲师,主要从事移动通信、通信软件等领域的研究开发.
E-mail:380624653@qq.com
TP393
A
1002-4956(2016)4- 0135- 03