IP数据包的捕获与解析教学提纲

上传人:鲁** 文档编号:569334693 上传时间:2024-07-28 格式:PPT 页数:28 大小:776KB
返回 下载 相关 举报
IP数据包的捕获与解析教学提纲_第1页
第1页 / 共28页
IP数据包的捕获与解析教学提纲_第2页
第2页 / 共28页
IP数据包的捕获与解析教学提纲_第3页
第3页 / 共28页
IP数据包的捕获与解析教学提纲_第4页
第4页 / 共28页
IP数据包的捕获与解析教学提纲_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《IP数据包的捕获与解析教学提纲》由会员分享,可在线阅读,更多相关《IP数据包的捕获与解析教学提纲(28页珍藏版)》请在金锄头文库上搜索。

1、IP数据包的捕获与解析编写程序捕获IP数据包,并将解析的结果显示出来本例中,我们要对IP包头除选项字段外的内容进行解析关键问题初始化socket(创建)使用socket()函数来给应用程序创建一个套接字SOCKET socket(int af,int type,int protocol);Socket使用的协议族使用的协议族TCP/IP为AF_INETSocket类型,有三种,类型,有三种,本程序采用本程序采用rawSocket使用的协议,本使用的协议,本程序为程序为IPPROTO_IP关键问题初始化socket(创建)具体代码SOCKET sock=socket(AF_INET,SOCK_R

2、AW,IPPROTO_IP); if(sock=INVALID_SOCKET) . 关键问题初始化socket(绑定)socket()创建了一个套接口后,需要将该套接口与该主机上提供服务的某端口联系在一起,bind()函数用于完成这样的绑定int bind(SOCKET s,const struct sockaddr FAR * name,int namelen);刚才创建的刚才创建的Socket的名称的名称sockaddr_in结构的socket地址(点这里)地址参数(name)的长度Sockaddr_in结构:structsockaddr_inshortintsin_family;/*通信

3、类型*/unsignedshortintsin_port;/*端口,2bytes*/structin_addrsin_addr;/*IP,4bytes*/unsignedcharsin_zero8;/*填充空白信息*/;in_addr结构定义如下:structin_addrunsignedlongs_addr;返回AF_INETsin_portsin_addrsin_zero关键问题初始化socket(创建/绑定)char hostName128; gethostname(hostName,100); hostent *pHostIP; gethostbyname(hostName); soc

4、kaddr_in host_addr; host_addr.sin_family=AF_INET; host_addr.sin_port=htons(6000); host_addr.sin_addr=*(in_addr *)pHostIP-h_addr_list0;if(bind(sock,(PSOCKADDR)&host_addr,sizeof(host_addr)=SOCKET_ERROR) .关键问题设置网卡混杂模式通常,网卡不能接收mac地址不是自己的IP数据包,要想能捕获所有IP数据包,应该先将网卡的工作模式设置为“混杂”代码: DWORD dwBufferLen10; DWORD

5、 dwBufferInLen=1; DWORD dwBytesReturned=0; WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL 关键问题接收IP数据包要从套接口上接收数据,就要使用recv()函数。int recv(SOCKET s,char FAR * buf,int len,int flags);刚才创建的刚才创建的Socket的名称的名称用于接收数据的缓冲区用于接收数据的缓冲区缓冲区的长度缓

6、冲区的长度接收方式,接收方式,0表示正常接收表示正常接收关键问题接收IP数据包char buffer65535; while(捕获数据包没有结束) recv(sock,buffer,65535,0); 关键问题定义IP数据包数据结构在对IP解析前,先要构在一个IP头部的数据结构,这个结构和IP包头的结构要一一对应typedef struct union unsigned char Version; unsigned char HeadLen; ; unsigned char ServiceType; unsigned short TotalLen; unsigned short Identif

7、ier; 关键问题定义IP数据包数据结构union unsigned short Flags; unsigned short FragOffset; ; unsigned char TimeToLive; unsigned char Protocol; unsigned short HeadChecksum; unsigned int SourceAddr; unsigned int DestinAddr; unsigned char Options; ip_head;关键问题解析IP包头部字段将buffer中的内容强制转化为IP_head结构,然后将该结构中的各个字段依次取出ip_head

8、ip=*(ip_head *)buffer; cout-endl; cout版本:4)endl; cout头部长度:(ip.HeadLen &0x0f)*4)endl; cout服务类型:Priority5),Service1)&0x0f)endl; cout总长度:ip.TotalLenendl; cout标识符:ip.Identifierendl; 关键问题解析IP包头部字段cout标志位:15)&0x01),DF=14)&0x01),Mf=13)&0x01)endl; cout片偏移:(ip.FragOffset&0x1fff)endl; cout生存周期:(int)ip.TimeToL

9、iveendl; cout协议:Protocol(int)ip.Protocolendl; cout头部校验和:ip.HeadChecksumendl; cout原地址:inet_ntoa(*(in_addr *)&ip.SourceAddr)endl; cout目的IP地址:inet_ntoa(*(in_addr *)&ip.DestinAddr)endl; 流程图命令行参命令行参数正确否数正确否?Winsock启动启动创建创建socket绑定绑定socket网卡设为混杂模式网卡设为混杂模式是否捕获是否捕获IP包?包?解析解析IP包首部包首部关闭关闭socket关闭关闭Winsock输出错误

10、信息输出错误信息源代码#include#include #include /加载ws2_32.lib#pragma comment(lib,ws2_32) #define IO_RCVALL _WSAIOW(IOC_VENDOR,1) typedef struct IP_HEAD union unsigned char Version; /版本(字节前4位) unsigned char HeadLen;/头部长度(后4位) ; unsigned char ServiceType; /服务类型unsigned short TotalLen; /总长度unsigned short Identifi

11、er; /标识符union unsigned short Flags; /标志位(字前3位) unsigned short FragOffset; ; /片偏移(后13位)unsigned char TimeToLive; /生存时间unsigned char Protocol; /协议unsigned short HeadChecksum;/头部校验和 unsigned int SourceAddr; /源IP地址unsigned int DestinAddr; /目的IP地址unsigned char Options; /选项ip_head;void main(int argc,char

12、*argv) if(argc!=2) /检查命令行参数 coutendl“输入格式:PackParse packet_sumendl; return; /启动winsockWSADATA WSAData; if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0) coutendl“WSASTartup 启动失败!endl; return; /创建Socket,这里是原始socketSOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP); if(sock=INVALID_SOCKET) coutendl“创建 Socket 失败

13、!endl; return; /获得本地主机名 char hostName128; if(gethostname(hostName,100)=SOCKET_ERROR) coutendl“获得主机名失败!endl; return; /获取本机IP地址 hostent *pHostIP; if(pHostIP=gethostbyname(hostName)=NULL) coutendl“获取主机地址失败!h_addr_list0;/socket绑定if(bind(sock,(PSOCKADDR)&host_addr,sizeof(host_addr)=SOCKET_ERROR) coutendl

14、“绑定失败!endl; return; /设置网卡为“混杂”模式,接收所有数据包 DWORD dwBufferLen10; DWORD dwBufferInLen=1; DWORD dwBytesReturned=0; if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)=SOCKET_ERROR) coutendlWSAIoctl failed!endl; return; coutendl开始解析I

15、P包:endl; char buffer65535; /设置缓冲区大小int packsum=atoi(argv1); for(int i=0;i0) ip_head ip=*(ip_head *)buffer; /逐步解析IP头部的各个字段cout-endl; cout版本:4)endl; cout头部长度:(ip.HeadLen &0x0f)*4)endl; cout服务类型:Priority5) ,Service 1)&0x0f)endl; cout总长度:ip.TotalLenendl; cout标识符:ip.Identifierendl; cout标志位:15)&0x01), DF=

16、14)&0x01),Mf=13)&0x01)endl; cout片偏移:(ip.FragOffset&0x1fff)endl; cout生存周期:(int)ip.TimeToLiveendl; cout协议:Protocol(int)ip.Protocolendl; cout头部校验和:ip.HeadChecksumendl; cout原地址:inet_ntoa(*(in_addr *)&ip.SourceAddr)endl; cout目的IP地址:inet_ntoa(*(in_addr *)&ip.DestinAddr)endl; closesocket(sock); /关闭socketWSACleanup(); /关闭winsock作业1、修改本程序,让程序在接收到击Ctrl+C键时,停止IP数据包的捕获2、在1的基础上,进一步改进程序,将解析结果写入输出文件命令行格式如下:PackParse output_file其中,output_file为输出文件3、要求撰写说明文档,包括开发思路,工作流程,关键问题和进一步改进等

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号