winpcap捕捉到的包,分析时出的问题

mimong_lin 2007-04-02 11:29:02
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,是哪个出的问题呢。
...全文
210 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mimong_lin 2007-04-05
  • 打赏
  • 举报
回复
1、你在打印MAC地址的时候,相当于做了一次字节序变换。你没有发现,你打印的时候,先打的数组下标为0的数,最后打最高位的。这就是字节序变换啊。
----------------------------------------------------------
这就是做了一交转换了?还真不知道呢。回去做个测试了。谢谢啊。
squiffy 2007-04-04
  • 打赏
  • 举报
回复
1、你在打印MAC地址的时候,相当于做了一次字节序变换。你没有发现,你打印的时候,先打的数组下标为0的数,最后打最高位的。这就是字节序变换啊。
2、协议分析的时候可以不变换,你就定义6488(PPPOE)、0608(ARP请求)这样不就可以了吗,不过这样总是看起来不舒服对吧?


那对于抓到的一个数据包,是不是根据那个2字节的ETHER_TYPE来判断这个包是ADSL的还是其它的?
======================================
是的。8864、8863就是PPPOE报文,PPPOE报文也是一种ethernet报文。
mimong_lin 2007-04-04
  • 打赏
  • 举报
回复
对于抓到包,里面的数据在分析的时候不用进行字节顺序转换的吧?
mimong_lin 2007-04-04
  • 打赏
  • 举报
回复
为什么在协议这个字段要进行字节顺序的变换呢?对于两个硬件地址,是不用进行变换的啊(我显示的时候没有进行变换,显示结果是和硬件地址相符)。
squiffy 2007-04-03
  • 打赏
  • 举报
回复
你是用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 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
mimong_lin 2007-04-03
  • 打赏
  • 举报
回复
那对于抓到的一个数据包,是不是根据那个2字节的ETHER_TYPE来判断这个包是ADSL的还是其它的?

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧