原理简介:

在wifi设备进行连接时,probe request帧是手机,电脑,平板等设备发出的请求帧,这个帧属于管理帧的分组。

通过分析请求帧我们可知道,请求帧的subtype == 0x04,其中包括mac地址信息。设备搜索热点时发送的探求信号,在一些新设备中,为了隐藏自己的真实mac地址,采用的是发送伪mac地址的探求信号,所以在探求帧中是无法获取真实的mac地址。一些老设备中没有此类功能,所以可以采集到真实的mac地址。响应帧subtype==0x05,同样包含mac地址信息。同样如此,基站向伪mac地址回应设备,所以统一无法获得真实的mac地址信息。在设备接入基站的过程中,需要进行关联请求也可称为认证,在此过程中,设备所发射的帧中所包含的mac头地址中真实的mac地址,因此我们可以在此过程中获取真实的mac信息。 
通过分析请求帧我们可知道,请求帧的subtype == 0x00,其中包括mac地址信息。同样还存在一个关联响应帧,subtype==0x01.

贴上部分代码:

Makefile:

include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=WiFi _detect
PKG_VERSION:=1.1
PKG_RELEASE:=1
PKG_BUILD_DIR:= $(BUILD_DIR)/$(PKG_NAME)

include $(INCLUDE_DIR)/package.mk

define Package/$(PKG_NAME)
    SECTION:=utils
    CATEGORY:=Utilities
    TITLE:=WiFi _detect
    DEPENDS:=+libpcap +libpthread
    MAINTAINER:=LNStar
endef

define Package/Scaner/description
    WiFi _detect
endef

define Build/Prepare
    mkdir -p $(PKG_BUILD_DIR)
    $(CP) ./src/* $(PKG_BUILD_DIR)/
endef

define Package/WiFi _detect/install
    $(INSTALL_DIR) $(1)/bin
    $(INSTALL_BIN) $(PKG_BUILD_DIR)/Scaner $(1)/bin/
endef
$(eval $(call BuildPackage,WiFi _detect))

数据包解析代码:

struct ieee80211_radiotap_iterator iter;
        if (ieee80211_radiotap_iterator_init(&iter, (struct ieee80211_radiotap_header *)packet, ((struct ieee80211_radiotap_header *)packet)->it_len, NULL))
        {
            continue;
        }
        header = (i3e_header *)(packet + le16toh(((struct ieee80211_radiotap_header *)packet)->it_len));
        header->fc = le16toh(header->fc);
        u_char type = (header->fc & 0x0c) >> 2;
        u_char stype = (header->fc & 0xf0) >> 4;
        Packet_Info Info;
        Packet_Info_Init(&Info);
        switch (type)
        {
        case 0x00:
        {
            if (stype == 0x04 || stype == 0x05 || stype == 0x08) //probe request /resp
            {
                struct ControlFrame_Body Body;
                memcpy(&Body, (uint8_t *)header + 24, sizeof(struct ControlFrame_Body));
                Body.SSID = (uint8_t *)header + 38;
                if (Body.Element_ID == 0)
                {
                    Body.SSID_Length > 32 ? Body.SSID_Length = 32 : Body.SSID_Length;
                    char *ESSID = (char *)malloc(Body.SSID_Length + 1);
                    memcpy(ESSID, Body.SSID, Body.SSID_Length);
                    ESSID[Body.SSID_Length] = 0;
                    Info.ESSID = ESSID;
                }
            }
        }
        case 0x02:
        {
            memcpy(Info.Source_Mac.MAC_SLICE, header->sa, 6);
            memcpy(Info.Target_Station_Mac.MAC_SLICE, header->da, 6);
            break;
        }

http post 请求代码:

char *List_Element_To_Str(List *pList)
{
    extern unsigned char mac_addr[6];
    int Str_Length = 0;
    char Flag = 0;
    Node *pCurrent = pList->Header;
    /***************Fill the Request Body***************/
    char *pBody = (char *)malloc(sizeof(char) * pList->Num * 45 + 45);
    Str_Length = sprintf(pBody, "{\"node\":\"%x:%x:%x:%x:%x:%x\",\"nearby\":[", mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
    while (pCurrent)
    {
        Str_Length += sprintf(pBody + Str_Length, "{\"mac\":\"%x:%x:%x:%x:%x:%x\",\"rssi\":%d},",
                              pCurrent->Key.MAC_SLICE[0], pCurrent->Key.MAC_SLICE[1], pCurrent->Key.MAC_SLICE[2],
                              pCurrent->Key.MAC_SLICE[3], pCurrent->Key.MAC_SLICE[4], pCurrent->Key.MAC_SLICE[5],
                              pCurrent->RSSI / pCurrent->RSSI_Counter);
        pCurrent = pCurrent->Next;
        Flag = 1;
    }
    pBody[Flag ? Str_Length - 1 : Str_Length] = ']';
    pBody[Str_Length++] = '}';
    pBody[Str_Length] = 0;
    /***************Here comes to add Header*************/
    const char *HttpHeader = "POST /mac/post HTTP/1.1\r\nHost: xxxxxxxx.com\r\nContent-Type: text/plain\r\nAccept: */*\nAccept-Encoding: deflate, br\r\nConnection: close\r\nContent-Length:";
    int pBody_Length = strlen(pBody), pBody_Request_Length = 1;
    for (; pBody_Length /= 10; pBody_Request_Length++)
        ; //Get the length of i to string
    int pStr_Length = strlen(pBody) + strlen(HttpHeader) + pBody_Request_Length + 4;
    char *pStr = (char *)malloc(pStr_Length + 1);
    Str_Length = sprintf(pStr, "%s%d\r\n\r\n%s", HttpHeader, Str_Length, pBody);
    pStr[Str_Length] = 0;
    free(pBody);
    if (Str_Length != pStr_Length)
    {
        printf("Str_Length:%d,pStr_Length:%d,pList_Num:%d\r\n", Str_Length, pStr_Length, pBody_Request_Length);
        printf("%s\r\n", pStr);
        exit(1);
    }
    return pStr;
}

具体代码,可联系本人。

qq:739980123

wifi探针的实现和部分代码说明相关推荐

  1. openwrt上wifi探针的实现

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

  2. ESP8266开发之旅 应用篇⑤ WiFi探针

    文章目录 1.前言 2. WiFi探针 2.1 WiFi探针是什么 2.2 WiFi探测特点 2.3 探针技术原理 3. ProbeRequest管理帧 3.1 MAC Head 3.1 Frame ...

  3. wifi探针Android系统下的实现思路

    原理 WiFi 探针技术是指基于WiFi探测技术来识别AP(无线访问接入点)附近已开启 WiFi 的智能手机或者WiFi终端(笔记本,平板电脑等),无需用户接入WiFi,WiFi探针就能够识别用户的信 ...

  4. WIFI探针初体验,我们的隐私是如何泄露的

    初入探针 仅供参考,禁止用于违法途径!! 今年315曝光的无线探针盒子,博主很感兴趣,于是托朋友关系买了一块(实际上就一esp+),到手之后却完全不知道如何下手,于是经过一番打听发现这玩意是有后台管理 ...

  5. 基于WIFI探针的商业大数据分析系统(hadoop+spark+hbase+bootstrap+echarts)

    WIFI_BussinessBigDataAnalyseSystem 基于WIFI探针的商业大数据分析技术(纪念大学最后一次中软杯) 距离我参加"中国软件杯"时间已经过了半年,很多 ...

  6. Openwrt WIFI探针开发【一】

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

  7. ESP8266 WiFi探针 MAC

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

  8. Wi-Fi 探针 - 智能探针 - 探针盒子 -> 危害用户信息安全

    Wi-Fi 探针 - 智能探针 - 探针盒子 -> 危害用户信息安全 Wi-Fi 探针 - 智能探针 - 探针盒子自动收集消费者信息,危害用户信息安全.一定要注意关闭手机 Wi-Fi,不要轻易信 ...

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

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

最新文章

  1. Udacity机器人软件工程师课程笔记(一)-样本搜索和找回-基于漫游者号模拟器
  2. Nginx 源码编译安装
  3. [产品设计]为什么目前的运动手表的产品设计是错的?
  4. 不会被计算机打败的棋类游戏,电脑首次打败人类围棋冠军意味着什么?
  5. 为什么 Java 中 2*(i*i) 比 2*i*i 更快?
  6. java结构体系_java io结构体系
  7. mysql注册成功为啥启动不了mysql_mysql启动不成功的解决方法
  8. OpenCV中直方图对比
  9. Luogu 3267 [JLOI2016/SHOI2016]侦察守卫
  10. Oracle数据库的增删改操作介绍
  11. Numpy 排序(sorting)、查询(searching)、计数(counting)
  12. 合成孔径成像算法与实现_(转)解读:为什么热成像测体温有时会显示35度以下?...
  13. jquery各种事件使用方法总结(from:天宇之游)
  14. 按钮按一下画个直线_直线导轨数控车床概念和作用
  15. pdf reference官方指南之-图片
  16. win7 计算机 工具,win7小工具
  17. Android篮球计分器课程设计,篮球计分器课程设计详解.doc
  18. 《Redis视频教程》(p2)
  19. 汇编语言-字符串大写转小写,小写转大写
  20. C语言程序——摄氏度和华氏度之间的转换

热门文章

  1. 读书笔记《疯狂人类进化史》,第一章,双脚走出来的进化史
  2. 微信小程序bindinput输入值的值获取不到
  3. 广东省数字政府网络安全评估体系与实践
  4. 50款教育类开源应用软件
  5. 得力科学计算机换电池,就地取材,简单拆解维修得力小闹钟
  6. 红外测温传感器的现状
  7. 【验证码识别】使用pytesseract识别数字验证码
  8. 使用HTTP Headers防御WEB攻击
  9. 城市出行潮人拼车上线啦…快奔走相告!
  10. web端下完订单后的短信推送