阅读:1649回复:12
包捕获后怎么取出做协议分析?
我用winpcap 捕获了包,要进一步进行协议分析,不大明白怎么把捕获的包取出来,请教高手~~!
|
|
沙发#
发布于:2004-05-08 19:59
捕获报文得首先知道该报文的协议,然后用相应的报文格式去parse,
eg,ARP报文 PPACKET_ARP pArp = (PPACKET_ARP) pCapturedPacket; ... |
|
板凳#
发布于:2004-05-08 21:50
谢谢。但我用的是PacketReceivePacket系列的函数,不晓得要怎么弄哦?
|
|
地板#
发布于:2004-05-09 12:52
谢谢。但我用的是PacketReceivePacket系列的函数,不晓得要怎么弄哦? LPPACKET lpPacket; PacketReceivePacket(lpAdapter,lpPacket,TRUE); buf = (char *)lpPacket->Buffer; buf就是包的内容.......-_-....忽然发现分好少哦。。hoho [编辑 - 5/9/04 by zxcasd] |
|
|
地下室#
发布于:2004-05-09 17:44
不好意思哦,继续问。如果回答了,我可以重新开贴给分。请多指教~!
下面这段代码 void DecodeEther(LPPACKET lpPacket) { char *buf,packet; // struct bpf_hdr *hdr; // u_int off=0,tlen; ETHERNET_HEADER *pEtherHead; IP_HEADER *pIPHead; buf =(char *) lpPacket->Buffer; // hdr=(struct bpf_hdr *)(buf+off); // tlen=hdr->bh_caplen; // off+= hdr->bh_hdrlen; // off=Packet_WORDALIGN(off+tlen); packet=*buf; pEtherHead=(ETHERNET_HEADER *)packet; int EthHdrLen=sizeof(ETHERNET_HEADER);//以太帧头部长度 //取源MAC地址 printf(\"srcMAC地址:%02X-%02X-%02X-%02X-%02X-%02X:\",pEtherHead->src_mac[0],pEtherHead->src_mac[1],pEtherHead->src_mac[2],pEtherHead->src_mac[3],pEtherHead->src_mac[4],pEtherHead->src_mac[5]); printf(\"\\n\"); //取目的MAC地址 printf(\"desMAC地址:%02X-%02X-%02X-%02X-%02X-%02X:\",pEtherHead->des_mac[0],pEtherHead->des_mac[1],pEtherHead->des_mac[2],pEtherHead->des_mac[3],pEtherHead->des_mac[4],pEtherHead->des_mac[5]); printf(\"\\n\"); //int pType=pEtherHead->type[0]*0x100+pEtherHead->type[1]; //求协议类型 unsigned short pType = *(unsigned short *)pEtherHead->type; switch(pType) { case IP: //解ip包 是什么地方有问题呢?如果这个函数写完了,应该放在 while(!kbhit()) { // capture the packets if(PacketReceivePacket(lpAdapter,lpPacket,TRUE)==FALSE){ printf(\"Error: PacketReceivePacket failed\"); return (-1); } 之后吗? 包结构定义如下: typedef struct ETHERNET_HEADER { byte des_mac[6]; //接收端的MAC地址 byte src_mac[6]; //发送端的MAC地址 byte type[2]; //类型字段 }ETHERNET_HEADER; typedef struct IP_HEADER { byte ver_len; //版本4位,头长度4位,报头长度以32位为一个单位 byte type; //类型8位 byte length[2]; //总长度,16位,指出报文的以字节为单位的总长度,报文长度不能超过65536个字接,否则认为报文遭到破坏 byte id[2]; //报文标示,用于多于一个报文16位 byte flag_offset[2];//标志,3位 数据块偏移13位 byte time; //生存时间,8位 byte protocol; //协议,8位 byte crc_val[2]; //头校验和,16位 byte src_addr[4]; //源地址,32位 byte des_addr[4]; //目标地址,32位 byte options[4]; //选项和填充,32位 }IP_HEADER; 谢谢大虾们了。小女子是菜菜菜鸟,多多关照。我会另开帖送分的! |
|
5楼#
发布于:2004-05-09 20:01
你是不是想这样
while(!kbhit()) { // capture the packets if(PacketReceivePacket(lpAdapter,lpPacket,TRUE)==FALSE){ printf(\"Error: PacketReceivePacket failed\"); return (-1); } else{ buf=(char *)lpPacket->Buffer; //这里调用你写的函数对包分析 } } |
|
|
6楼#
发布于:2004-05-09 21:19
我觉得应该不是else的关系。就是捕获包以后对每个包进行分析就是了,我太菜了,所以不晓得该放哪里。上面的函数编译没错,但执行不了。
|
|
7楼#
发布于:2004-05-09 22:23
我觉得应该不是else的关系。就是捕获包以后对每个包进行分析就是了,我太菜了,所以不晓得该放哪里。上面的函数编译没错,但执行不了。 是用else没错的,if是先执行的也就是说在if里取包,在else里分析包,不信你试试:) |
|
|
8楼#
发布于:2004-05-10 15:14
你的else后面的那行代码在我的函数里有了,那是不是我直接在else后面调用就行了?
我这样做了,但是还是不行。 我觉得是解包函数没写对哦。。。。。。 真不好意思了,麻烦你了。再帮忙看看。 |
|
9楼#
发布于:2004-05-10 16:40
你的else后面的那行代码在我的函数里有了,那是不是我直接在else后面调用就行了? 没错直接用你的函数分析就可以了。我不知道你说的不行具体指什么,你可以在函数里断点调试一把看看 首先得确定if里取包是不是返回true,如果是的话肯定会执行else的。 [编辑 - 5/10/04 by zxcasd] |
|
|
10楼#
发布于:2004-05-16 22:36
关注中,帮你顶一下:)
|
|
11楼#
发布于:2004-05-17 09:35
呵呵,还是没弄好。有什么好的意见或建议可以给我,分我是不会吝啬的。
|
|
12楼#
发布于:2004-05-18 20:27
俺也不会,关注中
|
|
|