CliffVale/sony-a6000-firmware-research
GitHub: CliffVale/sony-a6000-firmware-research
该项目对索尼 A6000 相机固件进行逆向工程研究,实现了官方固件解包、原始 NAND 提取、分区逐字节校验,并发现该相机内部运行 Android 系统。
Stars: 0 | Forks: 0
# 索尼 ILCE-6000 (A6000) 固件研究
**对消费级相机固件的全面逆向工程:从索尼官方
更新程序到逐字节验证的原始 NAND dump —— 包括对相机
内部 Android 运行时的发现。**
## 概要
| | 结果 |
|---|---|
| **相机** | 索尼 ILCE-6000 (A6000),固件 **3.21**,USB ID `054c:07c4` |
| **SoC** | Qualcomm **CXD90014** — *未进行*加密签名(这就是该方法可行的原因) |
| **阶段 1** | 官方更新程序 (EXE/DMG) → `.dat` → 解密的固件树 ✅ |
| **阶段 2** | `pmca-console updatershell` → `pull /dev/nflasha` → **483 MB 原始 NAND dump** ✅ |
| **验证** | 所有 5 个已发布的分区在 dump 中均**逐字节完全一致** ✅ |
| **最大发现** | A6000 在**内部运行 Android** —— 该 dump 包含一个活动的 FAT16 `/data` 文件系统,其中包含 **5 个已安装的 app**、Wi-Fi 配置和设置备份 |
本仓库是**整理成文的方法论和发现**。此处**不**分发原始二进制文件和个人
相机数据(索尼固件是专有的;
相机 dump 包含个人数据)。请参阅 [docs/01-overview.md](docs/01-overview.md)
了解哪些内容是公开的,哪些是私下保留的。
## 仓库内容
```
docs/
├── 01-overview.md What this project is, scope, safety
├── 02-phase1-unpacking.md Download + decrypt the official firmware
├── 03-phase2-raw-dump.md Dump the camera's NAND via updatershell
├── 04-verification.md Byte-identical partition verification
├── 05-region-map.md Full layout of the 483 MB raw dump
└── 06-android-userdata.md The camera's Android runtime, discovered
scripts/
├── verify_partitions.py Re-check published partitions in a dump
├── carve_fat16.py Carve the Android FAT16 /data out of nflasha
└── map_regions.py Map non-erased regions of a raw dump
ACKNOWLEDGEMENTS.md Full credits for every tool & app referenced
KNOWN_ISSUES.md Known bugs, caveats, and future work
LICENSE
```
## 主要结果
### 1. 官方固件解包(无需相机)
- `Update_ILCE6000V321.dmg` → `FirmwareData_ILCE6000V321.dat` (203 MB)
- `fwtool.py unpack` (crypter **CXD90014**) → 完整的固件树:
config、backup 区域、`0700_part_image` (nflasha3/5/7/15/16)、`0800_appli`
(Android + 镜头 + 设置)、updater.img (VMLINUX.BIN / INITRD.IMG / busybox)
### 2. 从相机提取原始 NAND dump(非破坏性)
- `pmca-console updatershell -m ILCE-6000` → `pull /dev/nflasha` → 483 MB
- ⚠️ **已记录的陷阱**:相机要求物理**按下 OK 按钮**
("reset device OK") 才能进入更新程序模式 —— 否则 dump 会卡住。
### 3. 验证:dump 与发布的固件完全匹配
| 分区 | dump 中的偏移量 | 大小 | 匹配 |
|---|---|---|---|
| nflasha3 | `0x01340000` | 10.96 MB | ✅ `diff_bytes = 0` |
| nflasha5 | `0x03b40000` | 40.30 MB | ✅ `diff_bytes = 0` |
| nflasha7 | `0x07c40000` | 3.17 MB | ✅ `diff_bytes = 0` |
| nflasha15 | `0x08b40000` | 80.15 MB | ✅ `diff_bytes = 0` |
| nflasha16 | `0x0ef40000` | 56.28 MB | ✅ `diff_bytes = 0` |
基本事实:相机固件 3.21 == 已发布的 3.21。
### 4. 相机运行 Android —— 并且我们获取了它的 `/data`
在 dump 的 `0x14200000` 位置存在一个约 100 MB 的 **FAT16 文件系统** —— 即相机的
Android userdata。内部包含:
- **已安装的 app(恢复了 APK):**
- `com.github.ma1fo.openmemories.tweak` — **OpenMemories: Tweak**(开源越狱工具)
- OpenMemories: AppStore、FocusBracket、BetterManual、TimeLapse (Jonas Juffinger)
- **设置备份** `BK1.BAK` / `BK2.BAK`(每个 1.3 MB)
- **Wi-Fi supplicant 配置**(WPS/Wi-Fi Direct,`device_name=ILCE-6000_*`)
- **电池校准**文件、Dalvik 缓存、Sony 系统服务
## 为什么这很重要
- A6000 是一款**完全由 Android 驱动的相机** —— 证实了现代 Sony
ILC 在内部运行 Android,并在其上层附加了一个 scalar/launcher 层。
- **updatershell 路由**是一种干净、非破坏性的方式来 dump 这些设备,
无需电烙铁 —— 此处记录了物理按下 OK 按钮的陷阱,以便
其他人不会遇到同样的 5 分钟卡顿。
- 逐字节相同的验证证明了已发布的固件和刷入的
固件是相同的,并为区域映射奠定了基础。
## 适用人群
- **Sony Alpha 相机所有者** —— 准确了解相机的 flash 上有什么,如何
以只读方式 dump 它,以及为什么需要物理按下 OK 按钮。
- **OpenMemories / 相机自制(homebrew)开发者** —— 一个关于
updatershell 路由的完整实例,以及用于开发的已记录 NAND 区域映射。
- **固件 / 嵌入式 Linux 研究人员** —— 一个关于
Qualcomm CXD90014 设备、更新程序提取和 NAND dump 取证的干净案例研究。
- **Android 取证人员** —— 一台直接从原始 NAND 中提取出
Android userdata 分区的消费级设备,并包含恢复脚本。
## 自行复现
```
# 阶段 1 — 解包官方固件(需要:python3、fwtool.py、7z)
# (docs/02-phase1-unpacking.md 中的 URL — Sony 的支持网站在 curl 时返回 403;
# 真实的 CDN URL 是从 Wayback Machine 快照中恢复的)
# 阶段 2 — dump 你自己的相机(需要:Sony-PMCA-RE,相机处于 updater 模式)
pip install git+https://github.com/ma1co/Sony-PMCA-RE
pmca-console updatershell -m ILCE-6000 # press OK on the camera screen!
# 然后,在 shell 内:
# pull /dev/nflasha nflasha
# pull /dev/bootloader boot1
# quit
# 与已发布的固件进行验证
python3 scripts/verify_partitions.py nflasha 标签:NAND闪存, Python, 固件逆向, 嵌入式系统, 无后门, 硬件研究, 逆向工具