欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS目录结构简介

程序员文章站 2022-05-09 20:37:39
系统结构">iOS系统结构 iOS目录结构简介 我们说iOS系统是由OSX系统演化,而OSX基于UNIX操作系统。Filesystem Hierachy Standard为类U...

iOS目录结构简介

我们说iOS系统是由OSX系统演化,而OSX基于UNIX操作系统。Filesystem Hierachy Standard为类UNIX操作系统的文件目录结构制定了一套标准,FHS的初衷是为了让用户知道文件或者是目录的存放位置,OSX在此基础上形成了自己的hier(7)框架。类UNIX操作系统常见的目录结构:

/:根目录,以斜杠表示,其他所有文件和目录都在根目录下展开。 /bin:“binary”的简写,存放提供用户基础功能的二进制文件,如ls、ps等 /boot:存放能使系统成功启动的所有文件。iOS中此目录为空。 /dev:“device”的简写,存放BSD设备文件。每个文件代表系统一块设备或字符设备,一般来说,“块设备”以快为单位传输数据,如硬盘;而“字符设备”以字符为单位传输数据,如调制解调器。 /sbin:“system binaries”的简写,存放提供系统级基础功能的二进制文件,如netstat、reboot等。 /ect:“Et Cetera”的简写,存放系统脚本以及配置文件,如passwd、hosts等。在iOS中,/etc是一个符号链接,实际指向/private/etc。 /lib:存放系统库文件、内核模块以及设备驱动等。iOS中此目录为空。 /mnt:“mount”的简写,存放临时的文件系统挂载点。iOS中此目录为空。 /private:存放两个目录,分别是/private/etc和/private/var。 /tmp:临时目录。在iOS中/tmp是一个符号链接,实际指向/private/var/tmp。 /usr:包含大多数用户工具和程序。/usr/bin包含哪些/bin和/sbin中未出现的基础功能,如nm、killall等;/usr/include包含所有标准的C头文件;/usr/lib存放库文件 /var:“variable”的简写,存放一些经常更改的文件,比如日志、用户数据、临时文件等等。其中/var/mobile和/var/root分别存放mobile用户和root用户的文件,是重点关注的目录。

上面的目录多用于系统底层。

我们的iOS操作系统独有的目录:

/Applications:存放所有的系统APP和来自于Cydia的App,不包括StoreApp。 /Developer:如果一台设备链接XCode后被指定为调试用机,XCode就会在iOS中生成这个目录,其中会含有一些调试需要的工具和数据 /Library:存放一些提供系统支持的数据,其中/Library/MobileSubstrate下存放了所有基于CydiaSubstrate的插件 /System/Library:iOS文件系统中最重要的目录之一,存放大量系统组件
/System/Library/Frameworks和/System/Library/PrivateFrameworks:存放iOS中各种framework,其中出现在SDK文档里面的只是冰山一角,还有数不清的功能等待我们开发。 /System/Library/CoreServices里的SpringBoard.app:iOS桌面管理器(类似于Windows里的explorer),是用户与系统交流的最重要的中介 /User:用户目录,实际指向/var/mobile。
/var/mobile/Media/DCIM下存放照片 /var/mobile/Media/Recordings下存放录音文件 /var/mobile/Library/SMS下存放短信数据库 /var/mobile/Library/Mail下存放邮件数据 /var/mobile/Containers存放StoreApp 其中App的可执行文件在bundle与App中的数据目录分别存放在/var/mobile/Containers/Bundle和/var/mobile/Containers/Data两个不同的目录下。

iOS文件权限简介

iOS是一个多用户操作系统,用户是一个抽象概念,代表它能对操作系统的所有权和使用权。例如一个mobile用户无法调用reboot命令重启iOS,而root用户却可以。“组”是用户的一种组织方式,一个组可以包含多个用户,一个用户可以属于多个组。

iOS中使用3位(bit)来表示文件的权限,从高到低分别是r(read),w(write),x(execute)权限。文件与用户的关系存在三种可能:1.用户属于主用户;2.用户不是属于主用户,但是属于主组;3.用户既不是主用户也不属于主组。

所以我们需要3*3位来表示一个文件的权限,如果这一位代表为1则代表权限有效,否则无效。例如:111101101代表rwxr-xr-x,表示该文件主用户拥有rwx权限,而属于主组而不是主用户只有rx权限,不属于主组也不是主用户的只有rx权限。转换为八进制755也是一种常见的权限表示方式。

二进制文件类型

在iOS逆向工程中,我们的目标主要是Application、Dunamic Library(dylib)和Daemon这三类二进制文件。

Application

Application就是我们最熟悉的App了。现在来熟悉几个常见的目录

bundle

bundle的概念来源于NeXTSTEP,它不是一个文件,而是一个按某种标准结构来组织的目录,其中包含了二进制文件及运行所需的资源。正像开发中常见的App和framework都是以bundle的形式存在的;在越狱iOS中常见的PreferenctBundle可以看成是一种依附在Setting的App,结构与App相似,本质是bundle。
Framework也是bundle,但framework的bundle中存放的是一个dylib,而不是一个可执行文件。相对来说frmakework的地位比App还高,因为一个App的大多数功能都是通过调用framework提供的接口来实现的。将某个bundle确立为逆向目标之后,绝大多数逆向线索都可以在bundle内找到,这大大降低了逆向工程的复杂度。

App目录结构

在iOS逆向工程中,对App目录结构的熟悉程度决定工作效率的重要因素,App目录的以下三个部分比较重要

1.Info.plist
Info.plist记录了App得基本信息,如bundle identifier、可执行文件名、图标文件名等。我们也可以通过XCode自带的命令行工具plutil查看他的值。

2.可执行文件
可执行文件的重要性不言而喻,它是App目录下最核心的部分,也是逆向工程的主要目标。同样可以通过XCode和plutil两种方式来查看Info.plist,定位可执行文件。

3.lproj目录
lproj目录下存放的是各种本地化的字符串(.strings),他是逆向工程的重要线索,也可以通过plutil查看。

系统App VS StoreApp

/Application/目录下存放系统App和从Cydia下载的App(我们把来自Cydia的App视为系统App),而/var/mobile/Containers/目录下存放的则是StoreApp。虽然两者都为App,但是他们在如下方面存在差异。

1.目录结构
两种App的bundle内部目录结构区别不大,都含有Info.plist、可执行文件、lproj目录等,但是数据目录的位置不同;StoreApp的数据目录在/var/mobile/Containers/Data/下,以,mobile权限运行的系统App的数据目录在/var/mobile/下,而以root权限下运行的数据目录在/var/root/下。

2.安装包的格式和权限
Cydia App的安装包格式一般为deb,StoreApp的安装包格式一般为ipa。其中deb是来自Debian得安装包格式,由Cydia得作者saurik移植到iOS中,他得属主用户和属主组一般是root和admin,能够以root权限运行;而ipa则是苹果为iOS推出的专属App安装包格式,属主用户和属主组都是mobile,只能以mobile权限运行。

3.沙盒
通俗的说,iOS的沙盒就是一种访问限制机制,我们可以把它看做是权限的一种表现形式,授权文件(entitlements)也是沙盒的一部分。它是iOS最核心的安全组件之一,其实很复杂,在这里不讨论细节。总的来说,沙盒会将App的文件访问方位限制在这个App内部,一个App一般不知道其他App的存在,更别说访问他们了;沙盒还会限制App的功能,例如对iCloud接口的调用必须经过沙盒的允许。

Dynamic Library

dylib在iOS开发中的实例:在我们XCode工程里导入的各种framework,链接的各种lib,其实本质都是dylib。我们可以用命令“file”验证。

如果把焦点放到越狱iOS中,Cydia里面各种无一不是以dylib形式工作的,正是这些tweak的存在让我们能够随便定义我们的iOS。在逆向工程中,我们会频繁接触各种dylib,因此我们需要了解一些相关知识。

在iOS中,lib分为static和dynamic两种,其中static lib在编译阶段成为App可执行文件的一部分,会增加可执行文件的大小。因为App尺寸变大,启动时需要加载的内容变多,所以可能会导致App启动变慢。dylib则相对智能一些,它不会改变可执行文件的大小,只有当App需要用到这个dylib的时候,iOS才把它加载进内存,成为App进程的一部分。

Daemon

Daemon即守护进程,为后台而生,给用户提供了各种守护,如imagent保障了iMessage得正确收放,mediaserverd处理了几乎所有的音频、视频,syslogd则用于记录系统日志等。iOS中daemon主要由一个可执行文件和一个plist文件构成。iOS的根进程是launchd,他会在开机时检查/Ststem/Library/LaunchDaemons和/Library/LaunchDaemons下所有格式符合规定的plist文件,然后启动对应的daemon。

daemon提供的功能相对底层,随意改动会造成严重后果,例如白苹果。