LOADING

加载过慢请开启缓存 浏览器默认开启

电子取证——iOS文件系统结构

iOS 取证和 Android 最大的不同在于:很多时候你拿到的不是一个“直接可浏览的文件系统”,而是 iTunes/MobileSync 备份、Cellebrite/GrayKey 等工具导出的逻辑文件,或者按 Domain 组织过的文件集合。

所以 iOS 入门最重要的不是先背某个 APP 的库名,而是先理解:备份怎样把真实路径映射成哈希文件名,系统数据放在哪些 Domain,应用沙盒和 AppGroup 又是什么关系。

这篇文章按“知识点 + 对应小题”的方式,从取证角度认识 iOS 文件系统结构。

1. 先判断你拿到的是什么

iOS 检材常见形态:

检材形态 常见特征 第一反应
iTunes/MobileSync 备份 Info.plistManifest.plistManifest.db、大量哈希文件 先看备份元数据,再查 Manifest.db
Cellebrite/逻辑提取 已还原目录、报告、数据库、plist 先看工具摘要,再回到原始文件验证
文件系统提取 /private/var/mobile/ 等路径 直接按真实路径找系统和应用数据
单个应用容器 DocumentsLibrarytmp 先判断 AppDomain 或 AppGroup
iCloud/云同步数据 CloudDocs、照片、备份记录 注意本地与云端状态

iOS 题常见排查顺序:

  1. 问设备型号、系统版本、IMEI、备份时间:看 Info.plist
  2. 问备份是否加密:看 Manifest.plist
  3. 问某文件在备份里真实文件名:查 Manifest.db
  4. 问短信、通话、通讯录、Safari:看 HomeDomain 下系统数据库。
  5. 问照片、截图、来源 APP、GPS:看 Photos.sqlite
  6. 问 WhatsApp、Telegram、微信:看 AppDomain 和 AppGroup。
  7. 问 AirDrop、应用前台、系统交互:看 CoreDuet。

小题 1

你拿到一个 iPhone 备份目录,里面有 Info.plistManifest.plistManifest.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_DECManifest.plist_DEC,要优先检查是不是已经有解密后的文件,而不是直接去爆破密码。

小题 2

题目问“这个 iPhone 备份是否加密”,优先看哪个文件和字段?

答案:

Manifest.plist 中的 WasEncrypted / IsEncrypted

解析:备份加密状态属于备份整体元数据,不在短信、照片等业务数据库里。

3. Manifest.db 与 Domain

Manifest.db 是 iOS 备份定位文件的核心。最常用的表是 Filesfiles,不同版本大小写可能不同,核心字段类似:

字段 意义
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
FROM files
WHERE domain = 'HomeDomain'
AND relativePath = 'Library/SMS/sms.db';

查所有数据库:

SELECT fileID, domain, relativePath
FROM files
WHERE relativePath LIKE '%.db'
OR relativePath LIKE '%.sqlite'
ORDER BY domain, relativePath;

查某个 APP:

SELECT fileID, domain, relativePath
FROM files
WHERE domain LIKE 'AppDomain-net.whatsapp.WhatsApp%'
OR domain LIKE 'AppDomainGroup-group.net.whatsapp%';

小题 3

题目给出逻辑路径 HomeDomain:Library/SMS/sms.db,要求在备份目录中找到真实文件。你应该直接翻目录猜文件名,还是查哪个数据库?

答案:查 Manifest.db

解析:备份文件名是 SHA-1 哈希值,不是原始文件名。Manifest.dbdomain + 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/
│ ├── Caches/
│ └── Application Support/
└── tmp/
子目录 取证意义
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、chat、attachment

解析:message 存正文、时间和方向,handle 存对方号码或 Apple ID,附件再看 attachment

6. Photos.sqlite:照片题的核心

iOS 照片题不能只看图片文件和 EXIF。照片库数据库 Photos.sqlite 能回答很多 EXIF 回答不了的问题。

常见路径:

MediaDomain:PhotoData/Photos.sqlite
/private/var/mobile/Media/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 保存的”,优先看 ZIMPORTEDBYBUNDLEIDENTIFIERZIMPORTEDBYDISPLAYNAMEZORIGINALFILENAME,再用 EXIF 交叉验证。

注意:有些库里 ZLATITUDE = -180 或经纬度为 0,可能表示无有效 GPS,不要直接当真实坐标。

小题 6

题目问“某张 HEIC 是否由 WhatsApp 保存到相册”,只看文件名够不够?应该优先看哪个字段?

答案:不够。应优先看 Photos.sqlite 中的 ZIMPORTEDBYBUNDLEIDENTIFIERZIMPORTEDBYDISPLAYNAME

解析:文件名只能提供线索,来源 APP 要看照片库记录。WhatsApp 可能显示为 net.whatsapp.WhatsApp

7. CoreDuet:行为和交互痕迹

CoreDuet 是 iOS 行为分析中很有价值的部分。它记录应用前台、通知、交互、AirDrop 等系统层行为。

常见路径:

/private/var/mobile/Library/CoreDuet/
/private/var/mobile/Library/CoreDuet/Knowledge/knowledgeC.db
/private/var/mobile/Library/CoreDuet/People/interactionC.db

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 中某字段 ZDATECREATED768000000,它大概率是什么时间基准?

答案: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 分层分析。