---
name: re-mobile-forensics
type: atomic
description: >
  移动设备取证：Android/iOS 备份解析、应用数据提取、删除恢复与时间线。
  触发词：移动取证、手机取证、ADB备份、iTunes备份、手机数据提取。
capabilities: [mobile-forensics]
---

# 移动设备取证

## 何时使用 / 何时不用

- 用：设备备份/镜像的数据提取、应用数据取证、删除恢复、时间线重建
- 用：应用数据落盘路径解析（数据库/偏好/缓存）——App 结构理解配合 [[re-mobile]]
- 用：时间点对比取证（备份前后数据变化/已删除记录比对）
- 用：轻量定向提取（单应用单表数据——直接 run-as/单应用备份，不必全量）
- 用：删除数据可恢复性评估（先判定再动手，避免无效耗时）
- 用：设备已离线/损坏时（备份文件仍可解析——备份解析不依赖设备在线）
- 不用：App 逆向分析（[[re-mobile]]）；通用文件系统分析（[[re-disk-forensics]]）；运行中进程动态提取（[[re-frida]]）
- 不用：云备份/云同步数据（Google/iCloud 云侧不在本技能，取证范围需另行授权）
- 不用：无授权设备（红线：仅授权设备；设备隔离与保全原则见 [[gotchas]]）

## 工具准备

### adb（Android 设备接口）

- Linux: `apt install adb` / `dnf install android-tools`；macOS: `brew install android-platform-tools`；Windows: 官方平台工具
- 验证: `adb --version`；`adb devices` 需设备开启 USB 调试并授权（屏幕弹窗确认）

### libimobiledevice（iOS 设备接口）

- Linux: `apt install libimobiledevice-utils`；macOS: `brew install libimobiledevice`；Windows: 官方构建
- 验证: `idevice_id -l`（列出设备）

### 备份解析工具

- Android: abe（Android Backup Extractor，Java jar，GitHub `nelenkov/android-backup-extractor`：`java -jar abe.jar unpack backup.ab backup.tar`）或等价 python 脚本；验证: `java -jar abe.jar --help`（需 Java，安装见 [[re-java]]）
- iOS: `idevicebackup2` + manifest 解析（见步骤 2）
- sqlite3（数据库读取——Linux: `apt install sqlite3`；macOS: `brew install sqlite3`；Windows: 官方构建）；验证: `sqlite3 --version`
- foremost（数据雕刻——Linux: `apt install foremost`；macOS: `brew install foremost`）；验证: `foremost -h`
- python3（解析脚本）：安装见 [[re-python]] 工具准备

## 操作步骤

按顺序执行；设备操作遵循授权边界（红线：仅授权设备）。取证顺序：隔离（断网/飞行模式）→ 记录设备状态（版本/解锁/加密/网络）→ 只读提取优先 → 产物存档。每步产物存档（路径 + sha256，见 [[re-triage]]）；远端擦除与保全细节见 [[gotchas]]。

1. **Android 提取**：
   ```sh
   adb backup -f backup.ab -all        # 全量备份（应用需允许备份）
   adb backup -f app.ab -apk -noobb com.target.app   # 单应用备份（按包名）
   adb shell run-as com.target.app ls data   # 应用沙箱（debuggable 应用）
   # root 设备：dd 镜像关键分区 / adb pull /data 直接提取
   ```
   - 备份可行性预检：`adb shell bmgr list transports`（确认系统备份服务可用；无输出/报错 → adb backup 不可用，换路径）
   - 设备状态记录：版本（`adb shell getprop ro.build.version.release`）+ 加密/解锁状态（影响后续解析路径）
   - `adb backup` 现状：Android 12 起官方弃用，targetSDK 31+ 的应用数据不再导出（仅 targetSDK<31 或 debuggable 应用有效，Play 商店新应用基本不可用）——失效时换 root/镜像提取（判据见 [[decision-tree]]）
   - ab 格式：魔数 `ANDROID BACKUP` + 版本/标志字节（压缩/加密位）+ 可选 AES-256-CBC 加密参数 + tar（可 deflate 压缩）负载
   - 备份解析：ab 头 → 解包 tar（加密备份需备份密码；无密码标注不可提取）；产物先用 `file backup.ab` 验魔数与大小
   - 产物存放：独立目录 + 命名含设备标识/时间（防多设备混淆）
   - 解析组合套路：`abe unpack backup.ab backup.tar`（加密备份密码为末尾位置参数：`abe unpack backup.ab backup.tar <密码>`，或设 `ABE_PASSWD` 环境变量）→ `tar tf` 列内容 → sqlite3/plist 分析
   - 应用沙箱：`run-as`（debuggable）/ root 设备直接读；`allowBackup=false` 的应用备份为空且无警告（见坑 2）
   - run-as 二进制安全拉取：`adb exec-out run-as com.target.app cat files/x.db > x.db`（exec-out 不做终端转义）
   - root 镜像注意：先查分区表（`adb shell ls /dev/block/by-name/` 或 `cat /proc/partitions`）再 dd 目标分区；镜像产物大，先确认磁盘空间
   - 硬件 Keystore 密钥不可通过备份导出（绑定设备硬件，标注局限）
   - 数据库提取 → sqlite3（[[re-disk-forensics]] 的 SQLite 页结构方法）

2. **iOS 提取**：
   ```sh
   idevicebackup2 backup ./backup_dir
   # 备份结构：Manifest.plist（元数据）+ Manifest.db（文件索引）+ 按 fileID 分目录的文件
   ```
   - 备份结构：Manifest.db（SQLite 文件索引：domain/相对路径 → fileID，iOS 10+；更早版本为 Manifest.mbdb）、Manifest.plist（备份元数据：IsEncrypted/BackupKeyBag/ManifestKey/设备信息）、Info.plist（设备信息）、Status.plist（备份状态）、文件按 fileID 命名（fileID = SHA1(domain + "-" + relativePath)，由路径派生、与内容无关；见 [[gotchas]] 解析坑）
   - 首次连接需设备端信任（设置 > 通用 > 设备管理/信任此电脑）——未信任时 idevice_id 无输出
   - 加密备份判定：读 Manifest.plist 的 `IsEncrypted` 键（加密备份下 Manifest.plist 仍可明文读取，密钥材料 BackupKeyBag/ManifestKey 就在其中）；被加密的是 Manifest.db 与各文件内容——需备份密码解密（无密码则标注不可提取）
   - Keychain 数据在 keychain-backup.plist，同样需备份密码解密（密钥由密码派生，工具差异大，按实际工具文档操作）
   - 应用数据路径：Library/Preferences（plist 偏好）、Documents（用户数据）、Caches（缓存）、Library/Application Support（数据库常见位置）——App 结构理解见 [[re-mobile]]
   - 提取优先级：数据库 > 偏好 > 缓存（缓存可能含已删除内容残留）
   - 备份完整性核对：按 Manifest.db 索引逐条核对——每条 domain/相对路径对应的 fileID 文件实际存在，索引与文件不一致时标注
   - 备份与实时提取选型：备份优先（不触碰设备，证据完整性好）；需最新状态时实时提取并记录操作时间
   - 已有本地备份时直接解析默认目录：`~/Library/Application Support/MobileSync/Backup`（每设备独立子目录，核对 UDID 防混设备）

3. **删除恢复与时间线**：
   - SQLite 删除记录：freelist 页/WAL 未 checkpoint 页/未分配页残留——先确认 journal_mode（WAL/delete/journal）再选恢复路径，方法见 [[re-disk-forensics]] 数据库文件格式
   - 数据雕刻：foremost 对未分配空间按文件签名恢复（图片/压缩包/数据库页）；默认覆盖常见签名（jpg/png/zip），自定义类型用配置文件（`-c`）；恢复物用 magic/可读性验证（[[re-triage]] 初勘）
   - 加密设备注意：Android FBE/全盘加密下未分配页是密文，雕刻无效——优先走备份/镜像内已解密文件路径（见坑 8）
   - 时间线重建：文件时间戳 + 数据库记录时间（先归一 UTC，标注设备时区——坑 4）+ Status.plist 备份时点（佐证）
   - 恢复数据交叉验证：同一记录在多个数据库出现（如聊天库 + 索引库）时交叉比对，提高可信度
   - 产出：时间线表（时间/动作/来源）+ 恢复数据（按应用/数据类型归档）；时间线证据分级见 [[decision-tree]]

4. **证据整合与交付**：
   - 汇总：时间线表 + 提取物清单（每类数据的来源/提取方式/可信度）+ 方法记录
   - 结论按 [[re-analyze/analysis-contract]] 复核格式交付（结论/证据/置信度）；删除恢复带「部分恢复」限定

## 跨域联合

- [[re-forensics]] 网关：本技能归属
- [[re-disk-forensics]]：SQLite 结构/WAL/删除恢复方法
- [[re-mobile]]：App 结构理解（沙箱路径/数据结构）
- [[re-frida]]：运行中动态提取（本技能是静态/备份侧，两者互补）
- [[re-triage]]：产物初勘（类型/magic/哈希）
- [[re-mem-forensics]]：设备内存转储分析衔接（root 设备可 dump 内存）
- [[re-analyze/analysis-contract]]：结论交付格式

## 常见坑与陷阱

- **加密备份无密钥**：现象——备份无法解析；原因——AES 加密；对策——无密码则标注不可提取，不硬破解（授权边界）
- **ADB backup 权限限制**：现象——备份为空；原因——应用未声明 `allowBackup` 或 targetSDK≥31（Android 12+）；对策——换 root/镜像提取，标注路径局限
- **iOS 哈希路径混淆**：现象——文件找不到；原因——备份文件按 fileID（路径派生的 SHA1，不是内容哈希）分两级目录组织（fileID 前两位/完整 fileID），不是原名；对策——先解析 Manifest.db 的 domain/相对路径 ↔ fileID 映射再定位文件
- **时间线时区**：现象——时间错位；原因——设备时区与取证时区不一致；对策——统一 UTC 记录，标注设备时区
- **沙箱边界**：现象——拿不到目标数据；原因——无 root/未越狱；对策——按可提取范围交付（限定结论），不越授权
- **设备联网被远端擦除**：现象——提取中数据消失/变化；原因——设备联网触发远端抹除/同步覆盖；对策——先隔离（飞行模式/断网），后接电源防自动关机
- **备份中途损坏**：现象——备份文件不完整/解析报错；原因——操作中断（线缆/锁屏/空间不足）；对策——重试前确认空间与连接稳定，产物 sha256 存档；损坏备份按未分配数据走雕刻
- **完整性校验缺失**：现象——提取数据被篡改/不完整不知情；原因——未做校验；对策——产物 sha256 存档，镜像类产物校验分区摘要（无摘要则标注无法校验）
- **FBE/全盘加密**：现象——雕刻恢复出来是密文；原因——设备开启文件级/全盘加密（现代 Android 默认）；对策——优先走备份/镜像内已解密文件路径，标注加密局限
- **锁屏/授权状态**：现象——`adb devices` 显示 unauthorized/offline；原因——锁屏未解锁/USB 调试授权过期；对策——先解锁（授权范围内）再连接，记录授权状态
- **adb 多设备歧义**：现象——命令报错/操作错设备；原因——多设备连接未指定序列号；对策——`adb devices` 确认序列号，命令加 `-s <serial>`
- **删除恢复误判**：现象——恢复出的「已删除」记录实际是应用保留的冗余副本；原因——应用多处保存；对策——以「备份内不存在 + 镜像内存在」为删除判据（交叉验证）
- **备份密码遗忘**：现象——有密码备份但密码丢失；原因——密码未随备份记录；对策——提取时立即记录密码来源（授权范围内），不可恢复时标注
- **备份格式版本差异**：现象——解析工具报格式错；原因——新旧 Android/iOS 备份格式差异；对策——用与系统版本匹配的工具链，标注版本
- 场景分支与提取路径选择见 [[decision-tree]]；边界与反例见 [[gotchas]]
