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

image

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

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

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

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

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

如果要看自己的专案…

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

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

image

如果要看别人的APP…

image

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

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

Lookin 查看排版结构

Facebook 登入画面排版结构

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

原本的「建立新帐号」被我改成「哈哈哈」

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

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

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

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 root@127.0.0.1,输入 SSH 密码(预设是 alpine)

image

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

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

image
  1. 找到要敲壳导出的 APP 名称 / Bundle ID,输入:

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

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

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


    image
  • 手机必须在解锁情况下才能使用工具

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

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

会出现 /Payload/APP名称.app

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

1. 提取 APP 的资源目录

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


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

image

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

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

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

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

image

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

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

图片取自航海王

逆向工程的其他工具

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

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

image

For Example:

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

注入一个 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 安全更有点概念!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350