关于使用winpcap发送数据包的说明
本作品内容为关于使用winpcap发送数据包的说明,格式为 docx ,大小 18557 KB ,页数为 4页
('关于使用winpcap发送数据包的说明关于使用winpcap发送数据包的说明在对网络数据包发送解析进行编程的时候,人们普遍使用的是Winsocket套接字技术,但该技术仅限于网络层及其以上的传输层,对于下层应用的不多,为了了解数据包发送的真正机制,需要使用winpcap来进行数据包发送。下面针对两种协议使用winpcap进行数据包的发送。使用winpcap发送TCP协议数据包首先本机上应该安装winpcap以及wpcap,这样才可以调用winpcap中的函数。下面针对TCP协议进行分析:由于要发送的数据必须构建以太网数据头,IP数据包头和TCP数据包头,所以待发送的数据应该如下:以太网数据头IP数据头TCP数据头数据1.定义以太网数据头结构typedefstructet_header{unsignedchareh_dst[6];//目的地址unsignedchareh_src[6];//源地址unsignedshorteh_type;//eh_type的值需要考察上一层的协议,如果为ip则为0x0800}ET_HEADER;2.定义IP数据报头typedefstructip_hdr{unsignedcharh_verlen;//ip头部长度(按4字节对齐)unsignedchartos;//服务类型unsignedshorttotal_len;//总长度(包含IP数据头,TCP数据头以及数据)unsignedcharversion:4;//一般IP类型为IPv4unsignedshortident;//ID定义单独IPunsignedshortfrag_and_flags;//标志位偏移量unsignedcharttl;//生存时间unsignedcharproto;//协议类型unsignedshortchecksum;//检查和unsignedintsourceIP;//源IP地址unsignedintdestIP;//目的IP地址}IP_HEADER;3.定义TCP数据报头typedefstructtcp_hdr{unsignedshortth_sport;//源端口unsignedshortth_dport;//目的端口unsignedintth_seq;//序列号unsignedintth_ack;//确认号unsignedcharth_lenres;//4位首部长度unsignedcharth_flag;//标志位unsignedshortth_win;//窗口大小unsignedshortth_sum;//检验和unsignedshortth_urp;//紧急指针}TCP_HEADER;上面三个结构类型中构建了数据报头的所有信息考虑到检验和的问题,需要添加一个伪首部:typedefstructtsd_hdr{unsignedlongsaddr;//源地址unsignedlongdaddr;//目的地址charmbz;//置空charptcl;//协议类型unsignedshorttcpl;//数据包长度}PSD_HEADER;以下针对信息进行处理处理流程:●获取本地机器设备列表(调用pcap_findalldevs_ex函数)如果找到网卡设备就把设备存储在interfaceName(可以自定义)变量之中,同时获取本地IP地址(最基本条件下),调用pcap_freealldevs函数释放设备。●获取本地网关的MAC地址,通过声明PPACKET_OID_DATAOidData,然后进行MAC地址分配空间OidData=(PPACKET_OID_DATA)malloc(6+sizeof(PACKET_OID_DATA)),调用OidDATA->Oid=OID_802_3_CURRENT_ADDRESS;ZeroMemory(OidData->Data,6);即可获得MAC地址●接下来对数据包的头部进行赋值,尤其要注意针对由于TCP标志位较多,可以使用位运算判断FLAG的具体值。●pcap_open(InterfaceName,100,PCAP_OPENFLAG_PROMISCUOUS,100,NULL,errbuf)该函数打开网卡设备●pcap_sendpacket(pcap_tp,Buffer,sizeof(Buffer)发送数据包,Buffer就是要发送数据包,参数p表示winpcap句柄使用Winpcap发送UDP数据包类似TCP所不同的是需要添加UDP头部数据UDP数据包头structudphdr{u_int16_tsource;/sourceportu_int16_tdest;/destinationportu_int16_tlen;/udplengthu_int16_tcheckl;/udpchecksum};为了避免重复,下面说明数据包头部信息的设置ether_headerpether_header=(ether_header)buffer;//以太网首部指针ip_headerpip_herder=(ip_header)(buffer+sizeof(ether_header));//IP数据头指针udphdrpudp_herder=(udphdr)(buffer+sizeof(ether_header)+sizeof(ip_header));//UDP数据头指针//针对以太网头部源地址进行赋值pether_header->ether_dhost[0]=1;//0x016+0x0;;pether_header->ether_dhost[1]=1;//0x216+0x1;pether_header->ether_dhost[2]=1;//0x216+0x7;pether_header->ether_dhost[3]=1;//0x216+0x3;pether_header->ether_dhost[4]=1;//0x716+0x2;pether_header->ether_dhost[5]=1;//0xf16+0xe;//针对以太网头部目的地址进行赋值pether_header->ether_shost[0]=1;//0x016+0x0;;pether_header->ether_shost[1]=1;//0x116+0xF;pether_header->ether_shost[2]=1;//0xD16+0x0;pether_header->ether_shost[3]=1;//0x116+0x6;pether_header->ether_shost[4]=1;//0x616+0x3;pether_header->ether_shost[5]=1;//0x716+0x1;//针对以太网协议进行赋值pether_header->ether_type=htons(ETHERTYPE_IP);//构建IP数据头pip_herder->ihl=sizeof(ip_header)/4;//以4字节为单位pip_herder->version=4;//设定版本号pip_herder->tos=0;//设定类型pip_herder->tot_len=htons(sizeof(buffer)-sizeof(ether_header));//设定长度pip_herder->id=htons(0x1000);//设定IDpip_herder->frag_off=htons(0);//设定偏移量pip_herder->ttl=0x80;//设定TTLpip_herder->protocol=IPPROTO_UDP;//设定协议类型pip_herder->check=0;//设定检验和pip_herder->saddr=inet_addr("192.168.18.");//设定源地址pip_herder->daddr=inet_addr("122...");//设定目的地址pip_herder->check=in_cksum((u_int16_t)pip_herder,sizeof(ip_header));//重新设定检验和//构建UDP数据头;pudp_herder->dest=htons(7865);//目的端口号pudp_herder->source=htons(2834);//源端口号pudp_herder->len=htons(sizeof(buffer)-sizeof(ether_header)-sizeof(ip_header));//设定长度pudp_herder->checkl=0;//设定检验和//构造伪UDP首部charbuffer2[64]={0};Psd_Headerpsd=(Psd_Header)buffer2;psd->sourceip=inet_addr("192.168.18.");psd->destip=inet_addr("122...");psd->ptcl=IPPROTO_UDP;psd->plen=htons(sizeof(buffer)-sizeof(ether_header)-sizeof(ip_header));psd->mbz=0;memcpy(buffer2+sizeof(Psd_Header),(void)pudp_herder,sizeof(buffer)-sizeof(ether_header)-sizeof(ip_header));pudp_herder->checkl=in_cksum((u_int16_t)buffer2,sizeof(buffer)-sizeof(ether_header)-sizeof(ip_header)+sizeof(Psd_Header));接下来调用pcap_open,pcap_sendpacket即可发送数据包小结:通过研究这两个协议了解了winpcap发送数据包的过程和原理,相信针对其他协议也是大同小异。',)
提供关于使用winpcap发送数据包的说明会员下载,编号:1700807022,格式为 docx,文件大小为4页,请使用软件:wps,office word 进行编辑,PPT模板中文字,图片,动画效果均可修改,PPT模板下载后图片无水印,更多精品PPT素材下载尽在某某PPT网。所有作品均是用户自行上传分享并拥有版权或使用权,仅供网友学习交流,未经上传用户书面授权,请勿作他用。若您的权利被侵害,请联系963098962@qq.com进行删除处理。