C pcap 802.11标头

时间:2011-11-13 11:23:44

标签: c wireless pcap sniffing

 struct mgmt_header_t {
    u_int16_t   fc;     /* 2 bytes */
    u_int16_t   duration;   /* 2 bytes */
    u_int8_t    da[6];      /* 6 bytes */
    u_int8_t    sa[6];      /* 6 bytes */
    u_int8_t    bssid[6];   /* 6 bytes */
    u_int16_t   seq_ctrl;   /* 2 bytes */
};

void my_callback(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
    //printf("********* New Packet Arrived *********\n");
    //printf("Jacked a packet with length [%d]\n", header->len);    

    struct mgmt_header_t *mac_header = (struct mgmt_header_t *) (packet+24);
    if (mac_header->fc > 255 )
        printf("comon");

我知道mac_header是在正确的位置,因为我从它获取mac地址并且它们是正确的但问题是fc它永远不会大于255所以总是左边的字节为零

更新:


我想我现在得到了感谢你和ott-- 供参考这里是我的完整示例http://pcap-wireless.blogspot.com/2011/11/post-2-80211-mac-header.html

2 个答案:

答案 0 :(得分:5)

引用IEEE Std 802.11-2007的第7.1.1节“惯例”:

  

在图中,字段内的所有位都编号,从0到k,其中字段的长度是k + 1位。字段内的八位字节边界可以通过取模数字8的位数来获得。数字字段中比单个八位字节长的八位字节以重要性的递增顺序描绘,从最低编号位到最高编号位。长度超过单个八位字节的字段中的八位字节按从包含最低编号位的八位字节到包含最高编号位的八位字节的顺序发送到PLCP。

“长度超过单个八位字节的字段中的八位字节按从包含最低编号位的八位字节到包含最高编号位的八位字节的顺序发送到PLCP。”表示字段以 - 印第安顺序传输,而不是 - 印第安顺序。因此,值为0x0080的16位字段将作为八位字节(字节)传输,其值为0x80,后跟一个值为0x00的八位字节。

这意味着在Wiretap十六进制转储中,您将看到80 00,但这意味着0x0080,而不是0x8000。

BTW,请注意radiotap header不能保证长度为24个字节;标题包括一个(小端)长度字段,指定标题的长度。

答案 1 :(得分:0)

fc字段的前8位,或者当它是关联请求时为零。但是,你不是通过分配(数据包+24)来跳过标题吗?你能添加数据包前32个字节的hexdump吗?