越狱iOS平台简介

摘自《iOS应用逆向工程》 http://iosre.com/


1、iOS目录结构简介

iOS是由OSX演化而来的,而OSX则是基于UNIX操作系统的。这三者虽然有很大的区别,但它们血脉相连。

Filesystem Hieraychy Standard为类UNIX操作系统的目录结构制定了一套标准,它的初衷之一是让用户预知文件或目录的存放位置。OSX在此基础之上形成了自已的hire(7)框架。

iOS目录结构如下:

  • /var:“variable”的简写,存放一些经常更改的文件,例如日志、用户数据、临时文件等。其中/var/mobile/Applications下存放了所有App Store App
  • /Applications:存放所有的系统App和来自Cydia的App,不包括App Store App。越狱的过程把/Applications变成了一个符号链接,实际指向/var/stash/Applications。
  • /Library:用来存放系统App的数据。其中/Library/MobileSubstrate中存放了所有基于MobileSubstrate的插件。

    Tip:MobileSubstrate(手机基础平台)是一个提供hook(注入)功能的基础平台,运行在该平台上的插件通常称为tweak(扭曲,改动)。在/Library/MobileSubstrate下通常有3类文件:

    (1)dylib:即Dynamic Library,也就是tweak插件。

    (2)plist:用于配合dylib使用的filter文件,指定注入目标。其格式为: Filter = { Bundles = (com.apple.springboard);};

    (3)disabled:被SBSettings禁用的tweak文件,事实上就是将dylib文件改了个后缀,不让MobileSubstrate加载而已。

  • /System:包含了大量的系统组件。 其中/System/Library/Frameworks和/System/Library/PrivateFrameworks存放iOS中的各种framework,包括公开的和私有的等等。

  • System/Library/CoreServices里的SpringBoard.app,就是iOS桌面管理器(类似于Windows的explorer),是用户与系统交流的最重要中介
  • /System/LIbrary/PreferenceBundles:其中的各种bundle提供了“设置”中的绝大多数功能。
  • /User:实际指向/var/mobile。该目录存放了大量的用户数据,例如:

    • /var/mobile/Media/DCIM:照片目录。
    • /var/mobile/Library/SMS:短信目录。
    • /var/mobile/Library/Mail:邮件目录。
    • /var/wireless/Library/CallHistory:通话记录。貌似在iPod上没有这个目录。

2、二进制文件类型

2.1 Application

1.bundle

bundle的概念来源于NeXTSTEP,它不是一个文件,而是一个按某种标准结构来组织的目录。

苹果对bundle的定义是:“一种标准化的层次结构,保存了可执行代码以及代码所需要的资源”[1]。尽管具体的bundle类型可能会不同,而且bundle中的内容会不同,但是所有的bundle都有同样的基本目录结构,而且每一个bundle都带有相同的目录。

2.App目录结构

出于安全考虑,iOS系统把每个应用以及数据都放到一个沙盒(sandbox)里面,应用只能访问自己沙盒目录里面的文件、网络资源等(也有例外,比如系统通讯录、照相机、照片等能在用户授权的情况下被第三方应用访问。

请注意,使用沙盒的目的是为了防止被攻击的应用危害到系统或者其他应用,它并不能阻止应用本身被攻击,因此,开发者需要防御式的编程来避免应用被攻击。

主要有4层目录

例如,一个iOS应用程序的bundleMyApp.app 
获取方式:[[NSBundle mainBundle] bundlePath]
该目录包含了应用程序本身的数据,程序打包的时候的资源文件和一些本地文件就是存放在这个目录下的。 程序的可执行程序、plist文件也在这个目录下。 
这个目录不会被iTunes同步

Documents 使用这个目录来保存关键数据。关键数据指那些应用不可再生的数据。 
这个目录会被iTunes同步

Library 用来保存一些配置文件和其他一些文件。其中使用NSUserDefaults写的设置数据都会保存到Library/Preferences目录下的一个plist文件中。Library/Caches可以用来保存可再生的数据,比如网络请求,用户需要负责删除对应文件。 
这个目录(除了Library/Caches外)会被iTunes同步

tmp 
使用这个目录来保存各种应用下次启动不再需要的临时文件。当应用不再需要这些文件的时候,需要主动将其删除。(当应用不再运行的时候,系统可能会将此目录清空。) 
这个目录不会被iTunes同步

dahuamobile.app 内部结构如下:

Contents/
CodeResources/ 
Info.plist       包的主manifest文件
dahuamobile      二进制可执行文件
Resources/       .nib文件(用于GUI)和.lproj文件
Version.plist    包版本信息
CodeSignature/   签名
CodeResources
● Info.plist

记录了App的基本信息,如bundle identifier、可执行文件名称、图标文件等。

● 可执行文件

一般与XXX.app的名称一致,可以通过Info.plist的Executable file找到

● lproj目录

存放各种本地化的字符串(.strings),是iOS逆向工程的重要线索

3.系统App VS StoreApp

/Applications目录存放系统App和Cydia下载的App

/var/mobile/Containers/目录存放StoreApp

2.2 Dynamic Library

iOS中,lib分为static和dynamic。

static lib会在编译阶段成为App可执行文件的一部分,会增加可执行文件的大小。

dylib,不会改变可执行文件的大小,只有当App需要用到这个dylib时,iOS才会把它加载到内存中,成为App进程中的一部分。

大部分iOS开发者的日常工作都在写App,估计很少人写过dylib。其实,每次编写代码都会跟dylib打交道。在Xcode工程中导入的各种framework,其实本质都是dylib。可以用file命令验证一下:

2.3 Daemon

绝大部分读者从接触iOS开发的第一天起,就不断被Apple灌输这样一个观念——iOS中没有真正的后台多任务,你的App在后台将被大大限制。如果你是一个纯粹的App Store开发者,坚信并坚守这个观念,那么它将是你的App通过Apple审核的助推剂;但既然你阅读了这本书,想要了解一些官方文档没有阐述的事实,那么你就要保持冷静,谨慎思考,让我们一起回想一下iPhone上的一些现象。

1)当我们正在用iPhone上网或刷微博,接到一个电话,所有其他操作会立即中断,系统第一时间将接听电话的界面呈现在用户面前。如果iOS中没有后台多任务,系统是如何迅速响应这个来电的呢?

2)相信很多越狱手机上都装了360、QQ手机助手等类似的软件,用来拦截垃圾短信、骚扰电话。出于对巨头们的不完全信任,以及同台竞技的小小需求,笔者也做了一款这样的手机助手软件——SMSNinja。如果iOS中没有后台多任务,SMSNinja这类助手软件如何保证自己能及时处理收到的短信呢?

3)Backgrounder是一款帮助App实现真正后台运行的强大插件,有了它,再也不用担心因为push功能的不给力而漏收即时信息啦!如果iOS中没有真正的后台多任务,Backgrounder怎么会存在呢?

这些现象无一不说明iOS中是存在真正的后台多任务的,那么难道是Apple说错了?并不是!对于App Store App来说,当用户按下home键,程序就进入后台了,大多数功能都会被暂停;也就是说,对于遵纪守法的App Store开发者来说,可以把iOS看做是没有真正后台多任务的系统,因为你唯一能干的事不支持后台多任务。但iOS是基于Mac OS X的,后者又跟所有类UNIX操作系统一样,有daemon(即守护进程,Windows称Service)的概念,随着越狱iOS全文件系统的开放,daemon也展现在我们面前。

daemon存在的意义就是后台运行,为用户使用操作系统提供各种“守护”,如imagent保障iMessage的正确收发,mediaserverd处理几乎所有的音频、视频,syslogd记录系统日志等。

iOS系统中的daemon主要由一个可执行文件和一个plist文件构成。iOS的根进程是/sbin/launchd,会在开机或接到命令时检查/System/Library/LaunchDaemons和/Library/Daemons下所有符合格式规定的plist文件,然后按需启动对应的daemon。这里的plist文件与App中的Info.plist文件作用类似,记录了daemon的基本信息。

相对于App,daemon提供的功能要底层得多,逆向难度也要大得多,如果对某个daemon的认识不够成熟,随意更改它可能导致系统崩溃。当你在iOS逆向工程上有了一定的积累后,就可以挑战这些daemon了,虽然相比App,花费的精力会更多,但它们也会给你更丰厚的回报。例如,前段时间刚刚发布的“iOS第一款电话录音软件”Audio Recorder就是通过逆向/usr/sbin/mediaserverd这个daemon实现的。

results matching ""

    No results matching ""