winpcap捕捉到的包,分析时出的有关问题
winpcap捕捉到的包,分析时出的问题
void packet_handler(u_char * param,const struct pcap_pkthdr * header,const u_char * pkt_data)
{
if(kbhit())
return ;
//struct tm * ltime;
//char timestr[16];
////转换时间戳格式
//ltime = localtime(&header-> ts.tv_sec);
//strftime(timestr,sizeof(timestr), "%H:%M:%S ",ltime);
//printf( "%s,%.6d len:%d \n ",timestr,header-> ts.tv_usec,header-> len);
pEH = (EthernetHdr *)pkt_data;
printf( "%x-%x-%x-%x-%x-%x ",
pEH-> srcaddr[0],pEH-> srcaddr[1],pEH-> srcaddr[2],pEH-> srcaddr[3],pEH-> srcaddr[4],pEH-> srcaddr[5]);
printf( "---------- ");
printf( "%x-%x-%x-%x-%x-%x ",
pEH-> destaddr[0],pEH-> destaddr[1],pEH-> destaddr[2],pEH-> destaddr[3],pEH-> destaddr[4],pEH-> destaddr[5]);
printf( "protocol:%x ",pEH-> protype);
printf( "\n ");
Sleep(200);
}
//以太网帧头部
//类型0800 IP数据报
//类型0806 ARP请求/应答
//类型8035 RARP请求/应答
typedef struct _ethernethdr
{
unsigned char destaddr[6]; //6byte的目的硬件地址
unsigned char srcaddr[6]; //6byte的源硬件地址
unsigned short protype; //2byte的协议类型
}EthernetHdr;
分析的结果,协议显示的都6488或是608,是哪个出的问题呢。
------解决方案--------------------
你是用ADSL抓的报文。
1、你应该定义一个PPPOE头,在这个位置是8864(联通以后就是这个)或者8863(发现阶段,拨号之前)。
2、608就是ARP请求报文,你没有转换字节序,因此看着是608。用会htons函数转换一下即可出现0806了。
PPPOE的头:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DESTINATION_ADDR |
| (6 octets) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SOURCE_ADDR |
| (6 octets) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ETHER_TYPE (2 octets) |
| 0x8863 or 0x8864 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| PPPOE Header |
| (6 octets) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~ ~
~ payload ~
~ ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| CHECKSUM |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
void packet_handler(u_char * param,const struct pcap_pkthdr * header,const u_char * pkt_data)
{
if(kbhit())
return ;
//struct tm * ltime;
//char timestr[16];
////转换时间戳格式
//ltime = localtime(&header-> ts.tv_sec);
//strftime(timestr,sizeof(timestr), "%H:%M:%S ",ltime);
//printf( "%s,%.6d len:%d \n ",timestr,header-> ts.tv_usec,header-> len);
pEH = (EthernetHdr *)pkt_data;
printf( "%x-%x-%x-%x-%x-%x ",
pEH-> srcaddr[0],pEH-> srcaddr[1],pEH-> srcaddr[2],pEH-> srcaddr[3],pEH-> srcaddr[4],pEH-> srcaddr[5]);
printf( "---------- ");
printf( "%x-%x-%x-%x-%x-%x ",
pEH-> destaddr[0],pEH-> destaddr[1],pEH-> destaddr[2],pEH-> destaddr[3],pEH-> destaddr[4],pEH-> destaddr[5]);
printf( "protocol:%x ",pEH-> protype);
printf( "\n ");
Sleep(200);
}
//以太网帧头部
//类型0800 IP数据报
//类型0806 ARP请求/应答
//类型8035 RARP请求/应答
typedef struct _ethernethdr
{
unsigned char destaddr[6]; //6byte的目的硬件地址
unsigned char srcaddr[6]; //6byte的源硬件地址
unsigned short protype; //2byte的协议类型
}EthernetHdr;
分析的结果,协议显示的都6488或是608,是哪个出的问题呢。
------解决方案--------------------
你是用ADSL抓的报文。
1、你应该定义一个PPPOE头,在这个位置是8864(联通以后就是这个)或者8863(发现阶段,拨号之前)。
2、608就是ARP请求报文,你没有转换字节序,因此看着是608。用会htons函数转换一下即可出现0806了。
PPPOE的头:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| DESTINATION_ADDR |
| (6 octets) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SOURCE_ADDR |
| (6 octets) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ETHER_TYPE (2 octets) |
| 0x8863 or 0x8864 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| PPPOE Header |
| (6 octets) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
~ ~
~ payload ~
~ ~
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| CHECKSUM |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+