之前从未接触过iOS越狱和逆向方面的相关知识, 前段时间刘培庆的<iOS应用逆向和安全>一书首发, 我买了一本. 在学习过程中的一些小Tips, 分享给大家,希望能一起学习进步. 文章将不断更新完善.

配置 :
- iPhone6 乞丐版 , iOS10.3.2
- iMac macOS High Sierra 10.13.5
- Xcode 9.4.1
第一步: 越狱
越狱教程, 网上有很多. 个人推荐最新版的爱思助手, 一键越狱, 傻瓜式操作, 简单粗暴.
出现的问题: 越狱后,Cydia无法联网. 解决方案: 爱思助手下载安装乐网, 搞定.. 爱思很强大, 依旧简单粗暴.

第二步: 按书上写的, 安装相关的插件或应用.
- Cydia中搜索并安装MTerminal 和 adv-cmds.

打开 Terminal , 运行 ps aux | grep dropbear , 出现下图的内容, 表示默认支持USB连接.

- 在Mac终端运行命令:
iproxy 2222 22
ssh -p 2222 root@localhost
第一次操作, 要验证密码, 相关内容书中都有,还有修改密码等等操作 不再这里赘述.
书中第10页写成了 iproxy 22 2222 , 已有很多人在 iOSREBook-issues 反馈了, 大家有什么问题,可以向作者反馈
-
安装浏览文件系统工具, Mac上安装某某助手, 或者 iFunBox. iPhone 安装iFile. 如果iFile安装失败, 可以百度搜索其它源, 注意兼容版本.
-
Cydia 安装 Substrate , appsync(如果安装失败, 爱思助手可以帮你 ^_^); scp(或者rsync).
第三步骤: 开始逆向.
- 应用解密 1 . dumpdecrypted. 从GitHub下载并编译.
git clone https://github.com/stefanesser/dumpdecrypted.git
cd dumpdecrypted
make

执行完后, 文件夹内生成dumpdecrypted.dylib 和 dumpdecrypted.o 两个文件

书中说使用 dumpdecrypted.dylib 进行注入解密. 实际操作有问题, 这个后面再说.
- 手机运行需要解密的TargetApp (以某信为例), 然后在终端执行命令 ps -e

然后获取TargetApp 的 Bundle id, 在终端执行以下命令:
cat /var/containers/Bundle/Application/F68AA473-CCB2-4872-85CB-7DE710FD214D/TargetApp.app/Info.plist | grep CFBundleIdentifier -A 1

- Xcode新建一个iOS App (我命名为MonkeyApp), 在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中执行以下代码:
NSString *bundleID = TargetApp 的 Bundle id. ;
NSURL *dataURL = [[NSClassFromString(@"LSApplicationProxy") performSelector:@selector(applicationProxyForIdentifier:) withObject:bundleID] performSelector:@selector(dataContainerURL)];
NSLog(@"%@", [dataURL.absoluteString stringByAppendingString:@"/Documents"]);
终端打印结果为: file:///private/var/mobile/Containers/Data/Application/CE02EE9B-E645-4502-BCD5-DABE22887F1B/Documents,
cd 到 MonkeyApp 文件夹下.

- Mac终端执行命令 将 dumpdecrypted.dylib 拷贝到 /var/mobile/Containers/Data/Application/CE02EE9B-E645-4502-BCD5-DABE22887F1B/Documents 文件夹下

5 .解密 终端在MonkeyApp 的Documents文件夹下, 执行以下命令:
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/F68AA473-CCB2-4872-85CB-7DE710FD214D/TargetApp.app/argetApp

执行完后, 失败, 并没有出现书中描述的场景, 观察终端输出结果, 关键在 图中划红线的这句话: dumpdecrypted.dylib: required code signature missing for 'dumpdecrypted.dylib
这句话的意思是 dumpdecrypted.dylib 需要 code signature , 那我们就给他 code signature .. Mac终端执行命令:
## 列出可签名证书
security find-identity -v -p codesigning
## 为dumpecrypted.dylib签名
codesign --force --verify --verbose --sign "iPhone Developer: xxx xxxx (xxxxxxxxxx)" dumpdecrypted.dylib

注意 , 你的 MonkeyApp 必须是同一个 iPhone Developer 签名, Xcode 运行 MonkeyApp 必须是 release模式
然后重复上面的 第 4 步 和 第 5 步 , 出现下图中的内容则解密成功

这时候 在MonkeyApp的Ducuments下 会生成一个 TargetApp.decrypted 文件

把这个文件拷贝到Mac中: 终端执行命令:
scp -P 2222 root@localhost:/var/mobile/Containers/Data/Application/CE02EE9B-E645-4502-BCD5-DABE22887F1B/Documents/TargetApp.decrypted 目标路径

拷贝文件 其实不一定非要 scp 命令, 记得之前我们装过iFunBox么? 直接用iFunBox操作就好了.... 但是 用终端命令逼格高一些, 不是么? 😁😁😁😁😁

第四步 : class-dump
- 安装 class-dump.. 不赘述
- dump出TargetApp的头文件:
- cd 到 TargetApp.decrypted 所在的文件夹;
- 执行命令:
class-dump --arch arm64 TargetApp.decrypted -H -o ./Headers/
然后耐心等待, 执行成功后, 看到 TargetApp 有11686 个 头文件.


目前只学习到了这里, 下周学习后面的内容后再更新.