网络抓包设计文档
- 格式:docx
- 大小:27.22 KB
- 文档页数:13
网络抓包设计文档
基于WinPcap的MFC抓包程序设计报告书引言
随着网络技术的飞速发展,加速了全球信息化的进程,各种重要数据在网上的传播日益普遍,使得网络安全问题越来越为人们所关注。网络抓包工具作为一种网络数据监听程序,在网络安全攻防方面扮演了很重要的角色,目前已经有不少抓包工具,譬如在Windows环境下,最富盛名的工具是Netxray、WireShark(原Ethereal)。网络抓包工具实际上是一把双刃剑,通过使用网络抓包工具,可以把网卡设置于混杂模式,并可实现对网络上传输的数据包的捕获与分析,此分析结果可供网络安全分析之用,也可为黑客发动进一步的攻击提供有价值的信息。而在网络安全方面,目前使用最广泛的TCP/IP协议存在许多安全缺陷,网络抓包工具可以有效地探测在网络上传输的数据包信息,通过对这些信息的分析是有助于网络安全维护的。
根据《网络安全技术发展分析》一文中的数据,2007年以来网络监听技术出现了新额重要特征,传统的Sniffer技术是被动地监听网络通信、用户名和口令,而新的Sniffer 技术则主动地控制通信数据。我们通过对网络抓包工具的数据包的捕获与分析功能的进一步了解,才能做到知己知彼,有针对性地获取所需要的信息,利用这些信息进行网络安全分析的网络威胁应对。因此对网络抓包技术的研究具有重要的意义。
本程序通过分析网络上常用的抓包软件Ethereal,在了解其功能和原理的基础上,以VS2010为开发平台,使用Windows环境下的网络数据包捕获开发库WinPcap,按照软件工程的思想设计了一个抓包程序。
一、概要设计
1.1开发环境
开发系统选用Windows 7操作系统,并且采用Microsoft Visual
Studio2010编译系统,具体环境是微软基础类库MFC,这个类库便于我们构造基于Windows操作系统的窗口程序。本系统是一个基于对话框的应用程序,并对该对话框添加了按钮控件、树状控件、列表框控件等,同时使用多线程设计,提高程序运行效率。
1.2系统结构
系统结构图如下:
1.3程序流程
根据系统结构,可以相应地得到这个程序的设计流程,通过采用程序的顺序、选择和循环三种基本的控制流程,可以提高程序质量和编程效率,使程序具有良好的可读性、可靠性、
可维护性以及良好的结构,有利于后面程序的编写。
二、详细设计与实现
网络数据包抓取技术的关键技术在于监听网络数据流,并将接收到的数据包,经过重组分析,成为用户可见的应用层信息。本节主要讨论系统核心部分的具体实现,即利用WinPcap 开发网络抓包工具,包括了数据包的捕获和分析两大主要部分。
2.1总体设计思路
通过对照前面的设计流程,以及参考了WinPcap的相关函数功能,初步构造了利用WinPcap进行网络数据包的捕获和过滤的方法,其设计步骤如下:
(1)获得适合的网络接口的列表,得到设备的基本信息(如设备名称和设备描述),利用pcap_findalldevs_ex()函数实现,该函数不仅能打开本地设备,也可以打开远程设备进行远程的抓包控制;
(2) WinPcap最强大的特点之一就是数据流的过滤引擎。它提供一种高效的方法来只捕。过滤数据包是通过pcap_compile()相pcap_setfilter()函数来实现的,WinPcap还提供了一个离线的过滤器编译函数pcap_compile_nocap()以方便实现过滤器字符串的离线检查而不影响到当前在运行的抓包函数;
(3)然后打开一个接口并捕捉流量,使用函数pcap_open()来打开一个捕捉设备。接口打开 后,有两种方法获取数据包。第一种使用pcap_dispatch()或pcap_loop()函数将会开始捕捉数据包,其中,pcap_dispatch()将会在超时后直接返回,pcap_loop()则一定要等到一定数量的数包被处理了以后才会返回。第二种使用pcap_next_ex()函数来获得缓冲区内的下一个数据包它包含一个网络适配器的描述符和两个可以初始化和返回给用户的指针 (一个指向 pcap_pkthdr 结构体,另一个指向数据报数据的缓冲)。
(4)将抓到的包数据写入到脱机堆文件中,使用pcap_dump()即可实现;
(5)最后通过pcap_freealldevs()函数来释放接口列表;
(6)生成数据包分析树时需从堆文件中读取相关包数据,需使用pcap_open_offline()来打开脱机文件,然后使用pcap_next_ex()定位到需要分析的包;
2.2数据结构
在分析数据包时需要定义合适的数据结构来帮助我们分析
我们按照TCP/IP中协议的头信息的定义设定了如下的结构体
/* 4 bytes IP address */
typedefstructip_address
{
u_char byte1;
u_char byte2;
u_char byte3;
u_char byte4;
}ip_address;
/*ethernet header*/
typedefstructethernet_header
{
u_chardstmac[6]; //目标mac地址
u_charsrcmac[6]; //源mac地址
u_shorteth_type; //以太网类型 }ethernet_header;
/* IPv4 header */
typedefstructip_header
{
u_char ihl:4; /* Internet header length (4 bits)*/
u_char ver:4;/*Version (4 bits)*/
u_chartos; /* Type of service */
u_shorttlen; /* Total length */
u_short identification; /* Identification */
u_short fo:13; /* Fragment offset (13 bits)*/
u_short flags:3;/*Flags (3 bits) */
u_charttl; /* Time to live */
u_char proto; /* Protocol */
u_shortcrc; /* Header checksum */
ip_addresssaddr;/* Source address */
ip_addressdaddr;/* Destination address */
u_intop_pad; /* Option + Padding */
}ip_header;
/* UDP header */
typedefstructudp_header
{
u_short sport; /* Source port */
u_shortdport; /* Destination port */
u_shortlen; /* Datagram length */
u_shortcrc; /* Checksum */
}udp_header;
typedefstructtcp_header //20 bytes : default
{
u_short sport; //Source port
u_shortdport; //Destination port u_longseqno; //Sequence no
u_longackno; //Ack no
u_char reserved_1:4; //保留6位中的4位首部长度
u_char offset:4; //tcp头部长度
u_char flag:6; //6位标志
u_char reserved_2:2; //保留6位中的2位
u_short win;
u_short checksum;
u_shortuptr;
}tcp_header;
/*ARP/RARP header*/
typedefstructarp_header //28 bytes
{
u_shorthrd; //hardware address space=0x0001
u_shorteth_type; //Ethernet type ....=0x0800
u_charmaclen; //Length of mac address=6
u_chariplen; //Length of ipaddres=4
u_shortopcode; //Request =1 Reply=2 (highbyte)
u_charsmac[6]; //source mac address
ip_addresssaddr; //Source ip address
u_chardmac[6]; //Destination mac address
ip_addressdaddr; //Destination ip address
}arp_header,rarp_header;
/*ICMP Header*/
typedefstructicmp_header
{
u_char type; //type
u_char code; //code
u_shortchk_sum; //checksum 16bit
u_short id; u_shortseq;
u_long timestamp;
}icmp_header;
typedefstructigmp_header
{
u_char type; //type
u_charmrtime; //Max Response time
u_shortchk_sum;
u_longmcadd; //Multicast address
}igmp_header;
要获取相应协议的内容只需要将数据包内容的指针加上偏移量,所得到的指针转换成相应头部结构体的指针即可,偏移量为该协议前面协议首部的长度和。
2.3模块化设计思路
2.3.1网络适配器的获取与释放设计
WinPcap提供了pcap_findalldev_ex函数来实现获得网络适配器设备列表功能,它返回一个pcap_if_t类型的链表alldevs,每个pcap_if_t结构体都包含一个适配器的详细信息,其中成员name和description分别表示一个适配器的名称和一个更容易让人理解的描述。该函数的的原型如下:
intpcap_findalldevs_ex(char *source, structpcap_rmtauth
*auth,pcap_if_t **alldevs, char *errbuf);
该函数创建一个能用pcap_open函数打开的网络适配器设备列表。该函数是老函数pcap_findalldevs的一个扩展,pcap_findalldevs()是一个过时的函数,其只允许列出在本机上的网络设备,而pcap_findalldevs_ex还可列出一个远程机器上的网络设备,此外也能列出一个给定文件夹中可用的pcap文件。因为pcap_findalldevs_ex()依赖于标准的pcap_findalldevs()来获得本地机器的地址,所以它是平台无关的。