brnomt/FiioDcomp
GitHub: brnomt/FiioDcomp
对 FiiO Echo Mini 数字音频播放器固件的逆向工程项目,提供固件格式文档、Ghidra 分析配置以及解包与修补工具。
Stars: 0 | Forks: 0
# Fiio Echo Mini — 固件逆向分析
对 **Fiio Echo Mini** 固件的逆向工程,这是一款基于 **Rockchip RKnanoC** SoC(ARM Cortex-M3, Thumb-2)的数字音频播放器(DAP)。
## 免责声明
本项目是一项独立的逆向工程成果。
本项目与 FiiO、SNOWSKY 或其任何子公司均无关联,也未得到他们的认可或支持。
此处提供的软件、文档和工具仅供研究、教育和互操作性目的使用。
刷入修改后的固件始终存在丢失数据或导致设备无法使用(“变砖”)的风险。使用本仓库中的任何工具或信息,风险由您自行承担。对于因使用这些工具或信息而造成的任何损坏、数据丢失或其他后果,作者不承担任何责任。
本仓库不提供固件镜像的下载。用户应从官方渠道获取固件。
## 项目目标
- 记录 Echo Mini 的固件格式。
- 分析启动过程和内存布局。
- 开源分析与修补工具。
- 实现可复现的固件研究。
- 探索安全的固件修改与自定义功能。
## 仓库结构
```
firmware/ # Rockbox-style modular C project (decompiled)
├── firmware.h # Address space, ROM calls, segment defines
├── firmware/
│ ├── os/ # Event system, delays, OS primitives
│ ├── filesystem/ # HifiFile I/O, FAT wrapper, media library
│ ├── dsp/ # GOODE DSP chip, EQ processing
│ ├── media/ # ID3v2/APEv2/Vorbis tags, format list
│ ├── usb/ # USB DAC mode, mass storage
│ └── power/ # Battery, charging, sleep timer
├── codecs/ # Audio codec interfaces (MP3/WMA/AAC/FLAC/APE/WAV/OGG/DSD)
├── apps/
│ ├── audio/ # MusicInit, MusicService, playback engine
│ ├── ui/ # Display, themes, menu system
│ ├── recorder/ # RecordWinSvc
│ └── bluetooth/ # BT audio handler
├── drivers/ # LCD, keypad, DAC IC, flash, SD card
└── resource/ # ROCK26IMAGERES table, bitmaps, fonts
docs/ # Documentation
├── symbol-index.md # Labeled function reference (31 functions)
├── memory-map.md # Complete memory map + SoC pinout
└── plans/echo-mini-decomp.md # Decompilation plan
stock/ # Reference firmware (not distributed)
├── ECHO MINI V3.7.0/ # Firmware version 3.7.0
└── ECHO MINI 512M/ # 512 MB variant
tools/ # Analysis and patching scripts
Makefile # Build system (arm-none-eabi-gcc target)
```
## 芯片:RKnano
Echo Mini 运行在 **Rockchip RKnano** SoC 上,具有以下特征:
- **CPU**: ARM Cortex-M(Thumb-2 ISA,小端序)
- **SDK**: RKnano SDK 1.0
- **加载地址**: `0x0301E794`(主固件 RAM 基址)
- **固件容器**: 包含 `RKnanoFW` magic 的多镜像格式
## HIFIEC37.IMG 容器格式
固件镜像是一个带有 CRC 校验的多段容器:
| 偏移量 | 大小 | 内容 |
|--------|------|---------|
| `0x000000` | 504 B | 外部头部:日期、芯片 ID、magic `0x06222026`、哨兵值 `0x76543210` |
| `0x0001F8` | 358 KB | 段 1 — 重定位表(约 200 个段条目) |
| `0x057820` | 173 KB | 段 2 — Bootloader:校验固件签名("fw1 Sign error!", "fw1 compare error!") |
| `0x081A14` | 31.25 MB | **段 3 — 主固件**(可执行的 ARM Thumb-2 代码) |
| `0x1FC41F8` | 245 KB | 段 4 — 填充(全零) |
| `0x200000` | 4 B | CRC: `0x1EA1C309` |
## 段 3 — 主固件
这是在设备上运行的代码数据块。它以 `RKnanoFW` 头部开始,紧接着是 ARM Thumb 指令:
```
RKnanoFW → container magic
0x0301E794 → load address
0x00000052 → count/flags
10 B5 → PUSH {R4, LR} ← code entry point
04 46 → MOV R4, R0
00 F0 61 F8 → BL sub_xxx
```
`section_1` 中的段表描述了不同模块如何映射到内存中。它包括代码区域、数据、栈以及可能的按需加载覆盖层。
## 设备功能(源自更新日志)
固件实现了以下功能:
- **音频**: MP3, FLAC, M4A, OGG, DSD (DFF/DSF), WAV/RIFF 播放
- **DAC**: USB DAC 模式(48 kHz,免驱)
- **均衡器**: 自定义 EQ + 预设(包括 "Retro EQ")
- **蓝牙**: 播放与自动重连
- **显示**: UI 主题、专辑封面、同步歌词、屏保
- **控制**: 3 种按键模式(A/B/C),具有不同的音量/曲目切换配置
- **存储**: 带有 ID3 标签的媒体库、收藏夹、文件夹/艺术家/专辑/流派浏览
- **额外功能**: 可调增益、声道平衡、可配置的 DAC 滤波器
## 如何使用提取的文件
### 加载到 Ghidra
需要分析的主要文件是 `section_3_0x00081A14.bin`:
1. 打开 Ghidra,创建一个新项目
2. 导入二进制文件,配置如下:
- **语言**: ARM → Cortex → little-endian → Thumb
- **基地址**: `0x0301E794`(固件加载地址)
3. Ghidra 将自动反汇编 Thumb-2 指令
4. 使用 `section_1` 中的段表来区分代码和数据区域
### 字符串搜索
二进制文件中包含可读的字符串,揭示了:
- RKnano SDK 模块和函数名
- 支持的音频格式
- 错误和调试信息
- UI 文本字符串
## 备注
- 固件**未加密** — 所有字符串和代码在二进制文件中均直接可见
- 该镜像是标准的 RKnano SDK 容器,而非 Fiio 专有格式
- 存在两种硬件变体:标准版和 512 MB 版(`MINIV370.IMG`)
- Bootloader(段 2)实现了签名校验,但在正常启动过程中并未强制执行
## 实用工具
- [Ghidra](https://ghidra-sre.org/) — 反汇编器/反编译器(原生支持 ARM Thumb)
- `arm-none-eabi-objdump` — 快速命令行反汇编
- `strings` — 从二进制文件中提取所有可读字符串
标签:ARM架构, Ghidra, 云资产清单, 固件分析, 客户端加密, 嵌入式系统, 逆向工程, 音频播放器