iOS 系统结构:文件与目录

iOS Jailbreak Notes
14 min readOct 12, 2020

--

Photo By: Apple File System (APFS), the BIG iOS 10.3 Feature You’ve Never Heard Of

了解 iOS(iPadOS)系统文件及目录,列出一些主要的及重要的文件夹和目录。以下内容是以 iOS 12.4.8 版本进行说明,不同版本目录结构有区别。

iOS 根目录文件

粗体为 iOS 系统特有目录,其它与 Unix 通用

.ba/
.mb/

.fseventsd/
‘.HFS+ Private Directory Data’$’\r’/
Applications/
Developer/

Library/
System/

User -> /var/mobile/
cores/

bin/
boot/
dev/
etc -> private/etc/
lib/
mnt/
private/
sbin/
tmp -> private/var/tmp/
var/
usr/
.mount_rw
.Trashes

.ba/ 目录为空。

.mb/ 目录为空。

.fseventsd/ 在创建、修改或删除文件时会直接查询此日志。

‘.HFS+ Private Directory Data’$’\r’/ 可能与外接 USB 设备有关。

Applications/ 存放所有的系统 App 和 Cydia 的 App,但不含 AppStore 安装的 APP。

Developer/ 供开发者调试使用。

Library/ 存放一些提供系统支持的数据文件与帮助文档。

System/ 只包含一个名为Library的目录,存放了系统的绝大部分组件。

User -> /var/mobile/ mobile 用户的 home 目录。

cores/ 内核转储文件存放目录,进程崩溃时,如果系统允许则会产生转储文件。

bin/ 存放提供用户级基础功能的二进制文件,如 ls、ps 等。

boot/ 存放能使系统成功启动的所有文件,iOS 中此目录为空。

dev/ 访问外部设备文件的接口,每个文件代表系统的一个块或字符设备。

etc -> private/etc/ 存放系统脚本及配置文件, 指向 /private/etc/

lib/ 存放系统库文件、内核模块及设备驱动等。iOS 中此目录为空。

mnt/ 存放临时的文件系统挂载点。iOS 中此目录为空。

private/ 存放两个目录,分别是 /private/etc/private/var

sbin/ 存放提供系统级基础功能的二进制文件,如 netstat、reboot 等。

tmp -> private/var/tmp/ 临时目录,符号链接,实际指向 /private/var/tmp/

var/ 安装的 App 应用、日志、用户数据、临时文件等。

usr/ 包含了大多数用户工具和程序。

.mount_rw 在un0ver越狱模式下,建立此文件可使用checkra1n越狱。

.Trashes 文件被标记为删除但尚未删除时的去向。

Folders / Files 目录文件详解

.mount_rw

Pwn20wnd 推文:正在运行 unc0ver 越狱,并且想尝试 checkra1n 越狱而又不丢失任何调整,则可以创建一个 /.mount_rw 的空文件,然后安全地运行 checkra1n 越狱。

  1. 根目录下创建一个名为 .mount_rw 的文件,已有省略;
  2. 运行 checkra1n;
  3. 完成之后,打开 Terminal,以 root 用户身份登录,然后运行 touch / .mount_rw

注:iPad mini3 12.4.8 使用 checkra1n 越狱,没有用过 unc0ver,也没有自建过,但有此文件,应该是 checkra1n 已含此文件。以上过程未经测试。

.HFS+ Private Directory Data’$’\r /

可能与外接USB设备有关。

HFS +文件系统用来分别处理硬链接的文件夹和文件的特殊文件夹。

MFS -> HFS -> HFS+ -> APFS,苹果文件系统的进化,向下兼容。

.fseventsd /

在创建、修改或删除文件时会直接查询此日志目录。

目录不能访问,进入显示内容显示:Operation not permitted

猜测:(f)ile (s)ystem (events), logged by the a (d)aemon

监视后台进程 fsevents,在创建,修改或删除文件时会直接查询此日志。

文件 .Trashes 及目录 .fseventsd/ 见以下文章内容分析。

.Trashes

文件被标记为删除但尚未删除时的去向,详见下文。

Library /

存放一些提供系统支持的数据文件与帮助文档,包括 Tweak 及 App 相关数据。

./Ringtones/ 铃声文件

./Wallpaper/ 壁纸文件

./Audio/ 声音文件

./Keychains -> ../private/var/Keychains/ 保存用户名,密码,网络密码,认证令牌等信息的安全容器目录。

./LaunchAgents/ 存放第三方程序的代理程序 plist 文件,通常为空。

./LaunchDaemons/ 存放第三方程序的守护程序 plist 文件,如 com.openssh.sshd.plist 等。

./MobileSubstrate/DynamicLibraries/ 存放了所有基于 CydiaSubstrate 的插件,即 Tweak。

./PreferenceLoader/Preferences/Substrate/ 监听目录。

System /

只包含一个名为 Library 的目录,存放了系统的绝大部分组件

./Library/Fonts/ 字体。

./Library/CoreServices/SpringBoard.app/ 桌面管理器,是用户和系统直接交互的中介。

./Library/Frameworks/
./Library/PrivateFrameworks/

存放了 iOS 公开和私有的 Framework 动态库。

这些库文件中很多找不到对应的二进制文件。这是由于dyld 为了优化启动速度,启用了 shared cache 技术,将常用的动态库打包到一个 cache 文件中预加载。

./Library/Carrier Bundles/ 里面是运营商的一些配置。

./Library/PerferenceBundles/ 存放系统设置中的一些设置项。

./Library/Caches/com.apple.dyld/dyld_shared_cache_arm64

./Library/Caches/com.apple.kernelcaches/kernelcache 操作系统,只读。

dev /

dev 包含了所有 iOS 系统中使用的外部设备的端口。
设备文件分为两种:块设备文件 b 和字符设备文件 c

File_Permissions  Owner Group  Name
crw-rw-rw- 1 root wheel aes_0
crw------- 1 root wheel bpf[0-3]
cr--r--r-- 1 root wheel btpoweroff
c------r-- 1 root wheel btwake
crw--w--w- 1 root wheel console
crw-rw-rw- 1 root wheel cu.bluetooth
crw-rw-rw- 1 root wheel cu.debug
crw-rw-rw- 1 root wheel cu.debug-console
crw-rw-rw- 1 root wheel cu.gas-gauge
crw-rw-rw- 1 root wheel cu.iap
crw-rw-rw- 1 root wheel cu.oscar
crw-rw-rw- 1 root wheel cu.stockholm
brw-r----- 1 root operator disk*
crw-r--r-- 1 root wheel fsevents
crw------- 1 root wheel klog
brw------- 1 root operator md0
crw-rw-rw- 1 root wheel null
crw------- 1 root wheel oslog
crw------- 1 root wheel oslog_stream
crw------- 1 root wheel pf
crw------- 1 root wheel pfm
crw-rw-rw- 1 root tty ptmx
crw-rw-rw- 1 root wheel ptyp[0-f]
crw-rw-rw- 1 root wheel random
crw-r----- 1 root operator rdisk*
crw------- 1 root operator rmd0
crw-rw-rw- 1 root wheel tty
crw-rw-rw- 1 root wheel tty.bluetooth
crw-rw-rw- 1 root wheel tty.debug
crw-rw-rw- 1 root wheel tty.debug-console
crw-rw-rw- 1 root wheel tty.gas-gauge
crw-rw-rw- 1 root wheel tty.iap
crw-rw-rw- 1 root wheel tty.oscar
crw-rw-rw- 1 root wheel tty.stockholm
crw-rw-rw- 1 root wheel ttyp[0-f]
crw--w---- 1 root tty ttys000
crw-rw-rw- 1 root wheel uart.bluetooth
crw-rw-rw- 1 root wheel uart.debug
crw-rw-rw- 1 root wheel uart.debug-console
crw-rw-rw- 1 root wheel uart.gas-gauge
crw-rw-rw- 1 root wheel uart.iap
crw-rw-rw- 1 root wheel uart.oscar
crw-rw-rw- 1 root wheel uart.stockholm
crw-rw-rw- 1 root wheel urandom
crw-rw-rw- 1 root wheel zero

tty *:终端设备;pty *:虚拟终端;console :控制台终端
uart *:uart终端,发送和接收字符串

设备分区信息:

/dev/disk0          Root NAND volume/dev/disk0s1      LwVM master volume/dev/disk0s1s1  系统分区 (->/)/dev/disk0s1s2  数据分区 (->/private/var)/dev/disk0s1s3  基带分区 (->/private/var/wireless/baseband_data)//基本分区有的时候不会挂载
//LwVM LightweightVolumeManager 轻量级分区管理器

var /

存放一些经常更改的文件,比如日志、用户数据、临时文件等

./root/ 存放了 root 用户的文件

./mobile/ 存放了 mobile 用户的文件

./mobile/Media/ 存放照片录音短信邮件等媒体数据文件

./mobile//Library/ 里面存放的是短信,邮件等

./mobile/Containers/Data/Application/ 应用沙盒的起始目录

./mobile/Containers/Data/Application/UUID/ 应用目录

./mobile/Library/Accounts/Accounts3.sqlite
该文件将包含连接到 iOS 的不同数量的帐户。即 iCloud 帐户,但也可以包含其他用户信息,如 Facebook 用户 ID,其他已连接的邮件帐户等。

./preferences/SystemConfiguration/com.apple.wifi.plist
Wifi 网络和上次访问日期

./mobile/Applications/ID/Library/Safari/History.plist
Safari 历史记录

./mobile/Containers/Data/Application/UUID/
iOS 沙盒模型目录。目录下有几个文件夹,主要是 documents、Library、tmp、SystemData。

  • ./Documents/ 存放应用运行时生成的并且需要保存的用户数据,一般需要持久的数据或者不能重新生成的数据都放在此目录中,可以在当中添加子文件夹。iTunes 或 iCloud 同步设备时会备份该目录。
  • ./Library/Caches/ 存放应用运行时生成的系统缓存数据及专用的支持文件,保存应用程序再次启动过程中需要的信息,当访问网络时系统自动会把访问的 URL,以数据库的方式存放在此目录下面。iTunes 或 iCloud 不同步。系统不会清理目录中的文件。
  • ./Library/Preferences/ 存放偏好设置。iOS 的设置(settings)应用也会在该目录查找应用的设置信息。iTunes 或 iCloud 同步设备时备份该目录。
  • ./tmp/ 存放应用运行时所需的临时数据。当某个应用没运行时,iOS 系统重启会清除该目录下的文件。但不可依赖这种自动清除机制,应该及时手动清除。
  • ./SystemData/ 存放系统数据,无对外暴露的接口。
  • ./StoreKit/ 内购库
  • ./CloudKit/ 基于 iCloud 云端存储,通过 API 存取数据。

usr /

包含了大多数用户工具和程序。

./bin/ 包含那些 /bin/sbin 中未出现的基础功能,如 nm、killall 等;
./include/ 包含所有的标准 C 头文件;
./lib/ 存放库文件。

/usr/lib/dyld 动态链接器。

在 iOS 系统中,每个程序依赖的动态库都需要通过 dyld 加载到内存,很多系统库几乎是每个程序都会用到的,如果在每个程序运行的时候都重复的去加载一次,势必造成运行缓慢。

为了优化启动速度和提高程序性能,共享缓存机制就应运而生。所有默认的动态链接库被合并成一个大的缓存文件,放到 /Library/Caches/com.apple.dyld/ 目录下,按不同的架构保存分别保存着。

private /

存放两个目录,分别是 /private/etc/private/var

./var/containers/Shared/ 共享数据目录。

./var/mobile/Media/DCIM/ 相册。

./var/mobile/Media/Recordings/ 录音。

./var/mobile/Containers/Data/Application/ APP数据目录。

./var/containers/Bundle/Application/ APP二进制目录。

./var/Keychains/keychain-2.db Keychain是一个安全的存储容器,可以用来为不同应用保存敏感信息比如用户名,密码,网络密码,认证令牌。它是一个sqlite数据库,其保存的所有数据都是加密过的。

./etc/fstab 控制根分区和介质分区的读 / 写访问。只需修改此文件以授予对根分区 /dev/ disk0s1s1 的完全读 / 写访问权限。fstab 文件由于包含文件系统挂载点,这个文件通常被越狱工具替换用于将 root 分区读写打开。

一般越狱后,fstab文件内容为:

/dev/disk0s1s1/hfs rw 0 1  //越狱前 ro/dev/disk0s1s2/private/var hfs,nosuid,nodev rw 0 2

但 checkra1n 并未改变此文件,包括大小。有时越狱检测会检查 fstab 大小,一般越狱后由80K变为65K。

持续更新中~

--

--

iOS Jailbreak Notes
iOS Jailbreak Notes

Written by iOS Jailbreak Notes

清心若水,清水即心。微风无起,波澜不惊。 Study & Research & Notes & Favorites

No responses yet