这本书也出版多年了, 但是一直没看过, 感觉要学的太多了, 对这一块也不太感兴趣吧. 现在闲来无事翻着看看, 前言简介什么就略过了, 直接划重点.
iOS应用逆向工程的过程
软件逆向工程可以看做系统分析和代码分析两个阶段的有机结合.
iOS逆向工程的工具可以分为四大类:
- 监测工具
在iOS逆向工程中, 起到嗅探、监测、记录目标程序行为的工具称为监测工具.
例如监测UI变化, 网络活动, 文件访问等. 常用工具有Reveal, snoop-it, introspy等. - 反汇编工具
反汇编工具把二进制文件作为输入, 经过处理后输出这个文件的汇编代码, 在iOS中常用的反汇编工具主要是IDA和Hopper. - 调试工具
在iOS逆向工程中用到的调试工具主要是 LLDB. - 开发工具
Xcode, 和针对越狱iOS 的 iOSOpenDev 和 Theos.
iOS系统结构
iOS目录结构
iOS是由OSX演化而来的, 而OSX则是基于UNIX操作系统的.
类UNIX操作系统的常见目录结构如下所示:
./: 根目录, 以斜杠表示, 其他所有文件和目录在根目录下展开.
./bin: 'binary'的简写, 存放提供用户级基础功能的二进制文件, 如ls, ps等.
./boot: 存放能使系统成功启动的所有文件.iOS中此目录为空.
./dev: 'device'的简写, 存放BSD设备文件.
./sbin: 'system binaries'的简写, 存放提供系统基础功能的二进制文件, 如netsata, reboot等.
./etc: 'Et Cetera'的简写, 存放系统脚本及配置文件, 如passwd, hosts等.
./lib: 存放系统库文件、内核模块及设备驱动等.
./mnt: 'mount'的简写, 存放临时的文件系统挂载点.
./private: 存放两个目录, 分别是 /private/ect 和 /private/var
./tmp: 临时目录.
./usr: 包含了大多数用户工具和程序.
./var: 'varibale'的简写, 存放一些经常更改的文件, 如日志、用户数据、临时文件等.
iOS系统的独有目录有:
./Applications: 存放所有的系统App和来自于Cydia的App, 不包括AppStore的App.
./Developer: 如果一台设备连接Xcode后被指定为调试用机, Xcode就会在iOS中生成这个目录, 其中会含有一些调试需要的工具和数据.
./Library: 存放一些提供系统支持的数据.
./System/Library: iOS文件系统中最重要的目录之一, 存放大量系统组件.
./System/Library/Frameworks 和 /System/Library/PrivateFrameworks: 存放iOS中的各种framework, 其中出现在SDK文档里的只是冰山一角, 还有数不清的未公开功能等待我们去挖掘.
./System/Library/CoreService里的SpringBoard.app: iOS桌面管理器, 是用户与系统交流的最重要中介.
./User: 用户目录, 实际指向/var/mobile, 目录中存放了大量用户数据.
./var/mobileContainers: 存放StoreApp. App的可执行文件在bundle与App中的数据目录被分别存放在/var/mobile/Containers/Bundle 和 /var/mobile/Containers/Data 这两个不同目录下.
iOS文件权限
iOS中的每个文件都有一个属主用户和属主组, 每个文件都具有一系列权限.
iOS用3位来表示文件的权限, 从高位到低位分别是r(read)权限, w(write)权限, 以及x(execute)权限.
iOS二进制文件类型
在iOS逆向工程初学阶段, 我们的目标主要是Application、Dynamic Library(dylib) 和 Daemon 这三类二进制文件.
Application
Application就是我们最熟悉的App.
1.bundle
bundle 的概念来源于 NeXTSTEP, 它不是一个文件, 而是一个按某种标准结构来组织的目录, 其中包含了二进制文件及运行所需的资源.
Framework 也是 bundle, 但 framework 的 bundle 中存放的是一个 dylib, 而不是可执行文件.
2. App 目录结构
App 目录的以下三个部分比较重要:
-
Info.plist
Info.plist 记录了 App 的基本信息, 如 bundle identifier、可执行文件名、图标文件名等.
-
可执行文件
可执行文件是 App 目录下最核心的部分, 也是逆向工程最主要的目标. 可以通过 Xcode 自带的命令行工具 plutil 查看它的值.
-
lproj目录
lproj目录下存放的是各种本地化的字符串(.strings), 是 iOS 逆向工程的重要线索, 也可以用 plutil 查看.
3. 系统App VS StoreApp
/Applications/
目录存放系统App, /var/mobile/Containers/
目录存放StoreApp. 虽然都是App, 存在这一些差异:
-
目录结构
两种 App 的 bundle 内部目录结构区别不大, 但数据目录的位置不同.
StoreApp 的数据目录在
/var/mobile/Containers/Data/
以 mobile 权限运行的系统 App 的数据目录在
/var/mobile/
以 root 权限运行的系统 App 的数据目录在
/var/root/
-
安装包格式与权限
Cydia App 的安装包格式是 deb, 属主用户和属主组一般是 root 和 admin;Store App 的安装包格式是 ipa, 属主用户和属主组都是 mobile.
-
沙盒(sandbox)
iOS 中的沙盒就是一种访问限制机制, 我们可以把它看做是权限的一种表现形式, 授权文件(entitlements)也是沙盒的一部分.
沙盒会将 App 的文件访问范围限制在这个 App 内部, 一个 App 一般不知道其他 App 的存在, 更别说访问它们了;
沙盒还会限制 App 的功能, 例如对 iCloud 接口的调用就必须经过沙盒的允许.
Dynamic Library
在 iOS 中, lib 分为 static 和 dynamic 两种, 其中 static lib 在编译阶段成为 App 可执行文件的一部分, 会增加可执行文件的大小. dylib 则相对灵活一些, 它不会改变任何可执行文件的大小, 只有当 App 需要用到这个 dylib 时, iOS 才会把它加载进内存, 成为 App 进程的一部分.
Deamon
iOS 中的 deamon 主要由一个可执行文件和一个 plist 文件构成.
iOS 的根进程是 launchd, 它会在开机时检查/System/Library/LaunchDaemons
和/Library/LaunchDaemons
下所有格式符合规定的 plist 文件, 然后启动对应的 daemon.