第一部分 概念篇
第1章 iOS逆向工程简介
软件逆向工程,指的是通过分析一个程序或系统的功能、结构或行为,将它的技术实现或细节推导出来的过程。
1.1 iOS逆向工程的要求
最好能非常熟悉iOS的硬件构成、iOS系统的运行原理,还要具备丰富的iOS开发经验。(充分非必要条件)但有两个必要条件强烈的好奇心和锲而不舍的精神。
1.2 iOS应用逆向工程的作用
基于iOS逆向工程技术,可以在不破坏城墙的前提下,选择任意高纬度地点进入低纬度城堡,巧取而不强夺,通过监视甚至改变App的运行逻辑,从而达到获取核心信息,了解软件原理等战术目的。
1.2.1 安全相关的iOS逆向工程
1.评定安全等级
2.逆向恶意软件
3.检查软件后门
4.取出软件使用限制
1.2.2开发相关的iOS逆向工程
1.逆向系统API
2.借鉴别的软件
1.3 iOS应用逆向工程的过程
一般来说,软件逆向工程可以看做 系统分析 和 代码分析 两个阶段的有机结合。
在系统分析阶段,应在不同的条件下运行目标程序,在程序中改进型各种各样的操作,观察程序的行为特征,同时寻找我们感兴趣的功能点。还可以浏览文件系统,观察程序显示的图片、程序的配置文件存放的位置,数据库文件中存放了哪些信息,有没有加密等特征。
完成了系统分析之后,就该对App的二进制文件进行代码分析了。通过逆向工程可以推倒出这个App的设计思路、内部算法和实现细节,但这是一个非常复杂的过程。(难点)
1.4 iOS 应用逆向工程的工具
四大类:监测工具、反汇编工具(disassembler)、调试工具(debugger),以及开发工具
1.4.1 监测工具
起到嗅探、监测、记录目标程序行为的工具统称为监测工具,这些工具通常可以记录并显示目标程序的某些操作,如UI变化、网络活动、文件访问等。常用工具有Reveal、snoop-it、introspy
1.4.2 反汇编工具
IDA 逆向工程中最常用的利器之一
Hopper
把二进制文件反汇编之后,就要阅读成成的汇编代码了,这是iOS逆向工程中最具挑战,也是最有意思的部分。
1.4.3 调试工具 Xcode LLDB
1.4.4 开发工具
越狱iOS 基于Xcode iOSOpenDev
偏命令行的 Theos
2.1 iOS 系统结构
Cydia 的 iFile 可以获取到文件管理
还可以在AFC2服务的帮助下,通过iFunBox 等PC端软件访问iOS权系统文件
因为要你行的对象来自于iOS,所有能够访问iOS全系统文件是开展iOS逆向工程的首要前提。
2.1.1 iOS 目录结构简介
Filesystem Hierarchy Standard (FHS) 和 hier(7)为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中此目录为空。
./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 分别存放了 moblie 用户和 root 用户的文件,是重点关注的目录。
作为iOS开发者 不必太过于关注系统底层,多关注些iOS独有目录。
./ Application: 存放所有的系统App和来自于Cydia的App,不包括StoreApp
./Developer: 如果一台设备来接Xcode后被制定为吊事用机,Xcode就会在ios中生成这个目录,其中包含有一些吊事需要的工具和数据
./Library: 存放一些提供系统支持的数据,其中./Library/MobileSubstrate下存放了所欲基于CydiaSubstrate 的插件
./System/Library: iOS文件系统中最重要的目录之一,存放大量系统组件,其目录结果
对于该目录,在逆向工程的初学阶段,需要重点关注的有:
./System/Library/Fremeworks 和 System/Librery/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/Conteiners,存放StoreApp。值得注意的是,App的可执行文件在bundle与App中的数据目录被分别存放
在/var/mobile/Conteiners/Bundle和/var/mobile/Containers/Bundle 和 /var/mobile/Containers/Data这两个不同目录下
2.1.2 iOS文件权限简介