最近在看一本关于逆向工程的书籍, 所以把自己学的东西记录起来方便以后复习,在这里分享出来带给需要的人.
类UNIX操作系统常见目录结构:
- /: 根目录 斜杠表示, 所有文件和目录在根目录下展开.
- /bin: binary缩写, 存放用户级基础功能的二进制文件.如ls ps等.
- /boot: 存放使系统成功启动的所有文件.iOS中是空.
- /dev: device缩写, 存放BSD设备文件.每个文件代表系统的一块设备或者字符设备,块设备以块为单位传输数据, 如硬盘. 字符设备以字符为单位传输数据, 如调制解调器.
- /sbin: system binaries简写.存放提供系统级基础功能的二进制文件.如netstat. reboot等.
- /etc: Et Cetera简写, 存放系统脚本及配置文件, 如passwd. hosts等. iOS中/etc是一个符号链接, 实际指向/private/etc.
- /lib: 存放系统库文件, 内核模块及设备驱动等. iOS中为空.
- /mnt: mount简写, 存放临时的文件系统挂载点. iOS中为空.
- /private/var: 存放两个目录, 分别是/private/etc和/private/var.
- /tmp: 临时目录. 在iOS 中, 它是一个符号链接, 实际指向/private/var/tmp.
- /usr: 包含大多数用户工具和程序. 如nm. killall等. /usr/include包含所有的标准C头文件. /usr/lib存放库文件.
- /var: variable简写, 存放一些经常更改的文件, 如日志 用户数据 临时文件等. 其中/var/mobile和/var/root分别存放了mobile用户和root用户的文件, 是重点关注的目录
iOS 文件权限简介
- iOS 是一个多用户操作系统. 用户是一个抽象的概念, 它代表对操作系统的所有权和使用权.如mobile用户无法调用reboot命令重启iOS . 而root用户可以. 组 是用户的一种组织方式, 一个组可以包含多个用户, 一个用户可以属于多个组.
- iOS 中的每个文件都有一个属主用户和一个属主组, 或者说这个用户和这个组拥有这个文件.每个文件都有一系列权限, 简单的说就是权限的作用决定文件的属主用户能做什么.属主组能做什么.
- iOS 用3位(bit)表示文件的权限, 从高到低是 r(read) w(write) x(execute).
- 文件和用户存在关系有三种:
- 此用户是属主用户.
- 此用户不是属主用户, 但在属主组里.
- 此用户不是属主用户, 但也不在属主组里.
iOS 独有目录
- /Applications: 存放所有的系统App和来自于Cydia的App, 不包括StoreApp.
- /Developer: 如果一个设备连接Xcode后被指定为调试机, Xcode就会在iOS 中生成这个目录, 其中会含有一些调试需要的工具和数据.
- /Library: 存放一些提供系统支持的数据, 其中/Libraty/MobileSubstrate下存放了所有基于CydiaSubstrate的插件.
- /System/Library: iOS 文件系统中最重要的目录之一, 存放大量系统组件.
- /System/Library/PrivateFrameworks: 存放iOS 中的各种framework.
- /System/Library/CoreServices里的SpringBoard.app: iOS 桌面管理器, 是用户与系统交流的最重要中介.
- /User: 用户目录, 实际指向/var/mobile. 这个目录存放大量用户数据如: /var/mobile/Media/DCIM下存放照片. /var/mobile/Media/Recordings下存放录音文件./var/mobile/Library/SMS下存放短信数据.
- /var/mobile/Containers: 存放storeApp.
- /var/mobile/Containers/Bundle: App的可执行文件的bundle目录.
- /var/mobile/Containers/Data: App中的数据目录.
目录结构和文件权限
Application: 就是我们的App.
bundle: 不是一个文件, 而是一个按某种标准结构来组织的牡蛎, 其中包含了二进制文件及运行所需的资源. 正向开发中的App和framework都是以bundle形式存在的. 越狱中常见的PreferenceBundle可以看成是一种依附于Settings的App.本质也是bundle.
info.plist: 记录了App的基本信息.如identifier 可执行文件名 图标文件名等.可以通过Xcode自带工具plutil查看.如图:
Iproj目录存放的是各种本地化字符串.(.strings)
/Applications/ 目录存放的是系统App和Cydia下载的App, 而/var/mobile/Containers/目录存放的是StoreApp.
- 区别如下
- 数据目录不同, StoreApp的数据目录在/var/mobile/Containers/Data/下.以mobile权限运行的系统App的数据目录在/var/mobile/下. 而root权限运行的系统App的数据目录在/var/root/下.
- CydiaApp的安装包格式是deb, StoreApp安装包格式是ipa. deb是来自Debian的安装包格式, 是Cydia作者saurik移植到iOS 中, 它的属主用户和属主组一般是root和admin, 能够通过root权限运行. 而ipa是苹果为iOS 推出的专属App安装包格式, 属主用户和属主组都是mobile.只能以mobile权限运行.
- 沙盒(sandbox) iOS 中的一种访问限制机制. 有时候也会因为沙盒的存在而出现一些奇怪的问题.
Dynamic Library
在Xcode工程里导入的各种framework链接的各种lib本质都是dylib. 可以用file命令验证:
Cydia中的tweak都是以dylib形式工作的.
- iOS 中lib分为static和dynamic两种. 其中static lib在编译阶段成为App可执行文件的一部分, 会增加可执行文件的大小. 因为App的大小变大, 启动时需要加载的内容变多, 所以导致App变慢. 反之, dylib不会改变可执行文件大小, 当App需要用到这个dylib时, iOS 才会把它加载进内存, 成为App进程的一部分.
- dylib本身不是可执行文件, 不能独立运行, 他们只能寄生在别的进程里. 因此dylib的权限是由它寄生的那个App决定的. 同一个dylib寄生在系统App和StoreApp里权限是不同的.
后台运行(daemon)
- daemon为后台运行而生, 给用户提供了各种守护.
- daemon主要由一个可执行文件和plist文件构成. iOS 根进程launchd, 他会在开机时检查/System/Library/LaunchDaemons和/Library/LaunchDaemons下所有格式符合规定的plist文件. 然后启动对应的daemon. 这里的plist文件和info.plist文件类似.