前提
(1)什么是越狱:
越狱是指通过分析iOS系统代码,找出iOS系统漏洞,绕过系统安全防护,获取系统root权限的过程。
越狱过后就可以访问设备的整个文件系统、更改系统外观,功能等。
(2)Cydia是什么:
在手机越狱后,会自动安装一个叫Cydia的软件,这个软件相当于针对越狱设备的App Store,里面有很多类似 系统修改、应用插件,破解插件等相关的软件包。
一、逆向工程的要求
1,具备丰富的 iOS 开发经验。
2,最好能非常熟悉 iOS 设备的硬件构成,iOS 系统的运行原理。
3,拿到任意一个 App 之后能够大致推断出它的项目规模和使用的技术,比如它的MVC模型
是怎么建立的,引用了哪些 framework 和经典的开源代码。
个人建议:最好了解下如何进iOS系统的安全模式,因为有时候万一系统搞坏了,可以进入安全模式卸载掉有问题的插件。
其它要求
1,一台越狱过的iOS设备(可利用PP助手进行越狱。)
2,设备安装了Open SSH,用于传输文件等作用,可以在Cydia里面搜索到。
如果你目前还不具备这些充分条件,那么一定要满足两个必要条件:
-------- (强烈的好奇心) 和(契而不舍的精神)--------
二、iOS 应用逆向工程的作用
1,一般的 App 防护,感觉就像是一个 , 将 App 的 MVC 布置在城堡内部 , 外围圈上厚厚的 ,看上去易守难攻。
但是当我们站到高处,在天空中俯瞰这个 App 所在的城堡,它的内部结构就不再是秘密。
如果我们站在巨人的角度,那么所有的 Objective-C 函数定义、所有的 property、所有的导出函数、所有的全局变量、所有的逻辑将完全暴露在我们面前。
iOS 逆向工程主要有两个作用:
1,分析目标程序,拿到关键信息,可以归类于安全相关的逆向工程;
2,借鉴他人的程序功能来开发自己的软件。
三、安全相关的iOS逆向工程
- 评定安全等级
- 逆向恶意软件
- 检查软件后门
- 去除软件使用限制
四、开发相关的iOS逆向工程
- 逆向系统API
可逆向系统API后,扩展iOS系统的功能,众所周知,能在 AppStore 上架的 App 的功能十分有限,在苹果公司严格的审核制度下,绝大多数 App 的实现都源于公开的开发文 ,而不能使用例如发短信、打电话等文档中不涉及的功能。 - 借鉴别人的软件
比如通过逆向那些软件,可以从 App 中把它们的设计思路抽象出来为我所用,从而提高自己 App 的精致程度。
五、iOS应用逆向工具
1,监测工具Reveal:能够辅助定位 App 中我们感兴趣的部分,让我们能够迅速从 UI 层面切入代码层面。
2,反汇编工具:IDA和Hopper
3,调试工具:LLDB调试器
4,Theos 和iOSOpenDev
一、iOS 系统结构
1,对于未越狱的 iOS设备,苹果官方开放给第三方直接访问 iOS文件系统的接口非常有限。
2,越狱后能够访问 iOS 全系统文件,这是开展 iOS 逆向工程的首要前提。
二、iOS 目录结构简介
/:
根目录,以斜杠表示,其他所有文件和目录在根目录下展开。
/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 中此目录为空。
/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后被指定为调试要的工具和数据,
/Library:
存放一些提供系统支持的数据,其中/Library/MobileSubstrate 下存放了所有基于 CydiaSubstrate(原名 MobileSubstrate)的插件。
/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下存放邮件数据。
上面的介绍只是整个 iOS 目录结构的九牛一毛,更详细的讨论,尽在 http://bbs.iosre.com。
三、iOS 二进制文件类型
在iOS逆向工程初学阶段,我们的目标主要是Application、Dynamic Library(以下 dylib)和 Daemon 这三类二进制文件。
1, Application相关概念
bundle:是一个按某种标准结构来组织的目录,其中包含了二进制文件及运行所需的资源。正向开发中常见的 App 和 framework都是以bundle的形式存在的;在越狱iOS中常见的PreferenceBundle,可以看成是一种依附于Settings 的 App。Settings 的 App,结构与 App 类似,本质也是 bundle。
Framework 也是 bundle,但 framework 的 bundle 中存放的是一个 dylib,而不是可执行文件。相对来说,framework的地位比 App 更高,因为一个 App 的绝大多数功能都是通过调用 framework 提供的接口来实现的。将某个 bundle 确立为逆向目标后,绝大多数逆向线索都可以在 bundle 内找到,这大大 低了逆向工程的复杂度。
App 目录 :
Info.plist 文件记录了App的基本信息,如bundle identifier、可执行文件名、图标文件名等。
可以通过 Xcode 自带的命 行工具 plutil 查看bundle identifier的值,如下:
plutil -p /Users/snakeninny/Code/iOSSystemBinaries/8.1_iPhone5
/SiriViewService.app/Info.plist | grep CFBundleIdentifier
lproj目录:lproj目录下存放的是各种本地化的字符 (.strings),是iOS逆向工程的重要线索,也可以用 plutil 查看,如下:
plutil -p /Users/snakeninny/Code/iOSSystemBinaries/8.1_iPhone5
/SiriViewService.app/en.lproj/Localizable.strings
安装包格式与权限:
Cydia App 的安装包格式一般是 deb,StoreApp 的安装包格式一般是 ipa。其中 deb 是来自 Debian 的安装包格式,由 Cydia 作者 saurik 移 到 iOS 中,它的 主用户和 主组一般是 root 和 admin,能够以 root权限运行;而 ipa 是苹果为 iOS 推出的专用App安装包格式, 主用户和 主组都是 mobile,只能以 mobile权限运行。
2, Dynamic Library:
1,在 Xcode 工程里导入的各种 framework,链接的各种 lib,其实本质都是 dylib。
2,Cydia 里的各种 tweak 无一不是以 dylib 的形式工作的,正是这些 tweak 的存在让我们能够随意定制自己的 iOS。
3,在iOS中,lib分为static和dynamic两种,其中static lib在编译阶段成为App可执行文件的一部分,会增加可执行文件的大小。
4,dylib 则相对“智能”一些,它不会改变可执行文件的大小,只有当 App 需要用到这个 dylib 时,iOS 才会把它加载进内存,成为 App 进程的一部分。
5,dylib 的权限是由它寄生的那个 App 决定的,同一个 dylib 寄生在系统 App 和 StoreApp 里时的权限是不同的。
参考书籍 <iOS应用逆向工程-第2版> 沙梓社 吴航 * 著
下一篇:iOS逆向工程(2)工具介绍