当前位置: 首页 > news >正文

创建ESP32开源WiFi MAC(介质访问控制)层

内置WiFi

内置的 WiFi.h 库将使我们能够轻松使用 ESP32 板的 WiFi 功能。

连接到 Wi-Fi 接入点:

#include <WiFi.h>const char* ssid = "yourNetworkName";
const char* password = "yourNetworkPassword";void setup(){Serial.begin(115200);delay(1000);WiFi.mode(WIFI_STA); //OptionalWiFi.begin(ssid, password);Serial.println("\nConnecting");while(WiFi.status() != WL_CONNECTED){Serial.print(".");delay(100);}Serial.println("\nConnected to the WiFi network");Serial.print("Local ESP32 IP: ");Serial.println(WiFi.localIP());
}void loop(){}
Connecting
................
Connected to the WiFi network
Local ESP32 IP: 192.168.43.129

获取WiFi网络信息

创建开源WiFi MAC

在我们开始对 802.11 PHY 硬件的工作原理以及我们如何与其交互进行逆向工程之前,我们首先需要找到或构建有帮助的工具。我们将使用 3 种主要方法:

  • 静态逆向工程
  • 模拟器中的动态代码分析
  • 真实硬件上的动态代码分析

静态逆向工程

对于静态分析,我们使用 NSA 开发的开源逆向工程工具 Ghidra。 开箱即用时,Ghidra 尚不支持 Xtensa(ESP32 的 CPU 架构),但有一个插件可以增加支持。 ESP32 SDK 中使用的构建工具会生成 ELF 文件(一种可以包含元数据的二进制文件)和平面二进制文件:使用 ELF 文件的优点是可以自动设置大多数函数名称。

模拟器中的动态分析

下面是 QEMU 记录的单个内存访问的示例:这是对地址 3ff46094 的写入(W),值为 00010005,由函数 ram_pbus_force_test 完成。调用堆栈的其余部分也会被记录,并转换为符号名称(如果可用)。

W 3ff46094 00010005 ram_pbus_force_test 400044f4 set_rx_gain_cal_dc set_rx_gain_testchip_70 set_rx_gain_table bb_init register_chipv7_phy esp_phy_load_cal_and_init esp_phy_enable wifi_hw_start wifi_start_process ieee80211_ioctl_process ppTask vPortTaskWrapper

最后,我们还更正了 MAC 地址的处理,以便数据包捕获在数据包中包含正确的 MAC 地址,而不是硬编码地址。

真实硬件进行动态分析

为了动态分析真实硬件上的固件,我们使用 JTAG 硬件调试接口。 通过在ESP32和JTAG调试器之间连接一些跳线,我们可以调试ESP32。 我们按照此文中描述的步骤操作,使 JTAG 调试器 (CJMCU-232H) 正常工作。

软件MAC和硬件MAC

SoftMAC(软件 MAC)和 HardMAC(硬件 MAC)是指实现 Wi-Fi MAC 层的两种不同方法。 SoftMAC 依靠软件来管理 MAC 层功能,这提供了灵活性且易于修改,但会消耗更多的功率/CPU 周期。 另一方面,HardMAC 将 MAC 层处理卸载到专用硬件,从而减少了 CPU 使用率和功耗,但限制了在不更改硬件的情况下适应新功能的能力。

通过编写一些仅循环发送数据包的最小固件,并使用前面描述的三种逆向工程策略,确定了发送数据包的 Wi-Fi 硬件生命周期的高级概述:

调用 esp_wifi_start(),这间接调用了 esp_phy_enable()。esp_phy_enable() 负责初始化 wifi 硬件。现在,我们准备发送数据包:

传输数据包

作为(非常有限的)概念验证,我们希望通过直接使用内存映射外设来发送任意 802.11 帧,因此无需使用 SDK 函数。 从上面的生命周期图中可以看到,在传输之前,我们首先需要初始化wifi硬件。 不幸的是,这种初始化比发送数据包复杂得多:为了初始化硬件,需要大约 50000 次外围存储器访问,而传输数据包(包括处理中断)则需要大约 50 次。 这些根本不是精确的数字,但它们给出了所涉及的复杂性的一个概念。

接收数据包

参阅一:亚图跨际
参阅二:亚图跨际
http://www.lryc.cn/news/279871.html

相关文章:

  • LeetCode 2723. 两个 Promise 对象相加
  • Flutter--常用技术文档
  • 行分类问题
  • java常见面试题:如何使用Java进行XML解析和生成?
  • 【LabVIEW FPGA入门】LabVIEW FPGA实现I2S解码器
  • linux 安装sipp
  • c++最值查找
  • xtu-c语言考试复习-2
  • MySQL决战:MySQL数据导入导出
  • Unity 面试篇|(二)Unity基础篇 【全面总结 | 持续更新】
  • TIDB的忘了root用户密码和数据库密码解决办法
  • QT基础篇(4)QT5基本对话框
  • Springboot项目Nacos做配置中心
  • SpringSecurity入门demo(三)多用户身份认证
  • 【设计模式-02】Strategy策略模式及应用场景
  • ssh远程登陆
  • go如何终止多个for select循环嵌套
  • nginx(1.13.7)首次安装出现:【make: *** 没有规则可以创建“default”需要的目标“build” 问题】解决措施
  • 2024.1.8 关于 Redis 数据类型 Zset 集合命令、编码方式、应用场景
  • ffmpeg[学习(四)](代码实现) 实现音频数据解码并且用SDL播放
  • C++ 字符串哈希 || 字符串前缀哈希法
  • 【java】项目部署liunx服务器的简单步骤
  • 深度学习笔记(五)——网络优化(1):学习率自调整、激活函数、损失函数、正则化
  • 鸿蒙开发现在就业前景怎样?
  • 试用统信服务器操作系统UOS 20
  • [情商-11]:人际交流的心理架构与需求层次模型
  • 【.NET Core】Lazy<T> 实现延迟加载详解
  • 坑记(HttpInputMessage)
  • day04打卡
  • 语义分割miou指标计算详解