【问题标题】:C pcap 802.11 headerC pcap 802.11 标头
【发布时间】:2011-11-14 16:22:22
【问题描述】:
 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

【问题讨论】:

    标签: c wireless pcap sniffing


    【解决方案1】:

    引用IEEE Std 802.11-2007的第7.1.1节“约定”:

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

    “字段中长于单个八位字节的八位字节按从包含最低编号位的八位位组到包含最高编号位的八位位组的顺序发送到 PLCP。”表示字段以 little-endian 顺序传输,而不是 big-endian 顺序。因此,一个值为 0x0080 的 16 位字段将作为一个值为 0x80 的八位字节(字节)传输,然后是一个值为 0x00 的八位字节。

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

    顺便说一句,请注意 radiotap header 不保证为 24 字节长;标头包含一个 (little-endian) 长度字段,指定标头的长度。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我没有跳过一个长度为 24 字节的 Radiotap 标头,但我需要您的帮助,这可能与数字的存储方式(大端序)有关,我正在查看数据包上的 wireshark它是 8000(十六进制),但 wirehark 将其读取为 0x0080
      • 0x0080 没问题,wireshark 是否将其识别为信标?
      猜你喜欢
      • 2011-12-27
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多