Radiotap信息

在Linux系统中用wireshark或tcpdump抓无线网卡数据包,每一数据帧前面都有一个叫radiotap的协议头,它包含了信号强度、噪声强度、信道、时间戳等信息。radiotap比传统的Prism或AVS头更有灵活性,成为ieee802.11事实上的标准。支持radiotap的系统较多,如Linux、FreeBSD、NetBSD、OpenBSD,还有Windows(需使用AirPcap)。它的头部定义如下:

struct ieee80211_radiotap_header {
    u_int8_t        it_version;     /* set to 0 */
    u_int8_t        it_pad;
    u_int16_t       it_len;         /* entire length */
    u_int32_t       it_present;     /* fields present */
} __attribute__((__packed__));

it_version:表示版本号,当前为0。
it_pad:没有使用,仅仅是为了结构体对齐。
it_len:表示长度,包括了radiotap头部和数据两部分,如果不需要了解radiotap,则可以直接跳到ieee802.11头部。
it_present:表示radiotap数据的位掩码。radiotap的数据紧跟其头部。当其中的位掩码为true时,表示有对应的数据,可以认为每一比特表示一种类型。比如bit5为1表示有通道数据,则可以获取到信号强度,反之就是没有对应的数据。因此,radiotap的长度其实是不固定的。bit31为1表示还有多个it_present。

radiotap的每个类型都是有严格顺序的,数据的字序是小端格式(little endian byte-order)——包括头部的it_len和it_present。

目前应用比较广的解析库是radiotap-library,在horst软件和Linux内核中都使用到。关于每个类型的解释,可以参考radiotap.h文件的ieee80211_radiotap_type注释。

通过以下方式,设置Ubuntu系统进入monitor模式:

$ sudo iw dev wlp5s0 interface add mon0 type monitor
$ sudo iw dev wlp5s0 del
$ sudo iw dev mon0 set channel 6
$ sudo ifconfig mon0 up

接着使用tcpdump抓包:

$ sudo tcpdump -i mon0 -w test.pcap
tcpdump: listening on mon0, link-type IEEE802_11_RADIO (802.11 plus radiotap header), capture size 262144 bytes
^C2288 packets captured
2344 packets received by filter
0 packets dropped by kernel
5 packets dropped by interface
然后使用wireshark分析刚抓取到的包,如下图所示:
图片描述

使用radiotap-library库解析,示例代码如下:

#include <unistd.h>
#include <stdint.h>
#include <endian.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>

#include "radiotap_iter.h"

// 根据wireshark抓包抽取的radiotap头部数据
char radiotap_buf[][18] = {
                {0x00, 0x00, 0x12, 0x00, 0x2e, 0x48,
                 0x00, 0x00, 0x00, 0x02, 0x85, 0x09,
                 0xc0, 0x00, 0xc9, 0x00, 0x00, 0x00},
                {0x00, 0x00, 0x12, 0x00, 0x2e, 0x48,
                 0x00, 0x00, 0x00, 0x02, 0x85, 0x09,
                 0xa0, 0x00, 0xa8, 0x00, 0x00, 0x00}};

#define IEEE80211_CHAN_A (IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM)
#define IEEE80211_CHAN_G (IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM)

static void print_radiotap_namespace(struct ieee80211_radiotap_iterator *iter)
{
    char signal = 0;
    uint32_t phy_freq = 0;

    switch (iter->this_arg_index) {
    case IEEE80211_RADIOTAP_TSFT:
        printf("\tTSFT: %llu\n", le64toh(*(unsigned long long *)iter->this_arg));
        break;

    case IEEE80211_RADIOTAP_FLAGS:
        printf("\tflags: %02x\n", *iter->this_arg);
        break;

    case IEEE80211_RADIOTAP_RATE:
        printf("\trate: %.2f Mbit/s\n", (double)*iter->this_arg/2);
        break;

    case IEEE80211_RADIOTAP_CHANNEL:
        phy_freq = le16toh(*(uint16_t*)iter->this_arg); // 信道
        iter->this_arg = iter->this_arg + 2; // 通道信息如2G、5G,等
        int x = le16toh(*(uint16_t*)iter->this_arg);
        printf("\tfreq: %d type: ", phy_freq);

        if ((x & IEEE80211_CHAN_A) == IEEE80211_CHAN_A) {
            printf("A\n");
        } else if ((x & IEEE80211_CHAN_G) == IEEE80211_CHAN_G) {
            printf("G\n");
        } else if ((x & IEEE80211_CHAN_2GHZ) == IEEE80211_CHAN_2GHZ) {
            printf("B\n");
        }
        break;

    case IEEE80211_RADIOTAP_DBM_ANTSIGNAL:
        signal = *(signed char*)iter->this_arg;
        printf("\tsignal: %d dBm\n", signal);
        break;

    case IEEE80211_RADIOTAP_RX_FLAGS:
        printf("\tRX flags: %#.4x\n", le16toh(*(uint16_t *)iter->this_arg));
        break;

    case IEEE80211_RADIOTAP_ANTENNA:
        printf("\tantenna: %x\n", *iter->this_arg);
        break;

    case IEEE80211_RADIOTAP_RTS_RETRIES:
    case IEEE80211_RADIOTAP_DATA_RETRIES:
    case IEEE80211_RADIOTAP_FHSS:
    case IEEE80211_RADIOTAP_DBM_ANTNOISE:
    case IEEE80211_RADIOTAP_LOCK_QUALITY:
    case IEEE80211_RADIOTAP_TX_ATTENUATION:
    case IEEE80211_RADIOTAP_DB_TX_ATTENUATION:
    case IEEE80211_RADIOTAP_DBM_TX_POWER:
    case IEEE80211_RADIOTAP_DB_ANTSIGNAL:
    case IEEE80211_RADIOTAP_DB_ANTNOISE:
    case IEEE80211_RADIOTAP_TX_FLAGS:
        break;

    default:
        printf("\tBOGUS DATA\n");
        break;
    }
}

int main(int argc, char** argv)
{
    struct ieee80211_radiotap_iterator iter;
    int err;
    int i, j;

    for (i = 0; i < sizeof(radiotap_buf)/sizeof(radiotap_buf[0]); i++) {
        printf("parsing [%d]\n", i);

        err = ieee80211_radiotap_iterator_init(&iter, (struct ieee80211_radiotap_header *)radiotap_buf[i],
                                                sizeof(radiotap_buf[i]), NULL);
        if (err) {
            printf("not valid radiotap...\n");
            return -1;
        }

        j = 0;

        /**
         * 遍历时,this_arg_index表示当前索引(如IEEE80211_RADIOTAP_TSFT等),
         * this_arg表示当前索引的值,this_arg_size表示值的大小。只有flag为true时才会进一步解析。
         */
        while (!(err = ieee80211_radiotap_iterator_next(&iter))) {
            printf("next[%d]: index: %d size: %d\n",
                    j, iter.this_arg_index, iter.this_arg_size);
            if (iter.is_radiotap_ns) { // 表示是radiotap的命名空间
                print_radiotap_namespace(&iter);
            }

            j++;
        }

        printf("==================================\n");
    }

    return 0;
}

原文地址:https://www.cnblogs.com/sudochen/p/12017345.html

时间: 2024-11-13 09:29:25

Radiotap信息的相关文章

基于位置信息的聚类算法介绍及模型选择

百度百科 聚类:将物理或抽象对象的集合分成由类似的对象组成的多个类的过程被称为聚类.由聚类所生成的簇是一组数据对象的集合,这些对象与同一个簇中的对象彼此相似,与其他簇中的对象相异."物以类聚,人以群分",在自然科学和社会科学中,存在着大量的分类问题.聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法.聚类分析起源于分类学,但是聚类不等于分类.聚类与分类的不同在于,聚类所要求划分的类是未知的. 分类和聚类算法一直以来都是数据挖掘,机器学习领域的热门课题,因此产生了众多的

查看Linux系统版本信息

一.查看Linux内核版本命令(两种方法): 1.cat /proc/version [[email protected]CentOS home]# cat /proc/versionLinux version 2.6.32-431.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Fri Nov 22 03:15:09 UTC 2013 2.uname -a [

java微信授权获取OPENID,ACCESS_TOKEN,用户信息

获取微信的openId流程 1.获取微信code 使用接口 : appId 是当前开发者的appId 不是用户的  path  是回调地址 这个链接是授权链接,当重定向这个链接的时候,会展示授权页,点击授权之后 跳入你path的请求接口    回调中带了一个参数code获取到就行 https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appId+"&redirect_uri="+path+"&

理解信息管理系统

1.信息与数据的区别是什么? 数据是记录客观事物,可鉴别的符号,而信息是具有关联性和目的性的结构化,组织化的数据.数据经过处理仍是数据,而信息经过加工可以形成知识.处理数据是为了便于更好的解释,只有经过解释,数据才有意义,才可以成为信息.可以说信息是经过加工以后,对客观世界产生影响的数据. 2.信息与知识的区别是什么? 信息是具有关联性和目的性的结构化,组织化的数据,知识是对信息的进一步加工和应用,是对事物内在规律和原理的认识.信息经过加工可以形成知识. 3.举一个同一主题不同级别的数据.信息.

调试信息的完成

gdb中-x是为了实现通过文件的初始化gdb GAS(gcc)(AT&T 语法),NASM(Intel 语法) 当boot loader 引导操作系统的时候,机器必须有如下的状态: EAX: 必须包含魔数OX2BADB002,这个值告诉操作系统目前它是由兼容的Multiboot 的boot loader 引导的. EBX: 必须包含boot loader 提供的多重引导信息结构(见3.3 节多重信息引导结构)的32位物理地址. CS: 必须是32 位的读/执行的代码段,偏移是0 以及界限是 0X

20145225 《信息安全系统设计基础》期中总结

期中总结 一.常用命令总结 man -k: 常用来搜索,结合管道使用.例句如下: man -k k1 | grep k2 | grep 2 搜索同时含有k1和k2,且属于系统调用. 最后的数字意味着帮助手册中的区段,man手册共有8个区段,最常用的是123,含义如下: 1.Linux 2.系统调用 3.c语言 但是当单独用man语句的时候,想查看其中的单独某个区段内的解释时,用法是这样的: man 3 printf 即查找c语言中printf的用法. grep -nr 这条语句可以用来查找关键字

20145336张子扬 《信息安全系统设计基础》第7周学习总结

20145336张子扬 <信息安全系统设计基础>第1周学习总结 教材学习内容总结 学习目标: 了解常见的存储技术(RAM.ROM.磁盘.固态硬盘等) 理解局部性原理 理解缓存思想 理解局部性原理和缓存思想在存储层次结构中的应用 高速缓存的原理和应用 三种常见存储技术:RAM.ROM和磁盘 随机访问存储器RAM分为静态RAM(SRAM)和动态RAM(DRAM) SRAM 用来作为高速缓存储存器,SRAM将每个位存储在一个双稳态的存储器单元里,每个单元是用一个六晶体管电路来实现的.它可以无限制地保

小白日记8:kali渗透测试之主动信息收集(二)三层发现:ping、traceroute、scapy、nmap、fping、Hping

三层发现 三层协议有:IP以及ICMP协议(internet管理协议).icmp的作用是用来实现intenet管理的,进行路径的发现,网路通信情况,或者目标主机的状态:在三层发现中主要使用icmp协议,arp协议属于二层协议,它是基于广播的,所以不可路由.而ICMP协议是可以路由的,理论上可以使用icmp协议发现全球的ip,如果没有边界防火墙(禁止icmp的探测包)进行过滤的话,对目标主机进行扫描,则会收到相应的响应,从而进行捕捉[有边界防火墙的现象比较普遍],但是三层发现的扫描速度也较二层要慢

20145317《信息安全系统设计基础》第六周学习总结(1)

20145317<信息安全系统设计基础>第六周学习总结(1) 第四章 处理器体系结构 指令体系结构:一个处理器支持的指令和指令的字节级编码 4.1Y86指令集体系结构 Y86:包括定义各种状态元素.指令集和它们的编码.一组编程规范和异常事件处理. Y86程序中的每条指令都会读取或修改处理器状态的某些部分.Y86具体包括:8个程序寄存器.3个条件码ZF\SF\OF.程序计数器(PC) Y86用虚拟地址引用存储器位置. 程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态. 注意:条件