Android 取证的第一步不是急着逆向 APK,而是先知道数据会落在哪里。很多比赛题问账号、时间、Wi-Fi、聊天、照片、安装记录,本质上都是在问:你知不知道应该去哪个目录找。
这篇文章从取证角度认识 Android 文件系统结构。我们不追求把 Linux/Android 内核讲完,而是先建立一张“看到题目就知道去哪找”的地图。每一部分后面都配几道小题,方便把路径和题型对应起来。
1. Android 取证先看什么
拿到 Android 检材后,先判断它属于哪一类:
| 检材形态 | 常见内容 | 第一反应 |
|---|---|---|
| 整机镜像 | system、vendor、userdata 等分区 |
重点看 /data,再看系统分区补设备信息 |
| 应用数据导出 | 某个包名目录 | 先看 shared_prefs 和 databases |
| APK 文件 | AndroidManifest.xml、classes.dex |
先看权限、包名、入口、硬编码配置 |
| 备份文件 | .ab、厂商备份、手机助手备份 |
先解包,再还原应用目录结构 |
| 模拟器/虚拟机 | vmdk、osimg、data.vmdk |
当成第二台 Android 来看 |
Android 题最常用的排查顺序是:
- 问账号、登录状态、配置、token:先看
shared_prefs。 - 问聊天、记录、历史、业务数据:先看
databases。 - 问附件、图片、导出文件:看
files、cache和外部存储。 - 问装没装、版本、安装时间:看
/data/system/packages.xml。 - 问 Wi-Fi:看
/data/misc/wifi/WifiConfigStore.xml。 - 问恶意行为、权限、C2:再看 APK 的 Manifest 和代码。
小题 1
题目问“某 APP 的登录账号和 token 是什么”,你已经知道包名是 com.example.chat,第一步最应该看哪里?
答案:
/data/data/com.example.chat/shared_prefs/ |
解析:账号、token、登录状态、设备 ID 这类轻量配置,经常保存在 SharedPreferences XML 中。不要一上来逆向 APK。
2. Android 分区和 /data 的意义
Android 底层分区很多,但取证入门先记住这些:
| 分区/挂载点 | 常见文件系统 | 取证意义 |
|---|---|---|
boot |
ramdisk | 内核和启动 ramdisk |
recovery |
ramdisk | 恢复模式 |
/system |
EXT4 / EROFS | 系统应用、系统框架,通常只读 |
/vendor |
EXT4 / EROFS | 厂商 HAL、驱动相关组件 |
/product |
EXT4 / EROFS | 产品级系统应用和配置 |
/data |
EXT4 / F2FS | 用户数据,取证核心 |
/cache |
EXT4 | OTA、缓存,旧设备更常见 |
metadata |
EXT4 | 加密元数据 |
super |
动态分区容器 | Android 10+ 动态分区,把 system/vendor/product 等逻辑分区放进去 |
从取证角度看,/system 告诉你系统有什么,/data 告诉你用户做过什么。绝大多数用户行为痕迹都在 /data。
现代 Android 的 /data 常见文件系统是 EXT4 或 F2FS。F2FS 是为闪存优化的日志结构文件系统,很多手机的 userdata 会使用它。文件系统层面的删除恢复、时间戳、元数据分析会受文件系统影响,但比赛中更多时候是直接在解析出的目录和数据库里找证据。
/data 下最重要的几类目录
| 路径 | 意义 |
|---|---|
/data/data/<package>/ |
应用私有数据,旧写法和常见展示路径 |
/data/user/0/<package>/ |
主用户空间的应用私有数据,常与 /data/data 对应 |
/data/user_de/0/<package>/ |
Device Encrypted 数据,开机未解锁前也可用的一部分数据 |
/data/system/ |
系统配置、账号、安装信息、锁屏、使用记录 |
/data/misc/ |
Wi-Fi、蓝牙、系统杂项配置 |
/data/media/0/ |
用户外部存储,等价于常见的 /sdcard |
/data/data 和 /data/user/0 的关系很容易混淆。现在很多系统里 /data/data 可以理解为指向主用户 0 的兼容入口,而多用户、分身空间可能出现在 /data/user/10、/data/user/999 等路径。
小题 2
题目问“一台 Android 手机是否存在分身空间,某 APP 是否也在分身空间中安装过”,除了 /data/user/0,还应该注意哪些路径?
答案:
/data/user/10/ |
解析:主空间是 user 0,分身、工作资料、厂商隐私空间经常使用其他 userId。只看 /data/data 或 /data/user/0 会漏证据。
3. 应用私有目录四件套
Android 应用最核心的目录是:
/data/data/<package>/ |
或者:
/data/user/0/<package>/ |
里面最常见的四个子目录是:
| 子目录 | 取证意义 |
|---|---|
shared_prefs/ |
XML 键值配置,账号、token、开关、时间、设备 ID 高频出现 |
databases/ |
SQLite 数据库,聊天、历史、业务数据高频出现 |
files/ |
应用保存的普通文件、附件、导出文件、密钥文件 |
cache/ |
缓存图片、临时文件、接口缓存,有时能恢复已删除内容 |
shared_prefs
SharedPreferences 是 Android 应用最常见的键值存储。文件通常是 XML:
<map> |
常见 key:
| key 形态 | 常见含义 |
|---|---|
username、account、phone、email |
账号 |
uid、user_id、member_id |
用户 ID |
token、session、auth |
登录凭据 |
device_id、android_id、did |
设备 ID |
last_login_at、create_time、timestamp |
时间 |
db_password、key_iterations |
数据库或加密参数 |
读 SharedPreferences 时不要只看 value,先看 key 名。很多题的答案就藏在 key 的语义里。
databases
Android 应用大量使用 SQLite。常见文件形式:
main.db |
-wal 是 Write-Ahead Log,可能保存尚未合并进主库的新记录,也可能残留旧版本页面。取证导出数据库时,最好把 .db、.db-wal、.db-shm 一起导出,否则可能看到的记录不完整。
files 和 cache
files/ 常见业务文件、附件、密钥、导出内容。cache/ 常见缓存图、头像、缩略图、接口响应。不要因为叫 cache 就忽略它,很多“原图删除但缩略图还在”的题都靠缓存拿分。
小题 3
你在 databases/ 里看到:
chat.db |
只导出 chat.db 分析是否稳妥?
答案:不稳妥。应同时导出 chat.db、chat.db-wal、chat.db-shm。
解析:Android SQLite 常用 WAL 模式,新记录可能还在 WAL 文件中。只看主库可能漏掉最新聊天或状态变化。
4. 系统级关键路径
应用目录解决的是单个 APP 的行为,系统级目录解决的是“这台手机本身”的问题。
| 路径 | 内容 | 常见题型 |
|---|---|---|
/data/system/packages.xml |
已安装应用、版本、路径、签名、时间字段 | APP 是否安装、版本、更新时间 |
/data/system/packages.list |
包名与 UID 映射 | 目录属主、权限关联 |
/data/system/users/0/settings_secure.xml |
Android ID 等安全设置 | 设备标识、派生密钥 |
/data/system/users/0/accounts.db |
系统账户 | Google、微信、QQ、邮箱账户 |
/data/system/usagestats/0/ |
应用使用统计 | APP 使用时间、前台行为 |
/data/system/notification_log.db |
通知记录,视系统而定 | 收到过什么通知 |
/data/system/gatekeeper.pattern.key |
图案锁相关 | 锁屏破解 |
/data/system/gatekeeper.password.key |
密码锁相关 | 锁屏破解 |
/data/system/device_policy.xml |
设备策略 | 密码复杂度、长度约束 |
packages.xml
packages.xml 是比赛里非常常见的系统文件。高频字段包括:
| 字段 | 含义 |
|---|---|
name |
包名 |
codePath |
APK 安装路径 |
version |
versionCode 或版本相关值 |
userId |
系统分配 UID |
ut |
常用于最后更新时间 |
ft / it |
常与首次安装、首次扫描或文件时间相关,需要交叉验证 |
<sigs> / <cert> |
签名证书信息 |
不要机械认为 ft、it 在所有 Android 版本里含义完全一致。比赛中如果问安装时间,最好用取证工具解析结果、APK 文件时间、包管理记录一起验证。
系统账户
账户数据库常见位置:
/data/system/users/0/accounts.db |
常见 type:
| type | 服务 |
|---|---|
com.google |
Google 账户 |
com.tencent.mm |
微信 |
com.tencent.mobileqq |
|
com.xiaomi |
小米 |
com.whatsapp |
|
org.telegram.messenger |
Telegram |
小题 4
题目问“某 APP 的版本号和最后更新时间是什么”,最优先看的系统文件是哪一个?
答案:
/data/system/packages.xml |
解析:packages.xml 记录包名、安装路径、版本、更新时间、签名等信息,是安装类题目的第一入口。
5. Wi-Fi、蓝牙和设备标识
Android Wi-Fi 记录常见位置:
/data/misc/wifi/WifiConfigStore.xml |
不同版本路径可能变化,但文件名经常仍是 WifiConfigStore.xml。
常见字段:
| 字段 | 含义 |
|---|---|
SSID |
Wi-Fi 名称 |
BSSID |
接入点 MAC 地址 |
PreSharedKey |
Wi-Fi 密码或密钥表示 |
HiddenSSID |
是否隐藏网络 |
NumAssociation |
连接/关联次数 |
CreatorUid |
创建该配置的 UID |
IpAssignment |
DHCP 或 STATIC |
ProxySettings |
代理设置 |
RandomizedMacAddress |
随机 MAC |
注意:BSSID 是路由器/AP 的 MAC,不是手机自己的 MAC。很多初学者会把这两个搞混。
蓝牙配置常见在:
/data/misc/bluedroid/bt_config.conf |
有些系统还会在数据库或 XML 中保存已配对设备、设备名、MAC 等。
小题 5
题目问“手机连接过的 Wi-Fi 接入点 MAC 地址是什么”,应该优先看 SSID 还是 BSSID?
答案:BSSID
解析:SSID 是 Wi-Fi 名称,BSSID 才是具体接入点的 MAC 地址。一个 SSID 可以对应多个 BSSID。
6. 媒体、下载和外部存储
普通用户看到的“内部存储”通常对应:
/sdcard/ |
常见目录:
| 路径 | 内容 |
|---|---|
/sdcard/DCIM/ |
相机照片、视频 |
/sdcard/Pictures/ |
图片、截图、应用保存图 |
/sdcard/Download/ |
下载文件 |
/sdcard/Android/data/<package>/ |
应用外部私有目录 |
/sdcard/Android/media/<package>/ |
新版本常见媒体共享目录 |
媒体数据库也很重要:
/data/data/com.android.providers.media/databases/external.db |
高频字段:
| 字段 | 含义 |
|---|---|
_data |
文件完整路径,旧版本更常见 |
_display_name |
显示文件名 |
relative_path |
相对路径,新版本更常见 |
date_added |
加入媒体库时间,Unix 秒 |
date_modified |
修改时间 |
mime_type |
MIME 类型 |
latitude / longitude |
GPS |
is_trashed |
是否在回收站 |
相册题不能只看 DCIM。应用私有图片、缓存图、缩略图经常出现在:
/sdcard/Android/data/<package>/ |
小题 6
原图在相册里找不到,但题目提示某 APP 曾经显示过这张图,你还可以去哪里找?
答案示例:
/data/data/<package>/cache/ |
解析:很多 APP 会缓存图片、头像、缩略图。原图删除不代表缓存一定同步删除。
7. 常见应用路径举例
不同 APP 路径不同,但思路相同:先用包名定位应用目录,再按四件套看。
| 应用/场景 | 常见路径 | 取证点 |
|---|---|---|
| 微信 | /data/data/com.tencent.mm/MicroMsg/<hash>/EnMicroMsg.db |
聊天记录,常需解密 |
| 微信配置 | /data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml |
UIN、解密线索 |
| Chrome | /data/data/com.android.chrome/app_chrome/Default/History |
浏览历史、下载 |
| WebView | /data/data/<pkg>/app_webview/Default/History |
应用内网页访问 |
| 小米智能家庭 | /data/data/com.xiaomi.smarthome/ |
家庭、房间、设备 DID |
| Telegram | /data/data/org.telegram.messenger/ |
账号、缓存、数据库 |
/data/data/com.whatsapp/ |
消息、媒体、群组 | |
| Termux | /data/data/com.termux/files/ |
Linux 环境、脚本、命令痕迹 |
| VMOS | /sdcard/Android/data/com.VMOS.pro/osimg/ |
虚拟 Android 系统 |
微信数据库经常要用 UIN 和设备信息派生密钥;Chrome/Chromium 时间戳常是从 1601 年开始的 WebKit 微秒;Android 普通业务时间戳常是 Unix 秒或毫秒。
小题 7
一个 Android 时间字段值是 1744796769000,它大概率是什么单位?
答案:Unix 毫秒时间戳。
解析:13 位整数通常是毫秒。换算时要除以 1000;如果直接当秒,会得到明显离谱的未来时间。
8. APK 什么时候看
APK 不是不能看,而是要在合适的时候看。
APK 本质是 ZIP,常见结构:
| 文件/目录 | 内容 |
|---|---|
AndroidManifest.xml |
包名、权限、组件、入口 |
classes.dex |
Dalvik 字节码 |
resources.arsc |
编译后资源表 |
res/ |
资源 |
assets/ |
原始资产 |
lib/ |
native so 库 |
META-INF/ |
旧版签名信息 |
适合看 APK 的题:
- 问包名、应用名、权限、入口 Activity;
- 问 C2、Webhook、硬编码密钥;
- 问加密算法、数据库密码如何派生;
- 问恶意行为、后台服务、广播接收器;
- 问 Flutter、React Native、壳或 native 库。
但如果题目问登录账号、聊天记录、安装时间,通常先看本地数据,不要先逆向。
小题 8
题目问“这个 APP 是否申请了读取短信权限”,应该看应用数据目录还是 APK?
答案:看 APK 的 AndroidManifest.xml。
解析:权限声明在 Manifest 中;应用数据目录更适合找用户数据和运行痕迹。
9. 做 Android 题的路线图
最后整理成一张路线图:
| 题目关键词 | 第一入口 |
|---|---|
| 账号、token、登录状态 | shared_prefs/ |
| 聊天、历史、业务记录 | databases/ |
| 图片、附件、缓存 | files/、cache/、/sdcard/Android/data/ |
| APP 版本、安装时间 | /data/system/packages.xml |
| Wi-Fi 名称、BSSID、密码 | WifiConfigStore.xml |
| Android ID | settings_secure.xml |
| 系统账户 | accounts.db |
| 浏览器历史 | Chrome/WebView History |
| 权限、C2、硬编码密钥 | APK Manifest、DEX、assets、lib |
| 分身/虚拟机 | /data/user/<非0>/、VMOS/Nox/雷电镜像 |
一句话总结:Android 取证不是背一个万能路径,而是根据题目类型判断数据层级:系统级、应用级、媒体级、还是 APK 代码级。