openwrt上wifi探针的实现

探针是通过wifi搜集经过这个AP范围的手机的mac地址,没有什么深刻的东西,知乎上关于这个东西讨论的很多,有人觉得很有用,可以做很多增值的应用,有人觉得没啥用,不过这并不妨碍我们从技术上去实现它。

看到探针,感觉很高大上的样子,其实就是通过wifi搜集经过这个AP范围的手机的mac地址,没有什么深刻的东西,知乎上关于这个东西讨论的很多,有人觉得很有用,可以做很多增值的应用,有人觉得没啥用,不过这并不妨碍我们从技术上去实现它。

802.11协议

协议里面要求每个AP每隔一定时间(几十毫秒到几秒不等)向周围的sta和AP广播beacon帧,就是告诉周围的sta和其他的AP:我是xxxx(bssid),快来连我!我是xxxx(bssid),快来连我!瞬间感觉每个AP都有一颗放荡的心,有木有!有木有!

每 个sta(可以理解为手机、笔记本)除了默默监听周边AP发送的beacon帧以外,还会偷偷发送probe帧:我是xxxx(mac地址),我能连你 吗?我是xxxx(mac地址)我能连你吗?十足一个闷骚的小婊砸,所以我每次出门都默默关掉手机的wifi,现在的无线环境实在是太不安全了,参看连接

在7620a上的实现

基本思路是在AP受到探测帧后,将mac地址记录下来,通过proc文件系统上报给应用层。下面是代码:

mac地址获取部分:

在函数VOID APPeerProbeReqAction(IN PRTMP_ADAPTER pAd,IN MLME_QUEUE_ELEM *Elem);中添加

extern UCHAR GLOBAL_AddrLocalNum;

extern UCHAR GLOBAL_AddrLocal[ADDR_LOCAL_NUMBER][MAC_ADDR_LEN];
PFRAME_802_11 pFramelxd = (PFRAME_802_11)Elem->Msg;
if(GLOBAL_AddrLocalNum >ADDR_LOCAL_NUMBER || GLOBAL_AddrLocalNum == ADDR_LOCAL_NUMBER)
{
//GLOBAL_AddrLocalNum = 0;
}
else
{
int index = 0;
BOOLEAN flag = 1;
for(index=0; index<GLOBAL_AddrLocalNum; index++)
{
if(NdisCmpMemory(GLOBAL_AddrLocal[index],pFramelxd->Hdr.Addr2,MAC_ADDR_LEN)==0)
{
flag = 0;
break;
}
}
//COPY_MAC_ADDR(GLOBAL_AddrLocal[GLOBAL_AddrLocalNum], pFramelxd->Hdr.Addr1);
//GLOBAL_AddrLocalNum++;
//COPY_MAC_ADDR(GLOBAL_AddrLocal[GLOBAL_AddrLocalNum], pFramelxd->Hdr.Addr2);
//GLOBAL_AddrLocalNum++;
if(flag)
{
COPY_MAC_ADDR(GLOBAL_AddrLocal[GLOBAL_AddrLocalNum], pFramelxd->Hdr.Addr2);
GLOBAL_AddrLocalNum++;
}
}

proc部分:

应用层向proc的节点中写入“s”,告知驱动需要获取sta相关的数据,驱动给出采集到的maclist。

static struct proc_dir_entry *entry_wl_beacon_mac;

UCHAR GLOBAL_AddrLocalNum = 0;
UCHAR GLOBAL_AddrLocal[MAX_MCAST_LIST_SIZE][6];

static char *maclistbuffer;

static int maclist_proc_show(struct seq_file *m, void *v)
{
if(maclistbuffer[0] == 's')
{
maclistbuffer[0] = '0';
int index=0;
for(index=0;index<GLOBAL_AddrLocalNum;index++)
{
seq_printf(m,"%02x:%02x:%02x:%02x:%02x:%02x\n", GLOBAL_AddrLocal[index][0],GLOBAL_AddrLocal[index][1],GLOBAL_AddrLocal[index][2],GLOBAL_AddrLocal[index][3],GLOBAL_AddrLocal[index][4],GLOBAL_AddrLocal[index][5]);
}
GLOBAL_AddrLocalNum = 0;
}
else
{
//seq_printf(m,"sta number is %d, proc!\n", GLOBAL_AddrLocalNum);
//seq_printf(m,"ap number is %d, proc!\n", GLOBAL_AddrLocalNum1);
}
return 0;
}
static int maclist_proc_open(struct inode *inode, struct file *file)
{
return single_open(file,maclist_proc_show,inode->i_private);
}

static ssize_t maclist_proc_write(struct file *file, const char *buffer, size_t len, loff_t *off)
{
int user_len = 0;

if (len > MAX_MACLIST_LENGTH)
{
user_len = MAX_MACLIST_LENGTH;
}
else
{
user_len = len;
}
if(copy_from_user(maclistbuffer, buffer, user_len))
{
return -EFAULT;
}
return user_len;
}

openwrt上wifi探针的实现相关推荐

  1. OpenWrt之上wifi探针简单实现

    之前一直在rt2860v2上面做探针数据捕获和试验,并没有基于社区的驱动做过,应该也不是特别麻烦,netlink可以沿用以前的,只要找到802.11驱动里面帧解析的地方就可以了,直接通过netlink ...

  2. Openwrt WIFI探针开发【一】

    2017.9.26 公开源码(Apache2.0协议) https://github.com/769484623/WiFiProbe --------------------------------- ...

  3. linux wifi探针,Openwrt WIFI探针开发

    2017.9.26 公开源码(Apache2.0协议) https://github.com/769484623/WiFiProbe --------------------------------- ...

  4. WiFi探针信息了解

    前年十月安卓的功能做的差不多了,领导安排做 openwrt 上的 WiFi 探针功能,真是什么都不懂,先学 Linux,再看C语言,接着弄虚拟机编译 openwrt 固件,刷机,了解 WiFi 探针信 ...

  5. ESP8266 WiFi探针 MAC

    当一个设备给另外一个设备通过无线传输技术发送信息时,周围的其他同类设备都是能够收到这些信息的,WiFi探针技术就是基于这个原理.具体来说,只要一个WiFi设备在WiFi探针的侦听范围内,当这个WiFi ...

  6. 中科爱讯WiFi探针在客流分析统计的应用

    基于WiFi探针的特性,可以在顾客无感知的情况下采集到手机的MAC地址,用于线下商业统计人流量.客流量. 在客流统计应用方面,WiFi探针可以作为一个独立的产品存在,同时也可以配合视频客流作为视频客流 ...

  7. WiFi探针的工作原理及采集的数据?

    WiFi探针在商业.公共安全领域的大放异彩,更多的人想了解什么是WiFi探针,WiFi探针是怎么工作的? WiFi探针的工作原理? 要深入了解WiFi探针技术,首先先认识WiFi使用的网络协议,WiF ...

  8. 中科爱讯WiFi探针在贵宾客户提醒领域的应用

    很多人很难理解为什么WiFi探针可以应用到贵宾客户提醒领域.在我们收到的诸多需求中,贵宾客户提醒功能是需求中提及较多的. 中科爱讯Wi-Fi探针通过精准的识别贵宾客户的MAC地址,帮助企业快速的知晓贵 ...

  9. 中科爱讯双频串口WiFi探针TZ5001 产品介绍

    中科爱讯WiFi探针TZ-5001支持串口.USB连接上位机(安卓.电脑.平板),可以采集2.4G/5G WiFi数据.配备有Android.PC端免费测试工具.通过抓取2.4G WiFi信号的MAC ...

最新文章

  1. Python标准库:内置函数tuple([iterable])
  2. freeglut中提供的几种立体几何对象绘制的android移植
  3. mysql 常规命令操作_mysql数据库常规命令操作
  4. Yii 框架学习--01 框架入门
  5. macOS 10.13 安装Virtualbox失败
  6. Spark源码分析之Worker
  7. Tensorflow中卷积的padding操作
  8. SpringCloud Alibaba Sentinel 流量控制规则介绍与配置
  9. AI 时代下的海量业务智能监控实践
  10. SpringBoot2.1.5(18)--- 国际化配置,SpringBoot Locale 国际化使用方法
  11. 模型相关:修改模型的坐标原点到用户的自定义位置
  12. 模式识别、机器学习与深度学习
  13. 51单片机控制42步进电机——程序实现(中断PWM/延时函数)
  14. Leetcode-845. 数组中的最长山脉(最详细解法)
  15. 关于PADS 9.5导入CAD图(dxf文件)的说明
  16. 迭代器的定义与自定义一个迭代器
  17. Java是先难后易吗_做题先易后难,干活先难后易
  18. lol最克制诺手的英雄_LOL:对线很“无解”的5个英雄,其实他们都有克星,诺手只怕它!...
  19. html字体自动变大变小,浏览器上的字体突然变大了或者变小怎么恢复?
  20. 用于测量纸张卷径的超声波传感器

热门文章

  1. C#中字符串的内存分配与驻留池
  2. MKL学习——矩阵矩阵操作
  3. iOS中持久化存储SQLite(一)
  4. 10分钟看懂浏览器的渲染过程及优化
  5. C#/WPF程序开机自动启动
  6. Linux修改密码后不能SSH远程登录了
  7. [SCOI2012]滑雪 (最小生成树 Kruskal)
  8. HDOJ5547 SudoKu
  9. DGbroker故障切换示例
  10. vue prop不同数据类型(数组,对象..)设置默认值