iOS目录结构简介

原创 2016年08月31日 10:41:28

iOS系统结构

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逆向工程中,我们的目标主要是ApplicationDunamic 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分为staticdynamic两种,其中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提供的功能相对底层,随意改动会造成严重后果,例如白苹果。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

iOS ipa包解析

最近有需求需要在打好包的ipa内添加配置文件,由程序读取配置到程序内,因此做了需求调研,最后找到一个方法,现在说明如下:一、ipa压缩包结构说明将ipa解压得到包里的内容如下: 1、_CodeSig...

iOS 查看ipa包中的文件格式以及图片

今天很好奇,为什么现在提交appStore直接点一个submit按钮就一切OK了呢,仔细研究一下ipa里边到底有什么。export了一个ipa包,把后缀改为zip,双击解压,解压之后的文件夹如下图: ...

解开IPA文件的灰沙-通过静态分析工具了解IPA实现

在7月27日的iOS/Android训练营大会上,友盟iOS Team Leader张超带来主题演讲“解开IPA文件的灰沙-通过静态分析工具了解IPA实现”。针对IPA资源文件以及图片处理,张超提出,...

关于ios的ipa包的分析之link map 文件的分析

iOS项目的迭代的越久,项目的垃圾也就越多,我们通过link map文件可以直观的看到那些文件占用的包的大小。 这是我分析之后的文件,可以直观的看出那些东西占用了多少的内存。 1、...
  • wm9028
  • wm9028
  • 2016年01月05日 14:42
  • 5586

IOS项目目录结构

  • 2015年12月05日 10:10
  • 73KB
  • 下载

【黑马Android】(01)android简介/工程目录结构/拨号器/四种点击事件/后台偷偷发短信

通信技术 1G 模拟制式 只能进行语音通话.   2G GSM, CDMA 收发短信和邮件.   2.5G  GPRS, EDGE 访问wap网络数据.(图片, 壁纸, 文字信息)   3G WCD...
  • waldmer
  • waldmer
  • 2016年03月06日 21:37
  • 1469

PHP源代码目录结构简介(原创)

PHP源代码目录结构简介(原创) 余超  yuchao86@gmail.com 基于PHP-5.3.8源代码给大家分享一下PHP的内核结构,以便更好的理解PHP脚本的执行过程和写出高效率的脚本。 ...

chrome源代码目录结构简介

为了对庞大的源码项目进行分析,先对源码目录树作一个简单的介绍,粗略的了解一下各个模块的功能分布情况,chrome源代码src目录下的结构如下图:     app:该目录下的代码主要是和各个操...
  • scusyq
  • scusyq
  • 2011年10月25日 11:41
  • 531

openwrt源码树目录结构简介

openwrt的源码下载后是一个编译环境,这套环境可以编译生成固件,也可以生成交叉工具链,还有根文件系统,基本技术人员需要的东西都全乎了。开始学习openwrt的时候,看到源码树下那一堆路径,真是头大...

Maven 简介及标准目录结构

什么是 Maven?(摘自百度百科) Maven是Apache的一个顶级的项目:http://maven.apache.org/ Maven这个单词来自于意第绪语,意为知识的积累,最早在J...
  • twsghxs
  • twsghxs
  • 2014年08月19日 21:20
  • 322
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS目录结构简介
举报原因:
原因补充:

(最多只允许输入30个字)