我们知道 iOS是有OSX演化而来的。而OSX则是基于UNIX操作系统的。那么我们可以通过filesystem hierarchy standard 来一窥iOS 的目录结构(没有用过的UNIX系统,但做过一段时间的运维)。
上一篇介绍怎么从pc端连到手机端,连过去后,我们看看iOS的系统结构,
首先一下是我在手机上的一张截图,我们可以清楚的看到,这是/目录下的一些目录。
首先来看看它的目录结构:
1)/:根目录,以斜杠表示,其他所有目录和文件都在根目录下展开。
2)/bin:“binary” 的缩写,存放提供用户级基础功能的二进制文件,比如ls、ps等。
3)/boot:用过Linux的人都知道,这个目录是存放能使系统启动的所有文件,比如系统运行级别。iOS中此目录为空。
4)/etc: "Et Cetera"的简写,存放系统的一些配置文件及脚本。比如hosts、passed、group等。在iOS中,/etc 是一个符号链接,实际指向/private/etc 。
5)/Developer; 如果一台设备连接Xcode后被指定为测试用机,Xcode就会在iOS中生成这个目录,其中还有一些调试需要的工具和数据。
6) /User: 用户目录,实际指向/var/mobile,大家可以用ls -ld /User 命令查看,这个目录实际是个符号链接,这个目录下存放大量用户数据,比如:
/var/mobile/Media/DICM下存放照片
/var/mobile/Media/Recordings 下存放录音文件
/var/mobile/Media/SMS 下存放短信数据库
/var/mobile/Library/Mail 下存放邮件数据
知道了这些,假如我们把这个目录的权限改了,那些手机助手是否还能拿到短信记录吗。
再来看看iOS系统的权限
类UNIX系统都采用3*3位来表示一个文件的权限
lrwxr-xr-x 1 root admin 11 Oct 19 14:17 /User -> /var/mobile/
比如上边这行,这就是/User 目录的详细信息,l 表示是一个目录,这个目录的权限用数字表示就是755 一个文件的权限分为 r(read ,4),w(write,2), x(execute,1),从第二位开始,3位一组,第一组:rwx 表示属主(root 用户)有可读可写可执行权限,第二组(r-x)表示属组(admin 用户组)有可读可执行权限,第三组(r-x)表示其他用户(others)有可读可执行权限。r 用数字表示为 4 ,w用数字表示 2,x用数字表示为1 所以/User 这个目录的权限为755.
再来看看iOS二进制文件类型
iOS中要有Application、Dynamic Library(简称dylib)和Daemon 三类二进制文件
Application 就是我们最熟悉的app了,但是我们还是得搞清楚几个概念:
1、bundle :bundle的概念源于NeXTSTEP(对于这个大家应该熟悉,乔帮主离开apple 后创建的一个公司)它不是一个文件,而是按某种标准来组织 的目录。其中包含了二进制文件运行所需要的资源正向开发中常见的app和framework 都是以bundle的形式存在的。
2、可执行文件,我们以美丽说为例。
plutil -p Info.plist|grep CFBundleIdentifier
"CFBundleIdentifier" => "5LDV722ABF.com.meilishuo.meilishuo"
3、沙盒(sandbox),通俗的说,沙盒就是系统的一种访问权限机制,可以看做是权限的一种表现形式。上面说过,假如把/var/mobile 中这个目录的权限改了,那些手机助手是否还能访问了,
dylib:这个我们在写app的时候只是用过,自己并没有写过。可以用file命令查看:
$ file MainBinary
MainBinary: Mach-O executable arm
在iOS中,lib分为static 和dylib 两种,其中static lib 在编译阶段成为app的可执行的一部分,会增加可执行文件的大小。因为app尺寸变大,启东时需要加载的内容变多,所以会导致app启动变慢,当然肯定有它存在的理由,比如说会加快app的运行速度。dylib则相对“智能”一些,它不会改变可执行文件的大小,只有app需要时才会加载进内存,成为app进程的一部分。
daemon:在类UNIX系统中称为守护进程,在iOS中的daemon主要由一个可执行文件和一个plist文件构成。
顺便提一句:iOS上德第一款电话录音软件“Audio Recorder”就是通过逆向mediaserverd 这个daemon实现的。