ajsb85/esp32-p4-decompiler-plugin

GitHub: ajsb85/esp32-p4-decompiler-plugin

为 Ghidra 提供ESP32-P4 RISC-V 微控制器的一等公民支持,包含完整 ISA 定义、外设映射和符号加载等功能,解决该芯片固件逆向分析缺少专用工具的问题。

Stars: 1 | Forks: 0

# ESP32-P4 Ghidra 插件 [![许可证](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE) [![Ghidra](https://img.shields.io/badge/Ghidra-12.x-orange.svg)](https://ghidra-sre.org) [![RISC-V](https://img.shields.io/badge/arch-RISC--V%2032-green.svg)](https://riscv.org) [![Java](https://img.shields.io/badge/Java-21%2B-red.svg)](https://adoptium.net) Ghidra 扩展,为 **ESP32-P4** RISC-V 微控制器提供一等公民支持。 提供自定义 Sleigh 处理器定义,涵盖完整的 ISA (RV32IMAFC + Zicsr + Zifencei + Zmmul + Zaamo + Zalrsc + Zca + Zcf + xesploop + xespv2p2)、来自官方 SVD 的外设内存映射标记、 ROM 符号加载以及 ESP-IDF FIDB 函数识别。 ## 功能 - **Sleigh 处理器定义** — 完整的 ESP32-P4 ISA,包括 xesploop 硬件循环和 xespv2p2 PIE SIMD(已在 P4 eco2 上确认) - **编译器规范** — 针对ilp32f ABI (FLEN=4, 仅单精度浮点数) 优化的 `esp32p4.cspec` - **SVD 外设映射** — 通过 `LoadESP32P4SVD.java` 从 `esp32p4.svd` 标记所有 89 个外设 - **ROM 符号加载器** — `LoadESP32P4RomSymbols.java` 从 `esp32p4_rev0_rom.elf` 导入函数名称 - **FIDB 生成器** — 用于构建 ESP-IDF 函数 ID 数据库的 `GenerateESP32P4FIDB.java` 指导脚本 - **Headless 分析** — 用于 CI/批处理工作流的 `AnalyzeESP32P4Headless.py` 预脚本 ## 依赖要求 | 依赖 | 版本 | |------------|---------| | Ghidra | 12.1.2 或更高版本 | | Java | 21 或更高版本 | | Gradle | 8+ (包含 wrapper) | | esp32p4.svd | 可选 — 来自 Espressif SDK | | esp32p4_rev0_rom.elf | 可选 — 来自 Espressif SDK | ## 安装说明 ### 从发布 ZIP 安装 1. 从 [Releases](https://github.com/ajsb85/esp32-p4-decompiler-plugin/releases) 下载 `ghidra_12.1.2_PUBLIC_*_esp32p4-ghidra-plugin.zip` 2. 在 Ghidra 中:**File → Install Extensions** → 选择该 ZIP → 重启 ### 从源码构建 ``` git clone https://github.com/ajsb85/esp32-p4-decompiler-plugin.git cd esp32-p4-decompiler-plugin gradle -PGHIDRA_INSTALL_DIR=/opt/ghidra_12.1.2_PUBLIC buildExtension ``` 通过 **File → Install Extensions** 安装 `dist/` 中的 ZIP。 ## 快速开始 1. 安装扩展(见上文)并重启 Ghidra 2. **File → Import File** → 选择你的 ELF → **Options → Language** → `RISCV:LE:32:ESP32-P4` → OK 3. 运行自动分析(**Analysis → Auto Analyze**) 4. _(可选)_ **Window → Script Manager** → 运行 `LoadESP32P4SVD.java`, 指定你的 `esp32p4.svd` 5. _(可选)_ 运行 `LoadESP32P4RomSymbols.java`, 指定 `esp32p4_rev0_rom.elf` ### Headless 分析 ``` analyzeHeadless /tmp/proj MyProject \ -import firmware.elf \ -processor "RISCV:LE:32:ESP32-P4" \ -preScript AnalyzeESP32P4Headless.py ``` ## ISA 支持 | 扩展 | 描述 | 状态 | |-----------|-------------|--------| | RV32IMAFC | 基础 + 乘法 + 原子 + 浮点 | Full | | Zicsr / Zifencei | CSR 访问 / fence | Full | | Zca / Zcf | 压缩基础 / 浮点 | Full | | xesploop | 硬件循环 (custom-1, 0x2B) | Full | | xespv2p2 | PIE SIMD 加载/存储 (操作码 0x1F) | Partial | | xespv2p2 | PIE SIMD 算术 (操作码 0x1B) | Partial | ### PIE SIMD — 在 ESP32-P4 eco2 上已确认的操作 通过 [FastLED #2535](https://github.com/FastLED/FastLED/issues/2535) 和 [#2536](https://github.com/FastLED/FastLED/issues/2536) 验证: `vld.128.ip` · `vst.128.ip` · `andq` · `orq` · `xorq` · `notq` · `zero.q` · `movi.32.q` · `vcmp.eq.s8` · `vunzip.8` · `vsl.32` · `vsr.u32` · `slci.2q` · `srci.2q` · `src.q.qup` · `cmul.s16` 未确认的操作将直接由通用的 `esp.pie.arith` / `esp.pie.0x1f` pcodeops 处理,并且仍会被反汇编,不会导致反编译器崩溃。 ## 项目结构 ``` data/languages/ Sleigh processor definition (slaspec, sinc, cspec, ldefs) ghidra_scripts/ Runnable Ghidra scripts (SVD loader, ROM symbols, FIDB) src/main/java/ Plugin Java source (analyzer, memory map, UI panel) dist/ Built extension ZIP ← git-ignored, produced by Gradle ``` ## 许可证 Apache 2.0 — 见 [LICENSE](LICENSE)。 上游 Sleigh 文件(`riscv.*.sinc`, `andestar_v5.instr.sinc`)源自 [Ghidra](https://github.com/NationalSecurityAgency/ghidra) 项目 (NSA) 并在相同的 Apache 2.0 许可证下重新分发。 **作者:** Alexander Salas Bastidas <ajsb85@firechip.dev>
标签:ESP32, Ghidra插件, JS文件枚举, RISC-V, Sleigh, 云资产清单, 后台面板检测, 固件分析, 域名枚举, 嵌入式系统, 逆向工具, 逆向工程