邢宝玉 吕雪鸣 孙朝宇
【摘要】Linux操作系统使用libnet函数库和Qt函数库设计的网络协议数据单元发生器。本项目的意义在于该系统提供了提供协议验证、协议分析等功能;为进一步学习和理解TCP/IP协议族、模拟攻击、威胁发现以及网络故障定位等内容提供实践平台。对非网络专业的学生验证协议、对网络工程专业学生深入理解协议、锻炼协议分析能力起到重要作用。
【关键词】libnet网络协议PDU构造
一、引言
Libnet是一个专业网络安全构造和发送数据包的一个高层次的API函数库,允许开发者构造和发送网络数据包。Libnet提供了一个对底层网络数据包进行构造,修改和发送的高级接口。它隐藏了很多底层细节,省去了很多麻烦,如多路技術,缓冲区管理,网络数据包头信息,字节流顺序,操作系统兼容性,以及校验和计算问题等等。
二、设计思想
首先创建一个Libnet句柄,并将句柄初始化,为数据包分配存储空间,确定Libnet的类型。确定网络接口,可以自己指定也可以Libnet自动查询搜索(将libnet_init()的参数device赋值NULL即可)。将校验和的参数设置为0,libnet就会自动计算校验和。获取libnet初始化后的句柄,构造数据包,这里使用Qt Creator中的QLineEdit和QComboBox为libnet句柄所代表的数据包赋值,使用QPushButton执行开始发送和结束,通过Libnet定义的句柄返回值来判断我们所构造的数据包是否合法,如果合法就调用libnet_write()函数发送数据包。
三、程序流程
3.1构造协议模块流程
首先通过初始化函数libnet_init(),对内存、网络进行初始化,再通过不同的libnet_build()函数构造各种协议的网络数据包,其中包括libnet_build_arp(),libnet_build_ip()等等。将网络数据包构造好后,通过libnet_write()函数将构造好的网络数据包进行发送,最后通过libnet_destroy()函数关闭网络接口,释放内部内存空间,构造结束。
3.2主函数流程
创建一个QThread 类的子类myThread,重载QThread 的run()函数,run()函数中发射构造相应数据包的信号。实例化一个线程对象并调用QThread::start()函数,开始发送数据包,重载的run()函数将会在新建的独立的线程中执行。
选择想要构造的数据包,即跳转到各自协议的数据包构造函数,检查构造的数据包是否合法,如果合法就调用libnet_write()函数发送数据包,否则,查看linux终端输出的错误信息,然后重新填写数据包,继续执行。
程序界面如图1所示:
四、结束语
在实验室局域网环境中进行测试并且结果表明系统能够构造不同协议数据包,可以通过Wireshark和Tcpdump网络数据包捕获工具捕获成功。
参考文献
[1]刘文涛. 网络安全开发包详解[M]. 北京:电子工业出版社,2005.10
[2]黄俊杰,王建新,张静. 基于Linux的网络协议学习系统[J]. 中南大学硕士学位论文,2009.11
[3]布兰切特(Jasmin Blanchette)(作者),萨默菲尔德(Mark Summerfield)(作者),闫锋欣(译者),等. C++ GUI Qt 4编程[M]. 第2版. 电子工业出版社,2013.5