无线探针的原理及代码实现

本文介绍了无线探针在追踪终端移动轨迹方面的优势,详细讲解了802.11帧结构,特别是Frame Control字段,并阐述了无线探针的工作原理。通过分析probe帧,可以获取设备MAC地址等信息,进而绘制终端运动轨迹。最后,文章以MT7603无线芯片为例,展示了无线探针功能的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

无线探针的原理及代码实现


前言:随着无线的普及,很多终端现在都支持无线功能,无线网关设备也是随处可见,我们可以通过收集ap周边的sta信息,在大数据时代,当支持这种带收集sta信息功能的设备达到一定的覆盖面时,将这些信息收集汇总,我们大致可以比较精确的定位终端sta的运动轨迹。


一、无线探针的应用场景

公安部门破案或者追踪一些失踪人员的下落时,大部分是通过天眼来确定人员的活动轨迹,该种人员追踪方式存在一些显而易见的弊端:
(1)、公安部门需要投入大量警力去调取监控录像,且由于录像需要占用较大的存储,所以一般录像一般不会保留太长时间就会被自动清除;
(2)、获取录像后,需要大量人员花大量时间去录像中获取有用信息;
(3)、除去公共场所,很多地方并未安装有摄像头,此外,在农村几乎很少会有摄像头。

而通过AP来收集sta信息,则可以很方便的获取人员的移动轨迹,而且可以有效克服上述天眼追踪的弊端。
(1)、成本低:信息存储方便且存储成本较低,减少无关信息的存储;
(2)、速度快:可以快速获取信息,通过MAC地址就可以获取设备的移动轨迹,不需要花费大量人力物力走访调查,观看录像;
(3)、覆盖面广:现在无线AP普及到户,农村也比较普及。

二、无线探针相关知识点

我们先熟悉一下802.11的帧结构:
在这里插入图片描述

  //Frame control对应的地址如下: (Little ENDIAN)
    typedef struct _frame_contrl{
 		unsigned char version:2;
    	unsigned char type:2;                    // 00 管理帧 01控制帧 10数据帧 11保留
    	unsigned char subtype:4;   
    	//unsigned char ToDS:1;
  		unsigned char FromDS:2;             /* 来自DS*/
    	unsigned char MoreFrag:1;           /*更多分段*/
    	unsigned char Retry:1;                  /*重传*/
    	unsigned char PwrMgt:1;              /*电源管理*/
    	unsigned char MoreData:1;          /*更多数据*/
    	unsigned char WEP:1;                 /*受保护帧*/
    	unsigned char Rsvd:1;                 /*顺序*/
    }frame_contrl,*pfram_contrl;

帧结构中各字段说明:
在这里插入图片描述

1、Frame Control(帧控制)字段说明
1.1 协议类型(Protocol version

控制字段的前2bit节为:协议类型(Protocol version),目前此值为:0。

1.2 帧类型(TYPE

帧类型由frame control的type两位决定,目前有三种类型的帧:

  • 00,管理帧(Management Frame,例如Beacon帧、Probe Request帧):IEEE80211_TYPE_MGMT 用于执行管理操作,如关联、身份验证,扫描等。
  • 01,控制帧(Control Frame,例如RTS帧、CTS帧、ACK帧):IEEE80211_TYPE_CTL 通常与数据包相关。如:PS-poll包用于从AP缓冲区取回数据包;另一个例子,STA若想数据传输,首先会发送RTS的控制数据包,如果介质空闲,目标客户端将发回一个名为允许发送(CTS)的控制数据包。
  • 10,数据帧(Data Frame,承载数据的载体):IEEE80211_TYPE_DATA 原始数据包。注:空数据包是特殊的数据帧,其用于电源管理。
  • 11,保留。
1.3 Sub Type

下表为管理帧的subType对应的类型(即type为00时,subType的取值:
管理帧
下表为控制帧的subType对应的类型(即type为01时,subType的取值:
控制帧
下表为数据帧的subType对应的类型(即type为10时,subType的取值:
数据帧

三、无线探针的原理

WIFI 是基于IEEE802.11a/b/g/n 协议,在标准协议中,定义了AP(无线接入点)和STA(站或客户端)的两种工作模式;我们的WiFi设备,如手机、平板电脑以及其他无线终端设备,也不停的发送着probe帧,去寻找附近可用的AP。 probe帧包含了设备的mac地址,当我们的AP接收到probe帧之后就获取了这个设备的MAC地址,而这个AP就是我们的WIFI探针。因此只要在WiFi探针覆盖区域内的设备打开着WiFi,探针就能收集到他的MAC地址。

从probe帧中,我们可以获取:
(1)、设备MAC地址;(2)、WiFi信号强度;(3)、WiFi信号频道;(4)、信号帧类型;(5)、时间。

在获取大量数据之后,根据上述获取的时间以及MAC地址,就可以比较精确的获取终端的移动轨迹。

有人担心这回侵犯个人隐私,其实这个担心是多余的,首先probe帧中只能获取一些基本信息,所以此时收集到信息是一些无关用户个人信息和设备上其他信息的;其次,要获取个人的运动轨迹,必须需要大量数据的支持,一般人员在未授权的情况下无法取得这些数据;最后,查询个人移动轨迹需要知道持有人的设备MAC信息。

三、无线探针功能的代码实现

本文以MTK无线芯片MT7603为例:
添加驱动支持代码:Wif/MT7603/tx_rx/wdev_rx.c
定义ko模块支持的函数指针接口:
在这里插入图片描述
在函数dev_rx_mgmt_frm()中添加如下代码:该函数负责处理收到的管理帧
在这里插入图片描述
在这里插入图片描述

探针功能模块实现:

/****************************************************************************
* 文件名:	station_mac_collection.c

* 创建日期:	2019-05-11

* 文件描述:	

* 版权说明:	Copyright (c) 2000-2016   XX通信科技股份有限公司

* 与其它文件的关系:

* 其它:

* 修改日志记录:
*****************************************************************************/

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <asm/uaccess.h>
#include <linux/slab.h>
#include <linux/seq_file.h>  
#include <linux/sysctl.h>
#include <linux/list.h>
#include <linux/rculist.h>
#include <linux/spinlock.h>		
#include <linux/sched.h>	//jiffies_64
#include <linux/percpu.h>
#include <linux/jiffies.h>
#include <asm/param.h>
#include <asm/div64.h>	//64位除法
#include <net/net_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值