协议分析监视软件的设计与实现__墨水学术,论文发表,发表论文,职(2)
分类:推荐论文 时间:关注:(1)
数据单元,需要工作在混杂工作模式下。
网络协议分析软件,作为一种网络通讯程序,可以通过对网卡的编程来实现网络通讯的,对网卡的编程是使用通常的套接字(socket)方式来进行。具体到编程实现上,这种对网卡混杂模式的设置是通过原始套接字(rawsocket)来实现的,这也有别于通常经常使用的数据流套接字和数据报套接字。在创建了原始套接字后,需要通过setsockopt()函数来设置IP头操作选项,然后再通过bind()函数将原始套接字绑定到本地网卡。为了让原始套接字能接受所有的数据,还需要通过ioctlsocket()来进行设置,而且还可以指定是否亲自处理IP头。至此,实际就可以开始对网络数据包进行捕获了,对数据包的获取仍象流式套接字或数据报套接字那样通过recv()函数来完成[3]。
图2.系统流程图
Winpcap是由伯克利分组捕获库派生而来的分组捕获库,它是在Windows操作平台上来实现对底层包的截取过滤。Winpcap为用户级的数据包提供了Windows下的一个平台。Winpcap包括三个部分:第一个模块NPF(NetgroupPacketFilter),是一个虚拟设备驱动程序文件。它的功能是过滤数据包,并把这些数据包原封不动地传给用户态模块,这个过程中包括了一些操作系统特有的代码。第二个模块packet.dll为win32平台提供了一个公共的接口。不同版本的Windows系统都有自己的内核模块和用户层模块。Packet.dll用于解决这些不同。调用Packet.dll的程序可以运行在不同版本的Windows平台上,而无需重新编译。第三个模块Wpcap.dll是不依赖于操作系统的。它提供了更加高层、抽象的函数。本文采用Winpcap作为网络监视软件开发的API函数包。
3.2数据包捕获模块设计
1)枚举本机网卡的信息
PCAP提供了pcap_findalldevs()这个函数来实现获得全面的网卡信息功能,尤其是字段名字和含有名字的描述以及有关驱动器的易读信息。
2)打开相应网卡并设置为混杂模式:
主要是要用到pcap_open_live函数,不过这个函数winpcap的开发小组已经建议用pcap_open函数来代替,我的代码里面用的就是pcap_open_live,不过pcap_open_live使用起来也是没有任何问题的
3)截获数据包并保存为文件:
当然,不把数据包保存为文件也可以,不过如果不保存的话,只能在截获到数据包的那一瞬间进行分析,转眼就没了,所以为了便于日后分析,所以我把数据包保存下来。但是注意网络流量,在流量非常大的时候注意硬盘空间。
4)捕获数据包函数
捕获数据包函数放到一个线程中,这样可以不断去捕获网络中的数据包,CPU占用率会小于1%。线程(Thread)是与进程(Process)相对应的概念。Windows9x和WindowsNT是多任务操作系统,它们的实现是基于线程方式的,支持多线程应用。在Windows的一个进程中,包含一个或多个线程。而一个线程是进程的一条执行路径,它包含独立的堆栈和CPU寄存器状态,每个线程共享所有的进程资源。包括打开的文件、信号标识及动态分配的内存等。一个进程内的所有线程使用同一个32位地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行线程。线程具有优先级别,优先权较低的线程必须等到优先级较高的线程执行完任务后再执行。采用多线程结构的优点是:其一,可以同时处理多个不同的事务,且各个事务的处理模块相互独立;其二,良好的扩展性,可以方便的在有新的需求时添加对应的处理模块[4]。
创建线程:m_ThreadHandle=CreateThread(NULL,0,CaptureThread,(void*)this,0,NULL)
结束线程:
TerminateThread(m_ThreadHandle,EXIT_FAILURE);
CloseHandle(m_ThreadHandle);
以上完成了对数据包的捕获