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文件枚举, 云资产清单, 内存映射, 后台面板检测, 固件分析, 域名枚举, 嵌入式系统, 逆向工程