mytechnotalent/G-AVR

GitHub: mytechnotalent/G-AVR

G-AVR 是一个 Ghidra 扩展模块,通过自动解析 AVR Arduino 固件的启动引导序列来精确映射 SRAM 内存段,从而解决原始 .bin/.hex 文件在逆向工程中缺少内存边界信息的问题。

Stars: 0 | Forks: 0

# G-AVR 用于 **AVR Arduino 固件** 的 Ghidra 分析器和脚本模块 — 自动为编译后的 `.bin` 和 `.hex` 文件设置 `.data` 和 `.bss` 段的内存映射。免除了手动逆向工程 SRAM 边界的繁琐工作。 ## 作者 **Kevin Thomas** — kevin@mytechnotalent.com ## 什么是 G-AVR? 在使用 Ghidra 对 Arduino ATmega 固件(例如 ATmega328P 或 ATmega2560)进行逆向工程时,原始的 `.bin` 或 `.hex` 文件缺少 ELF 头部。因此,Ghidra 无法获知 SRAM 中已初始化(`.data`)和未初始化(`.bss`)内存段的边界。这会导致反编译出现问题,特别是在访问全局配置变量或结构化二进制 payload 时。 ``` avr-gcc / PlatformIO src.cpp ─────────────────────> firmware.hex / firmware.bin (Arduino sketch) (Raw flash bytes, no memory map) ``` G-AVR 会自动分析 `RESET` 向量引导序列(特别是 GCC 的 `__do_copy_data` 和 `__do_clear_bss` 例程),以检测并映射这些 SRAM 区域,其方式与微控制器在启动时的操作完全一致。 ## 功能 | 功能 | 内容 | | ------------- | ------------------------------------------------- | | **分析器** | 用于 AVR 程序的后台自动分析器 | | **脚本** | 手动执行的 `SetupArduinoMemoryMap.java` GhidraScript | | **映射** | 识别 `LPM` 拷贝循环和边界 | | **清理** | 移除 Ghidra 默认的重叠 `mem` 块 | ### 工作原理 ``` Ghidra Import firmware.bin ──────────────────────────> Ghidra Project (Language: AVR8) G-AVR Auto-Analysis Ghidra Project ────────────────────────> Memory Map Created - .data block - .bss block ``` 在运行时,G-AVR 分析器会检测 AVR 架构并自动解析已初始化的数据约束。 ## 项目结构 ``` G-AVR/ ├── README.md # This file ├── extension.properties # Ghidra extension metadata ├── Module.manifest # Module class dependencies ├── build.gradle # Gradle build (compile + zip) ├── src/ │ └── main/java/gavr/ │ └── AvrArduinoAnalyzer.java # Background analyzer for automatic memory setup ├── ghidra_scripts/ │ └── SetupArduinoMemoryMap.java # Script for manual execution └── docs/ └── arduino-re-internals.md # Deep dive into Arduino GCC boot loops ``` ### 组件描述 **`AvrArduinoAnalyzer.java`** — Ghidra `AbstractAnalyzer` 的子类。检测 `AVR8` 处理器。分析已加载的固件以定位 `.data` payload 的长度和偏移量,删除默认的 `mem` 块,并在 SRAM 中创建边界精确的 `.data` 和 `.bss` 块。 **`SetupArduinoMemoryMap.java`** — Ghidra 脚本,用于在后台自动分析被禁用时手动执行内存映射初始化。 ## 安装 ### 前置条件 - Ghidra 11.x 或更高版本 - Java 17+ ### 选项 A:使用 Gradle 构建 ``` cd G-AVR # 设置你的 Ghidra 安装路径 export GHIDRA_INSTALL_DIR=/path/to/ghidra_11.x # 使用 Ghidra 的官方工具构建扩展 zip gradle buildExtension # -> dist/ghidra_12.0.4_PUBLIC_20260613_G-AVR.zip ``` 在 Ghidra 中:**File -> Install Extensions -> Add (+)** -> 从 `dist/` 目录中选择该 zip 文件。重启 Ghidra。 ### 选项 B:手动复制 ``` GHIDRA_DIR=/path/to/ghidra_11.x # 复制已编译的 Java classes(如果已构建) mkdir -p "$GHIDRA_DIR/Ghidra/Extensions/G-AVR/lib" cp G-AVR/bin/*.class "$GHIDRA_DIR/Ghidra/Extensions/G-AVR/lib/" # 复制 Ghidra script cp G-AVR/ghidra_scripts/*.java ~/ghidra_scripts/ ``` 重启 Ghidra。 ## 用法 ### 工作流 1:自动分析 1. **File -> Import File** -> 选择 `.bin` 或 `.hex` 文件。 2. 选择现有的 **AVR8** 语言变体(例如 `avr8:LE:16:atmega256`)。 3. 点击 **OK** 并继续进行自动分析。 4. 确保在分析器列表中勾选了 **Arduino AVR Memory Mapper**。 5. Ghidra 将自动填充 `.data` 和 `.bss` SRAM 段。 ### 工作流 2:手动执行脚本 如果您更喜欢手动运行: 1. 导入您的固件。 2. 打开 **Script Manager**。 3. 运行 **SetupArduinoMemoryMap.java**。 ## 文档 `docs/` 目录包含补充文档: - **[arduino-re-internals.md](docs/arduino-re-internals.md)** — 解释了 magic bytes、初始化循环(`__do_copy_data`、`__do_clear_bss`)以及针对 Arduino 固件的静态分析策略。 ## 参考 - [Ghidra SLEIGH 文档](https://ghidra.re/courses/languages/html/sleigh.html) - [AVR Libc 参考手册](https://www.nongnu.org/avr-libc/user-manual/) ## 许可证 MIT 许可证 — 版权所有 (c) 2026 Kevin Thomas (kevin@mytechnotalent.com)
标签:AVR, Ghidra, JS文件枚举, 云资产清单, 内存映射, 后台面板检测, 固件分析, 域名枚举, 嵌入式系统, 逆向工程