




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
网络数据包捕获与应用的VC+6.0编程 美国GeneChiu基金资助网络数据包捕获与应用的VC+6.0编程研究生方松茂对以太帧头、IPv4报头、IPv6报头、TCP报头及UDP报头格式这几种常用数据报头分别利用WinPcap和原始套接字编写程序进行分析。并利用MFC类库,采用链表结构存放捕获的网络数据的方案,实现了局域网内Internet数据采集的应用程序。另外,还编写了一个利用WinPcap提供的发送数据报的函数实现SYN Flood的黑客攻击程序。现对各程序简要介绍如下:程序源代码如下:程序1 利用WinPcap函数库函数解析捕获数据包的以太帧头程序名:AnalyzeETH_WinPcap.CPP程序2 利用WinPcap函数库函数解析捕获的IPv4数据报包头程序名:AnalyzeIPv4_WinPcap.CPP程序3 利用WinPcap函数库函数解析捕获的IPv6数据报包头程序名:AnalyzeIPv6_WinPcap.CPP程序4 利用WinPcap函数库函数解析捕获的TCP数据报包头程序名:AnalyzeTCP_WinPcap.CPP程序5 利用WinPcap函数库函数解析捕获的UDP数据报包头程序名:AnalyzeUDP_WinPcap.CPP程序6 利用WinPcap函数库函数发送TCP SYN帧数据报,进行SYN洪水攻击注意:本程序仅供学习参考,请不要在Internet网络上使用!程序名:SYNFlood_WinPcap.C程序7 利用原始套接字捕获并解析IPv4数据包程序名:AnalyzeIPv4_WINSOCK.CPP程序8 利用原始套接字捕获并解析双协议栈下IPv6数据包程序名:AnalyzeIPv6_WINSOCK.CPP程序9 利用原始套接字捕获并解析TCP数据包程序名:AnalyzeTCP_WINSOCK.CPP程序10 利用原始套接字捕获并解析UDP数据包程序名:AnalyzeUDP_WINSOCK.CPP程序11 利用原始套接字发送TCP SYN帧,对目标主机进行SYN洪水攻击程序名:SYNFlood_WINSOCK.CPP注意:本程序仅供学习参考,请不要在Internet网络上使用!程序12 采集局域网内若干台主机网络数据并分析网络流量的综合应用程序可执行程序:LANSecrutiny.exe程序运行情况: 程序源代码:LANSecrutiny.rar编说明如下:1结构体说明在程序中,我们将要进行分析的各数据包头格式用结构体进行定义。这样便于对数据包的解析,使每个字段清楚易懂。以太帧头格式结构体,共14个字节:typedef struct ether_header unsigned char ether_dhost6; /目的MAC地址unsigned char ether_shost6; /源MAC地址unsigned short ether_type; /协议类型ETHHEADER,*PETHHEADER;IPv4报头格式结构体,共20个字节: typedef struct ipv4_header unsigned char ver_ihl; /版本 (4 bits) + 首部长度 (4 bits)unsigned char tos; /服务类型unsigned short tlen; /数据报总长度unsigned short identification; /标识unsigned short flags_fo; /标志 (3 bits) + 片偏移 (13 bits) unsigned char ttl; /生存时间unsigned char proto; /协议unsigned short crc; /首部校验和u_char ip_src4; /源IP地址u_char ip_dst4; /目的IP地址 IPHEADER,*PIPHEADER;IPv6报头格式结构体,共40个字节:typedef struct ipv6_header u_char ver_tf; /版本号(4 bit)u_char traffic; /优先级(8 bit)u_short label; /流标识(20 bit)u_char length2; /报文长度(16 bit)u_char next_header; /下一头部(8 bit)u_char limits; /跳数限制(8 bit)u_char Srcv616; /源IPv6地址(128 bit)u_char Destv616; /目的IPv6地址(128 bit)IPv6_HEADER,*PIPv6_HEADER;TCP报头格式结构体,共20个字节:typedef struct tcp_header WORD SourPort; /源端口号WORD DestPort; /目的端口号DWORD SeqNo; /序号DWORD AckNo; /确认序号BYTE HLen; /首部长度(保留位)BYTE Flag; /标识(保留位)WORD Window; /窗口大小WORD ChkSum; /校验和WORD UrgPtr; /紧急指针TCPHEADER,*PTCPHEADER;UDP报头格式结构体,共8个字节:typedef struct udp_header u_short sport; /源端口号u_short dport; /目的端口号u_short len; /数据报长度u_short crc; /校验和UDPHEADER,*PUDPHEADER;2程序说明程序1 利用WinPcap函数库函数解析捕获数据包的以太帧头程序名:AnalyzeETH_WinPcap.CPP该程序通过利用WinPcap提供的捕获数据包函数,对网络中的数据包进行采集分析。WinPcap中提供的函数pcap_open_live()可以获取网络适配器,通过函数pcap_loop(pcap_t* p,int cnt,pcap_handle dispatch_handle,u_char* user)直接深入到数据链路层进行网络数据的捕获,将捕获的数据传到函数dispatch_handle(u_char *,const pcap_pkthdr *header,const u_char *pkt_data)中,该函数的参数pkt_data指向的即是捕获的数据包。这样,我们可以捕获局域网内数据链路层的以太帧,并按照以太帧头格式对数据包进行解析,以获得以太帧头中的有关信息。同时将捕获数据存入磁盘中。通过该程序,可以分析出局域网内传输的各类网络层数据包的情况。程序完整代码详见程序1(AnalyzeETH_WinPcap.CPP)。程序2 利用WinPcap函数库函数解析捕获的IPv4数据报包头程序名:AnalyzeIPv4_WinPcap.CPP该程序同样通过WinPcap提供的函数,获取网络适配器,利用函数pcap_loop(pcap_t* p,int cnt,pcap_handle dispatch_handle,u_char* user)捕获数据包。并将捕获的数据传到函数dispatch_handle(u_char *,const pcap_pkthdr *header,const u_char *pkt_data)中,在该函数中对以太帧包进行过滤,将以太帧头中协议类型字段(ether_type)中值为0x0800的数据包进行解析,即可得到整个IPv4分组的信息,其中从IPv4数据报头开始的前20个字节为IPv4包头信息字段。同时将解析出的相关数据字段存入磁盘中。通过该程序,可以分析局域网内各主机的网络使用情况。程序完整代码详见程序2(AnalyzeIPv4_WinPcap.CPP)。程序3 利用WinPcap函数库函数解析捕获的IPv6数据报包头程序名:AnalyzeIPv6_WinPcap.CPP由于WinPcap提供的函数可以深入到数据链路层去捕获数据包,因此无论是IPv4数据包还是IPv6数据包都是被封装在以太帧头中,因此都能够被捕获。本程序利用WinPcap提供的函数,实现了过滤捕获并解析在纯IPv6环境或双协议栈环境下传输的IPv6数据包。捕获的数据包以太帧头中协议类型(ether_type)字段值为0x86DD,则该数据包为纯IPv6环境下传输的IPv6数据包,将随后的40个字节按照IPv6包头格式解析,即可得到IPv6包头中携带的信息。对捕获的数据包进行过滤,在过滤出的IPv4数据包中分析IPv4包头,其中proto字段值为0x29的数据包即为双协议栈下IPv6数据包,于是将IPv4包头后的40个字节按照IPv6包头格式解析,即可得到IPv6包头中携带的信息。同样,解析过程都在函数dispatch_handle(u_char *,const pcap_pkthdr *header,const u_char *pkt_data)中进行。if(eth_header-Etype0=0x86 & eth_header-Etype1=0xDD) /纯IPv6环境下传输的IPv6数据包else if(eth_header-Etype0=0x08 & eth_header-Etype1=0x00) if(ip_header-prote=0x29) /双协议栈环境下传输的IPv6数据包该程序还进一步对IPv6中封装的TCP、ICMPv6、UDP包头进行了解析,其中TCP、UDP包头格式与IPv4版本中的相同。通过该程序,可以捕获不同网络环境下封装的IPv6数据包,并进行分析。完整代码详见程序3(AnalyzeIPv6_WinPcap.CPP)。程序4 利用WinPcap函数库函数解析捕获的TCP数据报包头程序名:AnalyzeTCP_WinPcap.CPP该程序通过利用WinPcap提供的函数pcap_loop(pcap_t* p,int cnt,pcap_handle dispatch_handle,u_char* user)将数据包捕获。并在dispatch_handle(u_char *,const pcap_pkthdr *header,const u_char *pkt_data)中通过编写代码实现解析。由于pkt_data中存放的是整个以太帧,因此只要将指针跳到TCP包头开始处,然后按照TCP包头格式解析就可以读出其中信息。程序中在解析数据包的同时,将解析结果存放到磁盘文件中。该程序通过对TCP包头的解析,并进行分析,可以推断网络中是否存在某些网络攻击行为。完整代码详见程序4(AnalyzeTCP_WinPcap.CPP)。程序5 利用WinPcap函数库函数解析捕获的UDP数据报包头程序名:AnalyzeUDP_WinPcap.CPP该程序与AnalyzeTCP.CPP程序基本一样,通过利用WinPcap提供的函数pcap_loop(pcap_t* p,int cnt,pcap_handle dispatch_handle,u_char* user)将数据包捕获,并在dispatch_handle(u_char *,const pcap_pkthdr *header,const u_char *pkt_data)中通过编写代码实现解析。只要将指针改为跳到UDP包头开始处,然后按照UDP包头格式解析就可以读出其中信息。程序中在解析数据包的同时,将解析结果存放到磁盘文件中。完整代码详见程序5(AnalyzeUDP_WinPcap.CPP)。程序6 利用WinPcap函数库函数发送TCP SYN帧数据报,进行SYN洪水攻击程序名:SYNFlood_WinPcap.C.txt功能强大的WinPcap函数库不但能够捕获网络中的数据,还能利用它提供的函数,发送自己构造数据链路层的数据报。因此,在本程序中,我们自己构造了一个SYN帧TCP数据报,并将其封装到我们自己构造的IP报头和以太帧头中,其中IP报头中的源IP地址(程序中设为1.1.1.1)和以太帧头中的源MAC地址(程序中设为 0x00,0x00,0x00,0x00,0x00,0x00)都是伪造的不存在的地址。将大量请求联接的数据报源源不断地发送到目标主机,而对方无法把回应数据报传回源主机,这样就实现了对主机进行SYN洪水攻击了。程序中的关键在于,封装在数据报中的校验和必须正确,否则目标主机不会做任何反映。因此,程序中实现了一个计算校验和的函数,用于计算IP报头和TCP报头中的校验和字段。校验和函数代码如下:inline USHORT checksum(USHORT *buffer, int size) unsigned long cksum=0; while(size 1) cksum+=*buffer+; size -=sizeof(USHORT); if(size ) cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum & 0xffff); cksum += (cksum 16); return (USHORT)(cksum); 在计算IP校验和时,buffer中存放的是IP报头数据,而在计算TCP校验和时,buffer中存放的是TCP伪头部和TCP头部数据。将构造好的数据报通过函数pcap_sendqueue_queue(pcap_send_queue *squeue,struct pcap_pkthdr *pktheader,u_char *pktdata)放到发送队列中,再利用函数pcap_sendqueue_transmit(pcap_t *outdesc, pcap_send_queue *squeue,int sync)向目标主机发送。即可实现SYN Flood攻击。完整代码详见程序6(SYNFlood_WinPcap.CPP)。程序7 利用原始套接字捕获并解析IPv4数据包程序名:AnalyzeIPv4_WINSOCK.CPP该程序通过使用原始套接字过滤并捕获IPv4数据包,并对捕获数据包进行解析。程序分为三部分,其中在函数InitWinsock2()内初始化Winsock2。在函数BindSocket()内,利用winsock2提供的函数WSASocket()建立套接字,由于只有原始套接字可以深入到网络层捕获数据包,因此WSASocket(int af,int type,int protocol,LPWSAPROTOCOL_INFO lpPorotocolInfo,GROUP g,DWORD dwFlags)中参数type要设为SOCK_RAW。因为是捕获IP数据包,参数protocol设为IPPROTO_IP。然后将套接字进行绑定。这样就可以对网络进行监听,捕获网络中的IPv4数据包了。在函数RecieveIPv4()函数中,对捕获的数据进行解析。完整代码详见程序AnalyzeIPv4_WINSOCK.CPP。程序8 利用原始套接字捕获并解析双协议栈下IPv6数据包程序名:AnalyzeIPv6_WINSOCK.CPP该程序通过使用原始套接字过滤并捕获双协议栈下IPv6数据包,并对捕获数据包进行解析。与程序AnalyzeIPv4_WINSOCK.CPP一样,本程序分为四部分,分别完成初始化套接字,建立并绑定套接字,捕获数据包并分析。因为IPv6数据包封装在IPv4包头中,因此套接字按IPv4套接字的建立,即WSASocket(int af,int type,int protocol,LPWSAPROTOCOL_INFO lpPorotocolInfo,GROUP g,DWORD dwFlags)中参数af设为AF_INET,参数type要设为SOCK_RAW。因为是捕获IP数据包,参数protocol设为IPPROTO_IP。完整代码详见程序AnalyzeIPv6_WINSOCK.CPP。程序9 利用原始套接字捕获并解析TCP数据包程序名:AnalyzeTCP_WINSOCK.CPP该程序通过使用原始套接字过滤并捕获TCP数据包,并对捕获数据包进行解析。与程序AnalyzeIPv4_WINSOCK.CPP一样,对套接字进行初始化、建立并绑定后,在RecieveTCP()函数中获取TCP数据包字段,按照TCP包头格式解析,可获取完整的TCP数据包数据。完整代码详见程序AnalyzeTCP_WINSOCK.CPP。程序10 利用原始套接字捕获并解析UDP数据包程序名:AnalyzeUDP_WINSOCK.CPP该程序通过使用原始套接字过滤并捕获UDP数据包,并对捕获数据包进行解析。与程序AnalyzeTCP_WINSOCK.CPP一样,对套接字进行初始化、建立并绑定后,在RecieveTCP()函数中获取TCP数据包字段,按照TCP包头格式解析,可获取完整的TCP数据包数据。完整代码详见程序AnalyzeUDP_WINSOCK.CPP。程序11 利用原始套接字发送TCP SYN帧,对目标主机进行SYN洪水攻击程序名:SYNFlood_WINSOCK.CPP本程序利用原始套接字发送TCP数据包,对目标主机进行SYN Flood攻击。程序中函数socket(AF_INET,SOCK_RAW,IPPROTO_IP);将套接字设为原始套接字。并通过函数setsockopt(SOCKET s,int level,int optname,const char*optval,int optlen);设置头包含选项,其中IP_HDRINCL是IPPROTO_IP选项级别,若将IP_HDRINCL选项设为TRUE,发送函数会将IPv4头包含在自己发送的数据前面,因此,在调用一个Winsock发送函数时,必须在数据前面包含完整的IPv4头。与WinPcap不同的是,原始套接字只能深入到网络层,故只需构造IPv4包头和TCP包头。将构造好的、计算出正确校验和的数据包放入缓冲区,通过sendto(SOCKET s,const char *buf,int len,int flags,const struct sockaddr *to,int tolen)向目标主机发送,即达到攻击目的。程序12 采集局域网内若干台主机网络数据并分析网络流量的综合应用程序程序名:LANSecrutiny本程序分为几个模块:探测局域网内运行主机;后台采用动态链表存放采集到所需的网络数据;图示局域网及每台主机的网络流量随时间的折线变化;监听结束后多线程进行数据存盘。?探测局域网内运行主机要对局域网内主机进行监听,采集其网络数据,首先必须知道局域网内正在运行的主机。为迅速获得主机是否处于运行状态的消息,只要向局域网内所有主机发送ARP数据包,并根据回应的数据报分析,即可得到答案。因为一局域网的网关和子网掩码是已知的,因此,我们可以计算出这一局域网的IP地址范围。在本程序中,我们利用WinPcap提供的发送数据报函数pcap_sendpacket(pcap_t *adhandle,unsigned char*sendbuf,int size),向所有主机分别发送自己构造的请求ARP数据报,捕获回应的ARP数据报并解析,即可获知网内运行主机的MAC地址及IP地址。详细代码见程序13中LANSecrutinyDlg.CPP文件内SendARPtoGetIP()函数。利用此方法,可使该程序在不同网段使用,增强了程序的灵活性。?采用动态链表存放采集到的网络数据为使程序具有良好的伸缩性,能根据网络数据采集情况动态的分配内存,不致造成内存浪费或内存空间过小的情况发生。在本程序中,我们将采集的所需数据存放到链表中。在函数dispatch_handle(u_char *,const pcap_pkthdr *header,const u_char *pkt_data)中,我们按照前述几个程序中对数据报解析的方法,将捕获数据报个报头中的所需数据提取出来,并存入一个链表节点中。然后将该存放完数据的节点插入到链表的结尾处。本程序设计为可以将IPv4数据报数据和IPv6数据报数据存放如同一链表中,而IPv4地址为32位,IPv6地址为128位。因此我们将节点中存放IP地址的元素设置为一个有17个元素的数组,将数组的第一个元素IPaddr0作为判断值。如果是IPv4数据报,则IPaddr0的值为0,并将IPv4地址放入随后的4个元素中,如果是IPv6数据报,则IPaddr0的值为1,并将IPv6地址放入随后的16个元素中。由于ICANN为01023端口各命名了一个端口名。因此,我们在程序中,通过函数getportname()为有端口名的端口查找其端口名,这样便进一步了解数据包的高层协议类型。void getportname(int portn,char portch,char *protocol) if(getservbyport(htons(portn),protocol)!=NULL)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生产过程质量管理制度
- 联合环保资金管理制度
- 维修车间培训管理制度
- 职业军人薪酬管理制度
- 知乎公司应酬管理制度
- 美容企业设备管理制度
- 村庄土地入市方案(3篇)
- 商场ups管理制度
- 物资分配方案(3篇)
- 周目标工作管理制度
- 高内涵细胞分析系统应用
- 2025益阳市赫山区中小学教师招聘考试试题及答案
- 2025年原发性高血压知识试题
- 2025年中国建筑钢结构产品市场调查研究报告
- 诊所合伙投资协议书
- 2025年吉林省彩虹人才开发咨询服务公司招聘笔试参考题库附带答案详解
- 推动变革实现企业扁平化管理
- 中国工业软件行业发展分析及发展趋势与投资前景预测研究报告2025-2028版
- 金融监管沙盒模拟测试
- 《2025年拍卖师职业资格考试核心考点预测》
- 2025年全国低压电工作业证(复审)考试练习题库(600题)附答案
评论
0/150
提交评论