无线探针的原理及代码实现
前言:随着无线的普及,很多终端现在都支持无线功能,无线网关设备也是随处可见,我们可以通过收集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_