美文网首页开发工具逆向工程iOS逆向工程
利用Xcode在非越狱机器上动态调试第三方APP

利用Xcode在非越狱机器上动态调试第三方APP

作者: 郭秀才 | 来源:发表于2016-08-16 22:04 被阅读3254次

0x00 问题起源

0x01 准备脱壳的ipa

App Store上的应用都使用了FairPlay DRM数字版权加密保护技术,动态调试之前需要先将其解密。

解密使用的工具:Clutch

Clutch: A high-speed iOS decryption tool.

Clutch解密原理,把应用运行时的内存数据按照一定格式导出。

Clutch是开源的,可以从github上免费获取。

源码 https://github.com/KJCracks/Clutch
编译好的可执行文件 https://github.com/KJCracks/Clutch/releases

解密步骤:

1. 准备一台越狱机器,并安装openSSH
2. 获取clutch可执行文件(从源码编译或者直接下载编译好的可执行文件)
3. 拷贝clutch可执行文件至越狱设备的/usr/bin/目录
scp /path/to/clutch root@<your.device.ip>:/usr/bin/
4. 导出脱壳IPA
ssh root@<your.device.ip>
clutch -i       //列出设备上已安装APP
clutch -d [n]   //解密,并导致IPA

解密成功后,clutch会提示解密后ipa文件的存放位置,整个过程如下图所示。


脱壳过程
5. 将解密后的ipa文件拷贝出来即可得到脱壳ipa
scp root@<your.device.ip>:/path/to/xx.ipa /User/xx/Desktop

0x02 新建一个同名空白工程

下面以动态调试Kindle为例来演示整个动态调试过程。

  1. 首先通过0x01获取脱壳的Kindle.ipa文件。
  2. 然后新建一个工程,名称Kindle(Bundle ID前缀任意),结构如下:
空白工程结构

0x03 添加自定义脚本

在Target “Kindle”的Build Phases里添加Run Script,

偷梁换柱脚本

该脚本实现偷梁换柱魔法

首先将第三方app拷贝替换我们新建工程生成的app

然后对第三方app使用我们的证书进行签名

最后将签名后的第三方app安装至物理机器上

仿佛是在运行我们自己编写的app

从Xcode的Build日志可以看出整个过程,如下图所示:

Bulid 日志

0x04 动态调试第三方APP

添加完脚本后,先clean整个工程,然后Run,可以在非越狱机器上

点击查看视图结构, lldb进行动态调试。

查看视图结构

还可以通过反编译找到特定符号的内存地址,然后根据内存地址设置断点,实现各种神奇的调试偷窥效果。

0x05 遇到的问题

1. clutch无执行权限
chmod +x clutch
2. Plugins中一些Extension签名失败

Kindle和微信都存在这种情况。

从Xcode日志中看到如下类似信息:

NSLocalizedDescription=Failed to verify code signature of 
<MIPluginKitPluginBundle : path = /private/var/mobile/Library/Caches/com.apple.mobile.installd.staging/temp.l4X8Bg/extracted/Kindle.app/PlugIns/KindleToday.appex 
identifier = com.amazon.Lassen.KindleTodayExtension type = 7> : 0xe8008001 (Unknown error)}

从日志可以看出,通过上述方式运行的APP不会对Plugins里面的插件进行签名。

解决方法有两种:

1) 删除提示错误的Plugins文件夹,一般对动态调试没有什么意义。
2) 类比创建一个同名Extension,通过脚本替换成第三方app的Extension。
  • File->New->Target->Today Extension
添加TodayExtension
  • 在target "KindleToday"的Build Phases添加Run Script。
拷贝Extension
  • 将target "Kindle"的Build Phases中的Run Script移至Embed App Extensions之前。
Run Script位置
  • 若APP中有其他Extension或Watch APP可同样处理。

相关文章

网友评论

  • 17a89fbc621c:楼主,出现does not contain a valid Info.plist和“CFBundleExecutable” specifies a file that is not executable 是什么原因呢?
  • _Vitality:楼主。为什么我的Clutch执行 一直显示killed 9 啊
  • 40dd4b561abe:大神,我调试微信的时候怎么老师显示找不到证书呀,,,我确定有证书的,新建的项目可以在手机上测试:relieved:
  • 4a8529d73f13:你好,可以录个视频吗,有些地方不明白,可打赏200作为报酬,或者加我QQ:876529930
    郭秀才:@Hmlyn丶 不用不用,等我周末有时间了给你录个屏~
  • Vxer_Lee:为什么,UI View显示是空白的。
  • Vxer_Lee:和楼主一样的步骤,动态了支付宝,然后run的时候就闪退,这是反调试的原因?
  • 嗷大喵:我在最后启动的时候有些问题
    launch failed: failed to get the task for process xxx
    我用的是开发者证书 provisioning profile 表示xcode启动不了app 安装到是成功安装上去了,能打开app 正常使用 就是xcode run调试连不上 xcode启动不了app
  • angelen:你好,我已经将 clutch 拷贝到手机上了,为什么就找不到命令呢?如图:http://i1.piimg.com/567571/e61da0d156cbc1a7.png
    angelen:@Vxer_Lee 哦,解决了
    Vxer_Lee:逗逼,大写的C
  • 543d0c13d7cd:你好 我是在越狱机上试的,也能安装成功 但是只有一片空白 ,应用不能正常的运行,是在Xcode 8.1 上面试的
  • 不知蜕变的挣扎:还不得越狱
    午马丶:@郭秀才 如何通过PP助手获取脱壳之后的IPA,望回复谢谢
    郭秀才:@不知蜕变的挣扎 各大助手市场可以免费下载已经脱壳好的ipa,然后就不需要越狱机器了
  • onsucs:非常感谢楼主的回复,我测试了下手动打包0x04步骤编译出来的.app文件,安装到越狱ipad上,通过Xcode -> Debug ->Attach to process 选中目标进程,是可以调试的,但是就是无法通过xcode 点run启动调试, 另外这种做法在未越狱机器上行不通,Attach to process查看不了任何进程。
    我在执行 点run的过程中留意到设备日志
    <Notice>: (Note ) MC: Provisioning profiles changed
    <Notice>: (Note ) PS: Media stream daemon starting...

    越狱设备上的日志:
    <Notice>: flow_divert_token_set (0): Failed to get the key unit from the token: 22
    <Error>: Could not set socket option SO_OPPORTUNISTIC: Invalid argument

    貌似配置文件的不对,关键是这是第三方app,我们也不可能拿到对方的配置文件调试啊。

    上面的原理是把第三方app重签我们的调试证书达到调试目的吧?

    下面是我的脚本:

    cp -rf /Users/XXXXXX/Documents/Code/XXX/Payload/XXX.app /Users/XXXXXX/Library/Developer/Xcode/DerivedData/XXXX-bxjwqspyjdbgvwajggwwduihzcam/Build/Products/Debug-iphoneos/

    郭秀才:@艾斯伯格 用xcode看看device的详细日志,一般日志里会提示失败的原因。
    3008d439a156:@onsucs 您好,请问您解决了么这个问题,我也遇到一样的问题,就是直接run提示Can't install application
    xxx.app cannot be installed on iPad. xxx.app does not contain a valid Info.plist

    (“CFBundleExecutable” specifies a file that is not executable)
    机器和系统和您一样
  • onsucs:楼主你好,我按照流程走了一遍 ,在0x04 步骤,clean了项目,然后点run,xcode直接弹窗提示
    Can't install application
    xxx.app cannot be installed on iPad. xxx.app does not contain a valid Info.plist

    (“CFBundleExecutable” specifies a file that is not executable)

    不知道问题出在哪里
    我的环境是 xcode 7.3 ipad mini ios8.1(jb) ,iphone 6s+ ios9.1
    你的笑0:楼上正解,具体就是在runscript加一句
    chmod 777 /Users/yzl/Library/Developer/Xcode/DerivedData/xxxxxxxx-bcpqfpwlxkhoczgzuazejaqzrsfq/Build/Products/Debug-iphoneos/xxxxxxxx.app/xxxxxxxx
    嗷大喵:建议提取个当前设备的指令集出来
    lipo xxx.app/xxx -thin arm64 -output xxx_arm64

    “CFBundleExecutable” specifies a file that is not executable 这问题应该是执行权限不够
    chmod +x abc.app/abc
    郭秀才:@onsucs 尝试先把iOS设备上的APP卸载,然后clean工程再试一遍。如果还是不行,出现错误时从Xcode进入Window->Device->选中设备,查看日志,一般出错时,这里会找到出错的蛛丝马迹;运行后Product里选择app右键在Finder中显示,看看大小是否已经替换成了目标APP,如果没有,则说明没有拷贝成功,贴上你的脚本再看看。祝成功~

本文标题:利用Xcode在非越狱机器上动态调试第三方APP

本文链接:https://www.haomeiwen.com/subject/dgopsttx.html