ios逆向查看视图层级

参考: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 档案就能完成刷机降版。

ios逆向查看视图层级_第1张图片
image

我本来傻傻的直接按 Restore iPhone…只会浪费时间重刷一次最新版而已….

使用 lookin 工具查看别人的 APP UI 排版

我们先来点有趣的前菜,使用工具搭配越狱手机查看别人APP 是怎么排版。

查看工具: 一是 老牌 Reveal (功能更完整,需付费约 $60 美金/可试用),二是腾讯 QMUI Team 制作的 lookin 免费开源工具;这边使用 lookin 作为示范,Reveal 大同小异。

若没有越狱手机也没关系,此工具主要是让你用在开发中的专案上,查看 Debug 排版(取代 Xcode 阳春的 inspector)平常开发也能用到唯有要看别人的 APP 需要使用越狱手机。

如果要看自己的专案…

可以选择使用 CocoaPods 安装、断点插入(仅支援模拟器)、手动导入Framework 到专案、手动设置,四种方法。

将专案 Build + Run 起来之后,就能在 Lookin 工具上选择 APP 画面 -> 查看排版结构

ios逆向查看视图层级_第2张图片
image

如果要看别人的APP…

ios逆向查看视图层级_第3张图片
image

Step 1. 在越狱手机上打开「Cydia」-> 搜寻「LookinLoader」->「安装」-> 回到手机「设定」->「Lookin」->「Enabled Applications」-> 启用想要查看的 APP

Step 2. 使用传输线将手机连接至 Mac 电脑 -> 打开想要查看的APP -> 回到电脑,在 Lookin 工具上选择 APP 画面 -> ****即可****查看排版结构**。

Lookin 查看排版结构

ios逆向查看视图层级_第4张图片
Facebook 登入画面排版结构

可在左侧栏检视 View Hierarchy、右侧栏对选中的物件进行动态修改。

ios逆向查看视图层级_第5张图片
原本的「建立新帐号」被我改成「哈哈哈」

对物件的修改也会实时的显示在手机 APP 上,如上图。

就如同网页的「F12」开发者工具,所有的修改仅对 View 有效,不会影响实际的资料;主要是拿来 Debug ,当然也可以用来改值、截图,然后骗朋友 XD

使用 Reveal 工具查看 APP UI 排版结构

ios逆向查看视图层级_第6张图片
image

虽然 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 上的环境:

  1. Mac 本身自带 Python 2.7 版本,此工具支援 Python 2.X/3.X,所以不用在特别安装 Python;但我是使用 Python 3.X 进行操作的,如果有遇到 Python 2.X 的问题,不妨尝试安装使用 Python 3 吧!

  2. 安装 pip( Python 的套件源管理器)

  3. 使用 pip 安装 frida:
    sudo pip install frida -upgrade -ignore-installed six (python 2.X)
    sudo pip3 install frida -upgrade -ignore-installed six (python 3.X)

  4. 在 Terminal 输入 frida-ps 如果没错误讯息代表安装成功!

  5. Clone AloneMonkey/frida-ios-dump 这个专案

  6. 进入专案,用文字编辑器打开 dump.py 档案

  7. 确认 SSH 连线设定部分是否正确 (预设不用特别动)
    User = ‘root’
    Password = ‘alpine’
    Host = ‘localhost’
    Port = 2222

越狱手机上的环境:

  1. 安装 Open SSH :Cydia → 搜寻 → Open SSH →安装

  2. 安装 Frida 源:Cydia → 来源 → 右上角「编辑」 → 左上角「加入」 → https://build.frida.re

  3. 安装 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 [email protected],输入 SSH 密码(预设是 alpine)

ios逆向查看视图层级_第7张图片
image

5.再打开一个 Terminal 进行敲壳命令操作,cd 到 clone 下来的 /frida-ios-dump 目录下。

输入 dump.py -l 列出手机中已安装/正在执行的 APP。

ios逆向查看视图层级_第8张图片
image
  1. 找到要敲壳导出的 APP 名称 / Bundle ID,输入:

dump.py APP名称或BundleID -o 输出结果的路径/输出档名.ipa

这边务必指定输出结果的路径/档名,因为预设输出路径会在 /opt/dump/frida-ios-dump/ 这边不想把它搬到 /opt/dump 中,所以要指定输出路径避免权限错误。

  1. 输出成功后就能取得已敲壳的 .ipa 档案!


    ios逆向查看视图层级_第9张图片
    image
  • 手机必须在解锁情况下才能使用工具

  • 若出现连线错误、reset by peer…等原因,可尝试拔掉重插 USB 连接、重开 iproxy。

7.将 .ipa 档直接重新命名成 .zip 档,然后直接右键解压缩档

会出现 /Payload/APP名称.app

有了原始 APP 档后我们可以…

1. 提取 APP 的资源目录

在 APP名称.app 右键 → 「Show Package Contents」就能看到 APP 的资源目录


ios逆向查看视图层级_第10张图片
image

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 汇出的目标路径

ios逆向查看视图层级_第11张图片
image

dump 成功之后就能获取到整个 APP 的 .h 资讯。

4. 最后也是最困难的 — 进行反编译

可以使用 IDA 和 Hopper 反编译工具进行分析使用,两款都是收费工具, Hopper 可免费试用(每次 30 分钟)

我们将取得的 APP名称.app 档案直接拉到 Hopper 即可开始进行分析。

ios逆向查看视图层级_第12张图片
image

不过我也就止步于此了,因为从这开始就要研究机器码、搭配 class-dump 结果推测方法…等等;需要非常深入的功力才行!

突破反编译后,可以自行窜改运作重新打包成新的 APP。

ios逆向查看视图层级_第13张图片
图片取自航海王

逆向工程的其他工具

1.使用 MITM Proxy 免费工具嗅探 API 网路请求资讯

ios逆向查看视图层级_第14张图片
image

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 进行调试控制。

ios逆向查看视图层级_第15张图片
image

For Example:

**cy#** alert = [[UIAlertView alloc] initWithTitle:@"HIHI" message:@"ZhgChg.li" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nl]
**cy#** [alert show]

ios逆向查看视图层级_第16张图片
注入一个 UIAlertViewController…
  • chose(): 获取目标

  • UIApp.keyWindow.recursiveDescription().toString(): 显示 view hierarchy 结构资讯

  • **new Instance(记忆体位置): **获取物件

  • exit(0): 结束

详细操作可参考此篇文章。

3. Lookin / Reveal 查看 UI 排版工具

前面介绍过,再推一次;在自己的专案日常开发上也非常好用,建议购买使用 Reveal。

4. MonkeyDev 集成工具,可透过动态注入窜改 APP 并重新打包成新的 APP

5.ptoomey3/Keychain-Dumper,导出 KeyChain 内容

详细操作请参考此篇文章,不过我没试成功,看专案 issue 貌似也是在 iOS ≥ 12 之后就失效了。

总结

这个领域是个超级大坑,需要非常多的技术知识基础才有可能精通;本篇文章只是粗浅了「体验」了一下逆向工程是什么感觉,如有不足敬请见谅!仅供学术研究,勿做坏坏的事;个人觉得整个流程工具玩下来蛮有趣的,也对 APP 安全更有点概念!

你可能感兴趣的:(ios逆向查看视图层级)