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为例来演示整个动态调试过程。
- 首先通过0x01获取脱壳的Kindle.ipa文件。
- 然后新建一个工程,名称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
- 在target "KindleToday"的Build Phases添加Run Script。
- 将target "Kindle"的Build Phases中的Run Script移至Embed App Extensions之前。
- 若APP中有其他Extension或Watch APP可同样处理。
网友评论
launch failed: failed to get the task for process xxx
我用的是开发者证书 provisioning profile 表示xcode启动不了app 安装到是成功安装上去了,能打开app 正常使用 就是xcode run调试连不上 xcode启动不了app
我在执行 点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/
xxx.app cannot be installed on iPad. xxx.app does not contain a valid Info.plist
(“CFBundleExecutable” specifies a file that is not executable)
机器和系统和您一样
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
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