本项目使用 Espressif IoT Development Framework(ESP-IDF),并已在 ESP-WROOM-32 模块和 esp-idf v3.2 上测试通过。
完整项目(即 ESP32 固件、服务器和 GUI)的概述可在此处找到。
本固件的编写目的是嗅探智能手机在寻找 Wi-Fi 连接时发送的 Probe Request 数据包。当智能手机上的 Wi-Fi 连接处于活动状态时,它会以广播方式(在所有信道频率上)发送一条 probe request 消息,询问是否存在任何免费 Wi-Fi 或某些已知的 Wi-Fi(即智能手机知道该 Wi-Fi 的密码)。ESP32 将嗅探该消息并提取不同类型的信息。
从每个被嗅探的数据包中提取以下信息:
每隔一分钟,这些信息会被发送到服务器并进行处理。最后,可以通过 GUI 查看处理后的信息(智能手机实时位置、智能手机频率等)。
该固件由两个主要线程/任务组成:
Sniffer 任务
Wi-Fi 任务
lock 来管理文件中 I/O 操作的关键区段。ESP32 被配置为 WIFI_MODE_APSTA 模式:即它会创建“soft-AP and station control block”并启动“soft-AP and station”。得益于此,ESP32 能够同时嗅探信息并将信息发送到服务器,从而避免在发送数据时丢失数据包信息。
以下是 Probe Request 中可能包含的信息字段的完整列表(来源 IEEE 802.11-2012):

下面是用 Wireshark 嗅探到的数据包,你可以在其中看到每个字段的比特数及其在数据包中的位置:

本节内容可能已过时,请查看官方网站以获取更多信息以及关于如何开始使用 ESP-IDF 的最新指南。
设置工具链
获取 ESP-IDF
除了工具链(其中包含用于编译和构建应用程序的程序)之外,你还需要 ESP32 专用的 API / 库。
cd ~/esp
git clone --recursive https://github.com/espressif/esp-idf.git
检出到版本 v3.x
cd esp-idf
git checkout release/v3.2
设置 ESP-IDF 的路径
工具链程序通过 IDF_PATH 环境变量访问 ESP-IDF。
该变量应在你的 PC 上设置好,否则项目将无法构建。
安装所需的 Python 包
python -m pip install --user -r $IDF_PATH/requirements.txt
确保已导出路径
export IDF_PATH=~/esp/esp-idf
export PATH=$PATH:$HOME/esp/xtensa-esp32-elf/bin
克隆仓库
git clone https://github.com/ETS-PoliTO/esp32-sniffer.git
cd esp32-sniffer
在 ESP32 与你的 PC 之间建立串口连接
make menuconfig
进入 Serial flasher config,然后进入 Default serial port,设置 ESP32 所连接的端口
请注意,如果你使用的是桥接器,可能需要下载一些驱动:
此文档提供了关于如何在 ESP32 与 PC 之间建立串口连接的指南。
构建代码并烧录到 ESP32
make all && make flash
查看日志
make monitor
文件 /main/Kconfig.projbuild 包含两个不同的菜单:
SPIFFS(SPI Flash File System)
它包含有关 SPIFFS 分区的一些重要信息:
SPIFFS 是一个支持磨损均衡、文件系统一致性检查等功能的文件系统。
配置项
它包含不同的变量:
ESP32_ID:ESP32 的 IDWIFI_SSID:WiFi 的 SSID(网络名称)WIFI_PASS:WiFi 密码(WPA 或 WPA2)BROKER_ADDR:MQTT broker 的 IPBROKER_PSW:MQTT broker 的密码BROKER_PORT:MQTT broker 的端口CHANNEL:ESP32 嗅探 PROBE REQUEST 的信道SNIFFING_TIME:嗅探时长要配置上述变量:
在项目文件夹中打开终端并运行
make menuconfig
选择要修改的菜单
按需编辑变量
你还可以添加包含不同变量的不同菜单:
打开 Kconfig.projbuild
开始一个新菜单
menu YOUR_MENU_NAME
添加你需要的变量
结束菜单
endmenu
SPIFFS
你需要创建一个分区表。
ESP32 MQTT
使用了 ESP32 MQTT 库。
MD5
用于对嗅探到的数据包进行哈希运算,以获得唯一标识符的哈希函数。
另请查看此演示视频,了解 ESP32 如何工作。
通过训诫之路漫长,通过榜样则短暂而有效