PPI数据包解析PCAP



我以PPI框架格式解析数据包。我需要802.11 Mac PHY字段,在公共字段之后,我似乎在偏移中有一个错误。这是我的代码:

void process_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
int offset = 0;
const struct ppi_packetheader *ppi_header = (struct ppi_packetheader *)(packet + offset);
offset += 8;
const struct ppi_fieldheader *ppi_80211_common = (struct ppi_fieldheader *)(packet + offset);
printf("common type: %d | len: %dn", ppi_80211_common->pfh_type, ppi_80211_common->pfh_datalen);
offset += 4 + 20;
const struct ppi_fieldheader *ppi_80211_mac = (struct ppi_fieldheader *)(packet + offset);
printf("mac type: %d | len: %dn", ppi_80211_mac->pfh_type, ppi_80211_mac->pfh_datalen);
offset += 4 + 27;
const struct ppi_fieldheader *ppi_80211_mac_phy = (struct ppi_fieldheader *)(packet + offset);
printf("mac+phy type: %d | len: %dn", ppi_80211_mac_phy->pfh_type, ppi_80211_mac_phy->pfh_datalen);
}

公共字段的输出是正确的,它说类型:2,len:20。但是其他值是错误的,就像MAC字段类型:64,LEN:0(Mac Phy看起来相似)。Little/Big Endian是一个问题,还是我的错误在哪里?我一直在查看Wireshark实现,但是他们使用函数tvb_get_letohs()来偏移,这很复杂...希望有人可以提供帮助。

首先,您不是在pph_flags中查看对齐位 - 如果设置为设置,则每个字段在4字节边界上对齐,如果很明显,则该字段是字段不一定会在4字节边界上对齐。但是,802.11-common字段的长度是4的倍数,字段标头的长度也是如此,因此,虽然您应该查看该位,但不会导致此特殊问题。

,是的,"数据包标题和野外标题中的多字节整数必须存储为小末端。",因此可能存在一个字节订单问题。但是,这适用于pfh_typepfh_datalen,因此,如果您在大型计算机上,则应将这些值汇总为字节(这就是tvb_get_letohs()正在做的事情 - 它正在从wireshark buffer中获取,从而获得范围检查,buffer buffers buffs buffers buffs buffs buffs-buffs-buffs bunds-buffs-buffs-buffs-buffs-buffs-buffs-buffs-buffs-buffs-buffs-buffs-buffs in Bunds-Checking,by一个小末日,短(16位)值,并将其转换为主机字节顺序;无论该字段是否在"自然"字节边界上对齐),它显然是在小型机器上运行的(如果这是基于X86的PC(包括所有基于英特尔的Mac),您将在一台小型机器上运行),因为公共字段的输出是正确的,因此可能不会导致此特定特殊问题。

第三,但是,您不是在看ppi_header->pph_len!不能保证PPI标题中存在任何您必须查看您是否过去了PPI标头的长度。

当我在Mountain Lion的视网膜MBP上捕获,带有PPI标头时,标头长度为32字节,而存在的唯一的场是802.11 -Common Field -802.11n Mac PHY扩展字段是不是的(我们的网络是802.11n网络)。当您的代码认为它正在查看802.11n Mac Phy扩展字段时,它实际上可能是在802.11数据包中查看802.11 Mac标头。

相关内容

  • 没有找到相关文章

最新更新