网络数据包捕获与应用的VC++6.0编程

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

《网络数据包捕获与应用的VC++6.0编程》美国GeneChiu基金资助网络数据包捕获与应用的VC++6.0编程研究生方松茂对以太帧头、IPv4报头、IPv6报头、TCP报头及UDP报头格式这几种常用数据报头分别利用WinPcap和原始套接字编写程序进行分析。并利用MFC类库,采用链表结构存放捕获的网络数据的方案,实现了局域网内Internet数据采集的应用程序。另外,还编写了一个利用WinPcap提供的发送数据报的函数实现SYNFlood的黑客攻击程序。现对各程序简要介绍如下:程序源代码如下:程序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函数库函数发送TCPSYN帧数据报,进行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利用原始套接字发送TCPSYN帧,对目标主机进行SYN洪水攻击程序名:SYNFlood_WINSOCK.CPP注意:本程序仅供学习参考,请不要在Internet网络上使用!程序12采集局域网内若干台主机网络数据并分析网络流量的综合应用程序可执行程序:LANSecrutiny.exe程序运行情况:程序源代码:LANSecrutiny.rar编说明如下:1.结构体说明在程序中,我们将要进行分析的各数据包头格式用结构体进行定义。这样便于对数据包的解析,使每个字段清楚易懂。以太帧头格式结构体,共14个字节:typedefstructether_header{unsignedcharether_dhost[6];//目的MAC地址unsignedcharether_shost[6];//源MAC地址unsignedshortether_type;//协议类型}ETHHEADER,*PETHHEADER;IPv4报头格式结构体,共20个字节:typedefstructipv4_header{unsignedcharver_ihl;//版本(4bits)+首部长度(4bits)unsignedchartos;//服务类型unsignedshorttlen;//数据报总长度unsignedshortidentification;//标识unsignedshortflags_fo;//标志(3bits)+片偏移(13bits)unsignedcharttl;//生存时间unsignedcharproto;//协议unsignedshortcrc;//首部校验和u_charip_src[4];//源IP地址u_charip_dst[4];//目的IP地址}IPHEADER,*PIPHEADER;IPv6报头格式结构体,共40个字节:typedefstructipv6_header{u_charver_tf;//版本号(4bit)u_chartraffic;//优先级(8bit)u_shortlabel;//流标识(20bit)u_charlength[2];//报文长度(16bit)u_charnext_header;//下一头部(8bit)u_charlimits;//跳数限制(8bit)u_charSrcv6[16];//源IPv6地址(128bit)u_charDestv6[16];//目的IPv6地址(128bit)}IPv6_HEADER,*PIPv6_HEADER;TCP报头格式结构体,共20个字节:typedefstructtcp_header{WORDSourPort;//源端口号WORDDestPort;//目的端口号DWORDSeqNo;//序号DWORDAckNo;//确认序号BYTEHLen;//首部长度(保留位)BYTEFlag;//标识(保留位)WORDWindow;//窗口大小WORDChkSum;//校验和WORDUrgPtr;//紧急指针}TCPHEADER,*PTCPHEADER;UDP报头格式结构体,共8个字节:typedefstructudp_header{u_shortsport;//源端口号u_shortdport;//目的端口号u_shortlen;//数据报长度u_shortcrc;//校验和}UDPHEADER,*PUDPHEADER;2.程序说明程序1利用WinPcap函数库函数解析捕获数据包的以太帧头程序名:AnalyzeETH_WinPcap.CPP该程序通过利用WinPcap提供的捕获数据包函数,对网络中的数据包进行采集分析。WinPcap中提供的函数pcap_open_live()可以获取网络适配器,通过函数pcap_loop(pcap_t*p,intcnt,pcap_handledispatch_handle,u_char*user)直接深入到数据链路层进行网络数据的捕获,将捕获的数据传到函数dispatch_handle(u_char*,constpcap_pkthdr*header,constu_char*pkt_data)中,该函数的参数pkt_data指向的即是捕获的数据包。这样,我们可以捕获局域网内数据链路层的以太帧,并按照以太帧头格式对数据包进行解析,以获得以太帧头中的有关信息。同时将捕获数据存入磁盘中。通过该程序,可以分析出局域网内传输的各类网络层数据包的情况。程序完整代码详见程序1(AnalyzeETH_WinPcap.CPP)。程序2利用WinPcap函数库函数解析捕获的IPv4数据报包头程序名:AnalyzeIPv4_WinPcap.CPP该程序同样通过WinPcap提供的函数,获取网络适配器,利用函数pcap_loop(pcap_t*p,intcnt,pcap_handledispatch_handle,u_char*user)捕获数据包。并将捕获的数据传到函数dispatch_handle(u_char*,constpcap_pkthdr*header,constu_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*,constpcap_pkthdr*header,constu_char*pkt_data)中进行。if(eth_header-Etype[0]==0x86&ð_header-Etype[1]==0xDD){//纯IPv6环境下传输的IPv6数据包}elseif(eth_header-Etype[0]==0x08&ð_header-Etype[1]==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,intcnt,pcap_handledispatch_handle,u_char*user)将数据包捕获。并在dispatch_handle(u_char*,constpcap_pkthdr*header,constu_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,intcnt,pcap_handledispatch_handle,u_char*user)将数据包捕获,并在dispatch_handle(u_char*,constpcap_pkthdr*header,constu_char*pkt_data)中通过编写代码实现解析。只要将指针改为跳到UDP包头开始处,然后按照UDP包头格式解析就可以读出其中信息。程序中在解析数据包的同时,将解析结果存放到磁盘文件中。完整代码详见程序5(AnalyzeUDP_WinPcap.CPP)。程序6利用WinPcap函数库函数发送TCPSYN帧数据报,进行SYN洪水攻击程序名:SYNFlood_WinPcap.C.txt功能强大的WinPcap函数库不但能够捕获网络中的数据,还能利用它提供的函数,发送自己构造数据链路层的数据报。因此,在本程序中,我们自己构造了一个SYN帧TCP数据报,并将其封装到我们自己构造的IP报头和以太帧头中,其中IP报头中的源IP地址(程序中设为1.1.1.1)和以太帧头中的源MAC地址(程序中设为0x00,0x00,0x00,0x00,0x00,0x00)都是伪造的不存在的地址。将大量请求联接的数据报源源不断地发送到目标主机,而对方无法把回应数据报传回源主机,这样就实现了对

1 / 29
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功