iOS 取证和 Android 最大的不同在于:很多时候你拿到的不是一个“直接可浏览的文件系统”,而是 iTunes/MobileSync 备份、Cellebrite/GrayKey 等工具导出的逻辑文件,或者按 Domain 组织过的文件集合。
所以 iOS 入门最重要的不是先背某个 APP 的库名,而是先理解:备份怎样把真实路径映射成哈希文件名,系统数据放在哪些 Domain,应用沙盒和 AppGroup 又是什么关系。
这篇文章按“知识点 + 对应小题”的方式,从取证角度认识 iOS 文件系统结构。
1. 先判断你拿到的是什么
iOS 检材常见形态:
| 检材形态 | 常见特征 | 第一反应 |
|---|---|---|
| iTunes/MobileSync 备份 | Info.plist、Manifest.plist、Manifest.db、大量哈希文件 |
先看备份元数据,再查 Manifest.db |
| Cellebrite/逻辑提取 | 已还原目录、报告、数据库、plist | 先看工具摘要,再回到原始文件验证 |
| 文件系统提取 | /private/var/mobile/ 等路径 |
直接按真实路径找系统和应用数据 |
| 单个应用容器 | Documents、Library、tmp |
先判断 AppDomain 或 AppGroup |
| iCloud/云同步数据 | CloudDocs、照片、备份记录 | 注意本地与云端状态 |
iOS 题常见排查顺序:
- 问设备型号、系统版本、IMEI、备份时间:看
Info.plist。 - 问备份是否加密:看
Manifest.plist。 - 问某文件在备份里真实文件名:查
Manifest.db。 - 问短信、通话、通讯录、Safari:看 HomeDomain 下系统数据库。
- 问照片、截图、来源 APP、GPS:看
Photos.sqlite。 - 问 WhatsApp、Telegram、微信:看 AppDomain 和 AppGroup。
- 问 AirDrop、应用前台、系统交互:看 CoreDuet。
小题 1
你拿到一个 iPhone 备份目录,里面有 Info.plist、Manifest.plist、Manifest.db。题目问设备型号和最后备份时间,第一步看哪个文件?
答案:Info.plist
解析:Info.plist 保存设备名称、机型标识、系统版本、序列号、IMEI、最后备份时间等摘要信息。
2. MobileSync 备份结构
Windows 上 iPhone 本地备份常见位置:
C:\Users\<user>\AppData\Roaming\Apple Computer\MobileSync\Backup\ |
macOS 上常见位置:
~/Library/Application Support/MobileSync/Backup/ |
备份目录中最重要的三个文件:
| 文件 | 作用 |
|---|---|
Info.plist |
设备信息、备份时间、系统版本 |
Manifest.plist |
备份整体元数据、是否加密、BackupKeyBag |
Manifest.db |
文件索引,把逻辑路径映射到真实哈希文件名 |
备份里的普通文件通常不是原名保存,而是哈希文件名。例如短信数据库逻辑路径是:
HomeDomain:Library/SMS/sms.db |
备份中真实文件名是对 Domain-relativePath 计算 SHA-1 后得到的 40 位十六进制值,并放在前两位对应的子目录下。实际定位时不用手算,直接查 Manifest.db 更稳。
Info.plist 常见字段
| 字段 | 意义 |
|---|---|
Device Name / DeviceName |
设备名称 |
ProductType |
机型标识,例如 iPhone14,5 |
ProductVersion |
iOS 版本 |
Build Version |
构建版本 |
Serial Number / SerialNumber |
序列号 |
IMEI |
IMEI |
Phone Number / PhoneNumber |
手机号 |
Last Backup Date / LastBackupDate |
最后备份时间 |
Unique Identifier / UniqueDeviceID |
UDID 类标识 |
Manifest.plist 常见字段
| 字段 | 意义 |
|---|---|
WasEncrypted |
备份是否加密 |
IsEncrypted |
加密状态,视版本而定 |
BackupKeyBag |
备份密钥包 |
Date |
备份相关时间 |
Lockdown |
设备摘要信息 |
如果工具解析时提示备份加密,但目录中同时存在 Manifest.db_DEC、Manifest.plist_DEC,要优先检查是不是已经有解密后的文件,而不是直接去爆破密码。
小题 2
题目问“这个 iPhone 备份是否加密”,优先看哪个文件和字段?
答案:
Manifest.plist 中的 WasEncrypted / IsEncrypted |
解析:备份加密状态属于备份整体元数据,不在短信、照片等业务数据库里。
3. Manifest.db 与 Domain
Manifest.db 是 iOS 备份定位文件的核心。最常用的表是 Files 或 files,不同版本大小写可能不同,核心字段类似:
| 字段 | 意义 |
|---|---|
fileID |
备份目录里的真实哈希文件名 |
domain |
文件所属域 |
relativePath |
逻辑相对路径 |
flags |
文件、目录、加密等标志 |
file |
bplist 格式的文件元数据 |
常见 Domain:
| Domain | 说明 |
|---|---|
HomeDomain |
用户主目录 |
MediaDomain |
媒体文件,例如 DCIM、PhotoData |
AppDomain-<bundle-id> |
应用私有容器 |
AppDomainGroup-group.<id> |
AppGroup 共享容器 |
SystemPreferencesDomain |
系统偏好设置 |
KeychainDomain |
钥匙串备份 |
WirelessDomain / WiFiDomain |
无线相关 |
HealthDomain |
健康数据 |
查短信数据库示例:
SELECT fileID, domain, relativePath |
查所有数据库:
SELECT fileID, domain, relativePath |
查某个 APP:
SELECT fileID, domain, relativePath |
小题 3
题目给出逻辑路径 HomeDomain:Library/SMS/sms.db,要求在备份目录中找到真实文件。你应该直接翻目录猜文件名,还是查哪个数据库?
答案:查 Manifest.db。
解析:备份文件名是 SHA-1 哈希值,不是原始文件名。Manifest.db 的 domain + relativePath 可以映射到 fileID。
4. iOS 的真实目录结构
在完整文件系统提取中,常见根路径是:
/private/var/mobile/ |
用户数据、应用数据、媒体数据大多围绕这里展开。
| 路径 | 意义 |
|---|---|
/private/var/mobile/Media/ |
照片、视频、媒体数据 |
/private/var/mobile/Library/ |
系统级用户数据,例如短信、Safari、CallHistory |
/private/var/mobile/Containers/Data/Application/<UUID>/ |
应用私有沙盒 |
/private/var/mobile/Containers/Shared/AppGroup/<UUID>/ |
AppGroup 共享容器 |
/private/var/mobile/Library/Preferences/ |
用户偏好 plist |
/private/var/mobile/Library/CoreDuet/ |
行为、交互、知识库 |
应用沙盒
iOS 每个应用都有沙盒,典型结构:
Containers/Data/Application/<UUID>/ |
| 子目录 | 取证意义 |
|---|---|
Documents/ |
用户生成或应用明确保存的数据 |
Library/Preferences/ |
plist 配置,账号、开关、状态 |
Library/Caches/ |
缓存、缩略图、接口数据 |
Library/Application Support/ |
数据库、业务文件 |
tmp/ |
临时文件 |
AppGroup
很多应用会把关键数据放在 AppGroup,而不是 AppDomain。WhatsApp、微信、Telegram 等都可能用共享容器保存数据库、媒体或扩展数据。
例如 WhatsApp 常见共享容器:
group.net.whatsapp.WhatsApp.shared |
如果只看 AppDomain-net.whatsapp.WhatsApp,可能找不到完整聊天库或媒体索引。
小题 4
题目问 WhatsApp 群组和消息,但在 AppDomain-net.whatsapp.WhatsApp 中没有找到完整 ChatStorage.sqlite。下一步应该考虑哪里?
答案:考虑 AppDomainGroup-group.net.whatsapp.WhatsApp.shared 或完整文件系统中的 AppGroup 共享容器。
解析:iOS 应用可能把扩展、共享数据、主业务数据库放在 AppGroup 中。
5. 系统数据库:短信、通话、通讯录、Safari
iOS 的很多基础数据都是 SQLite 或 plist。
| 数据类型 | 备份 Domain / 路径 | 真实路径思路 |
|---|---|---|
| 短信/iMessage | HomeDomain:Library/SMS/sms.db |
/private/var/mobile/Library/SMS/sms.db |
| 通讯录 | HomeDomain:Library/AddressBook/AddressBook.sqlitedb |
/private/var/mobile/Library/AddressBook/ |
| 通话记录 | HomeDomain:Library/CallHistoryDB/CallHistory.storedata |
/private/var/mobile/Library/CallHistoryDB/ |
| Safari 历史 | HomeDomain:Library/Safari/History.db |
/private/var/mobile/Library/Safari/ |
| 备忘录 | HomeDomain:Library/Notes/notes.sqlite 或 AppGroup |
版本差异较大 |
| Wi-Fi | SystemPreferencesDomain:SystemConfiguration/com.apple.wifi.plist |
/private/var/preferences/SystemConfiguration/ |
sms.db
核心表:
| 表 | 作用 |
|---|---|
message |
消息正文、时间、方向、服务类型 |
handle |
对方号码或 Apple ID |
chat |
会话 |
attachment |
附件 |
高频字段:
| 字段 | 意义 |
|---|---|
message.text |
消息内容 |
message.date |
消息时间 |
message.is_from_me |
是否本人发送 |
message.service |
SMS 或 iMessage |
handle.id |
对方号码或 Apple ID |
attachment.filename |
附件路径 |
CallHistory.storedata
常见表 ZCALLRECORD:
| 字段 | 意义 |
|---|---|
ZADDRESS |
电话号码 |
ZDATE |
通话时间 |
ZDURATION |
通话时长 |
ZCALLTYPE |
来电、拨出、未接等 |
AddressBook.sqlitedb
常见表:
| 表 | 作用 |
|---|---|
ZABCDRECORD |
联系人主体 |
ZABCDPHONENUMBER |
电话号码 |
ZABCDEMAILADDRESS |
邮箱,视版本而定 |
小题 5
题目问“某条 iMessage 是谁发给谁、什么时候发的”,应该优先看哪个数据库和哪些表?
答案:
HomeDomain:Library/SMS/sms.db |
解析:message 存正文、时间和方向,handle 存对方号码或 Apple ID,附件再看 attachment。
6. Photos.sqlite:照片题的核心
iOS 照片题不能只看图片文件和 EXIF。照片库数据库 Photos.sqlite 能回答很多 EXIF 回答不了的问题。
常见路径:
MediaDomain:PhotoData/Photos.sqlite |
常见表:
| 表 | 作用 |
|---|---|
ZASSET |
资产主体,照片/视频基本信息 |
ZADDITIONALASSETATTRIBUTES |
EXIF、原始文件名、导入来源等扩展信息 |
ZCLOUDMASTER |
iCloud 相关资产信息 |
ZEXTENDEDATTRIBUTES |
扩展属性 |
高频字段:
| 字段 | 意义 |
|---|---|
ZFILENAME |
文件名 |
ZDIRECTORY |
存储目录 |
ZDATECREATED |
创建/拍摄时间 |
ZADDEDDATE |
加入照片库时间 |
ZMODIFICATIONDATE |
修改时间 |
ZLATITUDE / ZLONGITUDE |
GPS 坐标 |
ZTRASHEDSTATE |
是否进入最近删除 |
ZTRASHEDDATE |
删除时间 |
ZHIDDEN |
是否隐藏 |
ZIMPORTEDBYBUNDLEIDENTIFIER |
来源 APP |
ZIMPORTEDBYDISPLAYNAME |
来源 APP 显示名 |
ZORIGINALFILENAME |
原始文件名 |
ZCAMERACAPTUREDEVICE |
前后摄像头线索 |
题目问“这张图是不是本机拍的”“是不是截图”“是不是某 APP 保存的”,优先看 ZIMPORTEDBYBUNDLEIDENTIFIER、ZIMPORTEDBYDISPLAYNAME、ZORIGINALFILENAME,再用 EXIF 交叉验证。
注意:有些库里 ZLATITUDE = -180 或经纬度为 0,可能表示无有效 GPS,不要直接当真实坐标。
小题 6
题目问“某张 HEIC 是否由 WhatsApp 保存到相册”,只看文件名够不够?应该优先看哪个字段?
答案:不够。应优先看 Photos.sqlite 中的 ZIMPORTEDBYBUNDLEIDENTIFIER 或 ZIMPORTEDBYDISPLAYNAME。
解析:文件名只能提供线索,来源 APP 要看照片库记录。WhatsApp 可能显示为 net.whatsapp.WhatsApp。
7. CoreDuet:行为和交互痕迹
CoreDuet 是 iOS 行为分析中很有价值的部分。它记录应用前台、通知、交互、AirDrop 等系统层行为。
常见路径:
/private/var/mobile/Library/CoreDuet/ |
knowledgeC.db
常见用途:
| 流 | 含义 |
|---|---|
/app/inFocus |
应用前台使用 |
/notification/usage |
通知使用 |
/display/isBacklit |
屏幕状态 |
/locationVisit |
位置访问 |
高频字段:
| 字段 | 意义 |
|---|---|
ZSTREAM.ZNAME |
行为流名称 |
ZEVENT.ZSTARTDATE |
开始时间 |
ZEVENT.ZENDDATE |
结束时间 |
ZEVENT.ZVALUESTRING |
应用或行为值 |
interactionC.db
AirDrop、分享链路、联系人交互题常看它。
高频字段:
| 字段 | 意义 |
|---|---|
ZTARGETBUNDLEID |
目标应用/服务 |
ZBUNDLEID |
发起应用 |
ZDIRECTION |
方向,发送或接收 |
ZSENDER |
发送者线索 |
ZSTARTDATE |
交互开始时间 |
ZVALUE |
交互对象或补充信息 |
小题 7
题目问“某文件是否通过 AirDrop 接收”,你只看照片库和聊天库没有结果,下一步应该看什么?
答案:CoreDuet 的 interactionC.db。
解析:AirDrop 是系统分享行为,很多关键证据在交互数据库里,不一定在聊天数据库中。
8. plist 与 iOS 时间戳
iOS 里 plist 很常见,格式可能是 XML,也可能是二进制 bplist00。取证工具、plutil、Python 的 plistlib 都可以解析。
plist 常见类型:
| 类型 | 例子 |
|---|---|
| 字符串 | 账号、SSID、Bundle ID |
| 整数 | 计数、状态 |
| 布尔 | 开关 |
| 日期 | 标准时间 |
| Data | Base64 或二进制 blob |
| Array/Dict | 嵌套配置 |
iOS 时间戳必须重点记:
| 时间类型 | 起点 | 单位 | 常见位置 |
|---|---|---|---|
| Mac Absolute Time / Cocoa | 2001-01-01 UTC | 秒 | Photos、CallHistory、CoreDuet、很多 plist |
| Apple 纳秒时间 | 2001-01-01 UTC | 纳秒 | sms.db 中常见 |
| WebKit 时间 | 1601-01-01 UTC | 微秒 | Safari/Chromium 历史 |
| Unix 时间 | 1970-01-01 UTC | 秒/毫秒 | 部分第三方 APP |
Mac Absolute Time 转 Unix 的基本思路:
Unix 秒 = Mac Absolute Time + 978307200 |
如果时间换算后跑到 1970、2050 或明显不对,先检查单位是不是秒、毫秒、微秒、纳秒搞错了。
小题 8
Photos.sqlite 中某字段 ZDATECREATED 是 768000000,它大概率是什么时间基准?
答案:Mac Absolute Time / Cocoa 秒时间,起点是 2001-01-01 UTC。
解析:照片库、Core Data 类数据库常用 Apple 2001 基准秒时间,换算 Unix 时间时加 978307200。
9. 常见 iOS 题型路线图
| 题目关键词 | 第一入口 |
|---|---|
| 设备型号、IMEI、系统版本 | Info.plist |
| 备份是否加密 | Manifest.plist |
| 备份内某文件真实文件名 | Manifest.db |
| 短信、iMessage | HomeDomain:Library/SMS/sms.db |
| 通讯录 | HomeDomain:Library/AddressBook/AddressBook.sqlitedb |
| 通话记录 | HomeDomain:Library/CallHistoryDB/CallHistory.storedata |
| Safari 历史 | HomeDomain:Library/Safari/History.db |
| 照片来源、GPS、删除、隐藏 | MediaDomain:PhotoData/Photos.sqlite |
| Wi-Fi | SystemPreferencesDomain:SystemConfiguration/com.apple.wifi.plist |
| WhatsApp 群组、消息 | AppDomain + AppDomainGroup |
| AirDrop、分享链路 | CoreDuet interactionC.db |
| 应用前台使用 | CoreDuet knowledgeC.db |
| Keychain | KeychainDomain:keychain-backup.plist |
最后总结一句:iOS 取证的关键不是在一堆哈希文件里硬翻,而是先用 Manifest 建立“逻辑路径 -> 真实文件”的映射,再按系统数据库、应用沙盒、AppGroup 和 CoreDuet 分层分析。