aaronb/wireshark-meshcore

GitHub: aaronb/wireshark-meshcore

为 MeshCore LoRa 网状网络协议提供 Wireshark 协议解析器与 JSON 到 pcapng 格式转换,方便开发者在 Wireshark 中可视化分析网状网络数据包。

Stars: 15 | Forks: 1

# MeshCore Wireshark Dissector 一个用于 [MeshCore](https://github.com/meshcore-dev/MeshCore)(一种 LoRa 网状网络协议)的 Wireshark 协议解析器和 pcapng 转换器。 ![MeshCore 解析器显示带有协议树和已解密组消息的数据包列表](https://raw.githubusercontent.com/aaronb/wireshark-meshcore/main/docs/screenshots/screenshot_1.png) - **`meshcore_dissector.lua`** -- 用于解码 MeshCore 数据包的 Wireshark Lua 解析器,提供完整的协议树、显示过滤器和信息列摘要([下载](https://raw.githubusercontent.com/aaronb/wireshark-meshcore/main/meshcore_dissector.lua)) - **`meshcore_json2pcap.py`** -- 将 JSON 无线电日志转换为 pcapng 文件的 Python 脚本([下载](https://raw.githubusercontent.com/aaronb/wireshark-meshcore/main/meshcore_json2pcap.py)) ## 功能 - 解码所有 MeshCore 数据包类型:ADVERT、ACK、GRP_TXT、GRP_DATA、TXT_MSG、REQ、RESPONSE、ANON_REQ、PATH、TRACE、MULTIPART、CONTROL、RAW_CUSTOM - Header 掩码解析(路由类型、payload 类型、payload 版本) - ADVERT appdata 解析:节点类型、GPS 坐标、节点名称 - CONTROL 子类型解析:DISCOVER_REQ、DISCOVER_RESP - 两层解析(类似 802.11 Radiotap):无线电元数据和线路协议是独立的协议条目 - 来源于 JSON 转 pcapng 转换器的无线电元数据 (SNR),可通过 `meshcore_radio.snr_raw` 进行过滤 - 支持显示过滤器(例如使用 `meshcore.payload_type == 4` 过滤 ADVERT) ## 安装说明 解析器是一个单一的 Lua 文件——无需编译。将 `meshcore_dissector.lua` 复制到您的 Wireshark 个人插件文件夹,它会在启动时自动加载。 ### Linux ``` mkdir -p ~/.local/lib/wireshark/plugins cp meshcore_dissector.lua ~/.local/lib/wireshark/plugins/ ``` ### macOS ``` mkdir -p ~/.local/lib/wireshark/plugins cp meshcore_dissector.lua ~/.local/lib/wireshark/plugins/ ``` 或者,如果您将 Wireshark 安装为 app bundle: ``` mkdir -p "$HOME/.config/wireshark/plugins" cp meshcore_dissector.lua "$HOME/.config/wireshark/plugins/" ``` ### Windows 将 `meshcore_dissector.lua` 复制到: ``` %APPDATA%\Wireshark\plugins\ ``` 通常路径是 `C:\Users\\AppData\Roaming\Wireshark\plugins\`。如果 `plugins` 文件夹不存在,请创建它。 ### 验证插件目录 在 Wireshark 中,转到 **帮助 > 关于 Wireshark > 文件夹** 以查看您系统的“个人插件”路径。您也可以通过 **编辑 > 首选项 > 外观 > 文件夹** 找到它。 ### 重新加载 复制文件后,重启 Wireshark 或按 **Ctrl+Shift+L**(分析 > 重新加载 Lua 插件)即可在不重启的情况下加载解析器。 ## 获取捕获文件 ### 从配套应用程序获取 在官方 MeshCore 配套应用程序中,转到 **工具 > Rx Log > 保存日志** 以从您的节点导出 JSON 无线电日志。此 JSON 文件可以转换为 pcapng 格式,以便在 Wireshark 中进行分析。 ### 示例捕获 [`docs/samples/sample_1.pcapng`](docs/samples/sample_1.pcapng) 中包含了一个示例 pcapng 捕获文件,因此您无需无线电设备即可尝试该解析器。 ## 将 JSON 日志转换为 pcapng 转换器需要 Python 3.6+ 且无外部依赖。 ``` python3 meshcore_json2pcap.py capture.json ``` 这会在同一目录下生成 `capture.pcapng`。您也可以指定输出路径: ``` python3 meshcore_json2pcap.py capture.json output.pcapng ``` ### 输入格式 JSON 输入是一个数据包对象数组: ``` [ { "timestamp": 1773364730762, "snr": 8.25, "packet": "150220ee81fbaf4d..." } ] ``` | 字段 | 类型 | 描述 | |-------|------|-------------| | `timestamp` | integer | 距 Unix 纪元的毫秒数 | | `snr` | float | 信噪比,单位为 dB | | `packet` | string | 十六进制编码的原始数据包字节 | ### 无线电元数据标头 默认情况下,pcapng 中的每个数据包都会添加一个无线电元数据标头。 该格式遵循与 802.11 Radiotap 相同的可扩展性模式:一个固定的 版本/长度前缀,后跟各个字段。`length` 字段告诉解析器需要跳过 多少字节,因此即使在未来版本中添加了新字段, 旧的解析器仍然可以找到线路协议的起始位置。 | 字节 | 类型 | 描述 | |-------|------|-------------| | 0 | uint8 | 版本(目前为 0) | | 1 | uint8 | 填充 (0) | | 2-3 | uint16 LE | 标头长度,以字节为单位(目前为 6) | | 4-5 | int16 LE | SNR * 100(例如 8.25 dB = 825) | 解析器使用两层架构(类似 802.11 Radiotap + 802.11), 其中无线电元数据和 MeshCore 线路协议在 Wireshark 的数据包树中显示为 独立的协议条目。这使得哪些字节是 捕获元数据、哪些是实际的无线传输数据变得一目了然。 ### 链路层类型 (LINKTYPE) 由 `meshcore_json2pcap.py` 生成的 Pcapng 文件使用 **DLT_USER0 (147)**,这是一种 来自保留供私人使用的“用户定义”范围的链路层类型。 **此值是临时的,将会更改。** DLT_USER0-USER15 是一个 16 插槽的 全局命名空间,由每个自定义协议工具共享。如果两个不相关的 解析器插件声明了相同的插槽,最后加载的插件将静默生效—— 因为没有冲突检测机制。我们计划向 [tcpdump.org](https://www.tcpdump.org/linktypes.html) 注册一个官方的 LINKTYPE 以消除此风险。 当此事完成时,分配的值将在转换器和解析器中 替换 DLT_USER0。**现有的 pcapng 文件需要 从原始的 JSON 日志重新生成。** ## 在 Wireshark 中使用 打开转换后的 pcapng 文件。数据包将自动被解码为 MeshCore。 解析器提供协议树解析和显示过滤器。 Wireshark 内置的 I/O 图表可以随时间可视化网状网络流量: ![显示随时间变化的 MeshCore 吞吐量的 Wireshark I/O 图表](https://raw.githubusercontent.com/aaronb/wireshark-meshcore/main/docs/screenshots/screenshot_2.png) ### 显示过滤器 | 过滤器 | 描述 | |--------|-------------| | `meshcore.payload_type == 4` | ADVERT 数据包 | | `meshcore.payload_type == 5` | GRP_TXT 数据包 | | `meshcore.route_type == 1` | FLOOD 路由的数据包 | | `meshcore.advert.name contains "Repeater"` | 节点名称中包含 "Repeater" 的 ADVERT | | `meshcore.channel_hash == 0x81` | 特定频道上的组消息 | | `meshcore_radio.snr_raw > 0` | 具有正 SNR 的数据包 | ### 使用 tshark 的命令行 ``` tshark -X lua_script:meshcore_dissector.lua -r capture.pcapng tshark -X lua_script:meshcore_dissector.lua -r capture.pcapng -Y "meshcore.payload_type == 4" -V ``` ## 运行测试 测试需要 Python 3.6+ 和 pytest。解析器集成测试还需要 tshark(如果没有 tshark,它们将被跳过)。 ``` pip install pytest python3 -m pytest tests/ -v ``` ## 许可证 GPLv2 —— 完整文本请参见 [LICENSE](LICENSE)。此许可证与主流的 [Wireshark 项目](https://www.wireshark.org/) 兼容。
标签:LoRa, Lua, MeshCore, pcapng, rizin, Wireshark插件, 安全规则引擎, 物联网, 网络协议分析, 逆向工具