参考:https://xiaozhuanlan.com/topic/7193845260
从越狱、提取iPA档敲壳到UI分析注入及反编译的探索过程
关于安全
之前唯一做过跟安全有关的就只有 使用中间人攻击嗅探传输资料;假设我们在资料传输前编码加密、接受时 APP 内解密,用以防止中间人嗅探;那还有可能被偷走资料吗?
答案是肯定的!,就算没真的试验过;世界上没有破不了的系统,只有时间成本的问题,当破解耗费的时间精力大于破解成果,那就可以称为是安全的!
How?
都做到这样了,那还能怎么破?就是本篇想记录的议题 — 「逆向工程 」,敲开你的 APP 研究你是怎么做加解密的;其实一直以来对这个领域都是懵懵懂懂,只在 iPlayground 2019 上听过两堂大大的分享,大概知道原理还有怎么实现,最近刚好有机会玩了一下跟大家分享!
逆了向,能干嘛?
查看 APP UI 排版方式、结构
获取 APP 资源目录 .assets/.plist/icon…
窜改 APP 功能重新打包 (EX: 去广告)
反编译推测原始程式码内容取得商业逻辑资讯
dump 出 .h 标头档 / keycahin 内容
实现环境
macOS 版本:10.15.3 Catalina
iOS 版本:iPhone 6 (iOS 12.4.4 / 已越狱) *必要
Cydia: Open SSH
越狱的部分
任何版本的 iOS、iPhone 都可以,只要是能越狱的设备,建议使用旧的手机或是开发机,以避免不必要的风险;可根据自己的手机、iOS 版本参考疯先生越狱教学,必要时需要将 iOS 降版(认证状态查询)再越狱。
我是拿之前的旧手机 iPhone 6 来测试,原本已经升到 iOS 12.4.5 了,但发现 12.4.5 一直越狱不成功,所幸先降回 12.4.4 然后使用 checkra1n 越狱就成功了!
步骤不多,也不难;只是需要时间等待!
附上一个自己犯蠢的经验:下载完旧版 IPSW 档案后,手机接上 Mac ,直接使用 Finder 档案浏览器(macOS 10.5 后就没有 iTunes 了),在左方 Locations 选择手机,出现手机资讯画面后,「Option」按着然后再点「Restore iPhone」就能跳出 IPSW 档案选择视窗,选择刚下载下来的旧版 IPSW 档案就能完成刷机降版。
我本来傻傻的直接按 Restore iPhone…只会浪费时间重刷一次最新版而已….
使用 lookin 工具查看别人的 APP UI 排版
我们先来点有趣的前菜,使用工具搭配越狱手机查看别人APP 是怎么排版。
查看工具: 一是 老牌 Reveal (功能更完整,需付费约 $60 美金/可试用),二是腾讯 QMUI Team 制作的 lookin 免费开源工具;这边使用 lookin 作为示范,Reveal 大同小异。
若没有越狱手机也没关系,此工具主要是让你用在开发中的专案上,查看 Debug 排版(取代 Xcode 阳春的 inspector)平常开发也能用到! 唯有要看别人的 APP 需要使用越狱手机。
如果要看自己的专案…
可以选择使用 CocoaPods 安装、断点插入(仅支援模拟器)、手动导入Framework 到专案、手动设置,四种方法。
将专案 Build + Run 起来之后,就能在 Lookin 工具上选择 APP 画面 -> 查看排版结构。
如果要看别人的APP…
Step 1. 在越狱手机上打开「Cydia」-> 搜寻「LookinLoader」->「安装」-> 回到手机「设定」->「Lookin」->「Enabled Applications」-> 启用想要查看的 APP 。
Step 2. 使用传输线将手机连接至 Mac 电脑 -> 打开想要查看的APP -> 回到电脑,在 Lookin 工具上选择 APP 画面 -> ****即可****查看排版结构**。
Lookin 查看排版结构
可在左侧栏检视 View Hierarchy、右侧栏对选中的物件进行动态修改。
对物件的修改也会实时的显示在手机 APP 上,如上图。
就如同网页的「F12」开发者工具,所有的修改仅对 View 有效,不会影响实际的资料;主要是拿来 Debug ,当然也可以用来改值、截图,然后骗朋友 XD
使用 Reveal 工具查看 APP UI 排版结构
虽然 Reveal 需要付费才能使用,但个人还是比较喜欢 Reveal;在结构显示上资讯更详细、右方资讯栏位几乎等同于 XCode 开发环境,想做什么即时调整都可以,另外也会提示 Constraint Error 对于 UI 排版修正非常有帮助!
这两个工具在日常开发自己的 APP 上都非常有帮助!
*了解完流程环境及有趣的部分之后,就让我们进入正题吧!
**以下开始都需要越狱手机配合
提取 APP .ipa 档案 & 砸壳
所有从 App Store 安装的 APP,其中的 .ipa 档案都有 FairPlay DRM 保护 ,俗称加壳保护/相反的去掉保护就叫「砸壳」,所以单纯从 App Stroe 提取 .ipa 是没有意义的,也用不了。
*另一个工具 APP Configurator 2 只能提取有保护的档案,没意义就不再赘述,有兴趣使用此工具的朋友可以点此查看教学。
使用工具+越狱手机提取砸壳之后的原始 .ipa 档案:
关于工具部分起初我使用的是 Clutch ,但怎么尝试都出现 FAILED 查了下专案 issue,发现有很多人有同样状况,貌似此工具已经不能在 iOS ≥ 12 使用了、另外还有一个老牌工具 dumpdecrypted ,但我没有研究。
这边使用 frida-ios-dump 这个 Python 工具进行动态砸壳,使用起来非常方便!
首先我们先准备 Mac 上的环境:
Mac 本身自带 Python 2.7 版本,此工具支援 Python 2.X/3.X,所以不用在特别安装 Python;但我是使用 Python 3.X 进行操作的,如果有遇到 Python 2.X 的问题,不妨尝试安装使用 Python 3 吧!
安装 pip( Python 的套件源管理器)
使用 pip 安装 frida:
sudo pip install frida -upgrade -ignore-installed six (python 2.X)
sudo pip3 install frida -upgrade -ignore-installed six (python 3.X)在 Terminal 输入 frida-ps 如果没错误讯息代表安装成功!
Clone AloneMonkey/frida-ios-dump 这个专案
进入专案,用文字编辑器打开 dump.py 档案
确认 SSH 连线设定部分是否正确 (预设不用特别动)
User = ‘root’
Password = ‘alpine’
Host = ‘localhost’
Port = 2222
越狱手机上的环境:
安装 Open SSH :Cydia → 搜寻 → Open SSH →安装
安装 Frida 源:Cydia → 来源 → 右上角「编辑」 → 左上角「加入」 → https://build.frida.re
安装 Frida:Cydia → 搜寻 → Frida → 依照手机处理器版本安装对应的工具(EX: 我是 iPhone 6 A11,所以是装 Frida for pre-A12 devices 这个工具)
环境都弄好之后,开工:
1.将手机使用 USB 连接到电脑
2.在 Mac 上打开一个 Terminal 输入 iproxy 2222 22 ,启动 Server。
3.确保手机/电脑处于相同网路环境中(EX: 连同个WiFi)
4.再打开一个 Terminal 输入 ssh root@127.0.0.1,输入 SSH 密码(预设是 alpine)
5.再打开一个 Terminal 进行敲壳命令操作,cd 到 clone 下来的 /frida-ios-dump 目录下。
输入 dump.py -l 列出手机中已安装/正在执行的 APP。
- 找到要敲壳导出的 APP 名称 / Bundle ID,输入:
dump.py APP名称或BundleID -o 输出结果的路径/输出档名.ipa
这边务必指定输出结果的路径/档名,因为预设输出路径会在 /opt/dump/frida-ios-dump/ 这边不想把它搬到 /opt/dump 中,所以要指定输出路径避免权限错误。
-
输出成功后就能取得已敲壳的 .ipa 档案!
手机必须在解锁情况下才能使用工具
若出现连线错误、reset by peer…等原因,可尝试拔掉重插 USB 连接、重开 iproxy。
7.将 .ipa 档直接重新命名成 .zip 档,然后直接右键解压缩档
会出现 /Payload/APP名称.app
有了原始 APP 档后我们可以…
1. 提取 APP 的资源目录
在 APP名称.app 右键 → 「Show Package Contents」就能看到 APP 的资源目录
2. class-dump 出 APP .h头文件讯息
使用 class-dump 工具导出全 APP (包含 Framework) .h 头文件讯息 (仅限 Objective-C,若专案为 Swift 则无效)
nygard/class-dump* 大大的工具我尝试失败,一直 failed;最后还是一样使用 AloneMonkey/MonkeyDev 大大的工具集中改写过的 class-dump 工具才成功。*
直接从这里 Download MonkeyDev/bin/class-dump 工具
打开 Terminal 直接使用:
./class-dump -H APP路径/APP名称.app -o 汇出的目标路径
dump 成功之后就能获取到整个 APP 的 .h 资讯。
4. 最后也是最困难的 — 进行反编译
可以使用 IDA 和 Hopper 反编译工具进行分析使用,两款都是收费工具, Hopper 可免费试用(每次 30 分钟)
我们将取得的 APP名称.app 档案直接拉到 Hopper 即可开始进行分析。
不过我也就止步于此了,因为从这开始就要研究机器码、搭配 class-dump 结果推测方法…等等;需要非常深入的功力才行!
突破反编译后,可以自行窜改运作重新打包成新的 APP。
逆向工程的其他工具
1.使用 MITM Proxy 免费工具嗅探 API 网路请求资讯
2.Cycript (搭配越狱手机) 动态分析/注入工具:
在越狱手机上打开「Cydia」-> 搜寻「Cycript」->「安装」
在电脑打开一个 Terminal 使用 Open SSH 连线至手机,ssh root@手机IP (预设是 alpine)
打开目标 APP (APP 保持在前景)
在 Terminal 输入 ps -e | grep **APP Bundle ID **查找正在运行的 APP Process ID
使用 cycript -p Process ID 注入工具到正在运行的 APP
可使用 Objective-c/Javascript 进行调试控制。
For Example:
**cy#** alert = [[UIAlertView alloc] initWithTitle:@"HIHI" message:@"ZhgChg.li" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nl]
**cy#** [alert show]
chose(): 获取目标
UIApp.keyWindow.recursiveDescription().toString(): 显示 view hierarchy 结构资讯
**new Instance(记忆体位置): **获取物件
exit(0): 结束
详细操作可参考此篇文章。
前面介绍过,再推一次;在自己的专案日常开发上也非常好用,建议购买使用 Reveal。
4. MonkeyDev 集成工具,可透过动态注入窜改 APP 并重新打包成新的 APP
5.ptoomey3/Keychain-Dumper,导出 KeyChain 内容
详细操作请参考此篇文章,不过我没试成功,看专案 issue 貌似也是在 iOS ≥ 12 之后就失效了。
总结
这个领域是个超级大坑,需要非常多的技术知识基础才有可能精通;本篇文章只是粗浅了「体验」了一下逆向工程是什么感觉,如有不足敬请见谅!仅供学术研究,勿做坏坏的事;个人觉得整个流程工具玩下来蛮有趣的,也对 APP 安全更有点概念!