美文网首页开发工具逆向工程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可同样处理。

    相关文章

      网友评论

      • icode168:楼主,出现does not contain a valid Info.plist和“CFBundleExecutable” specifies a file that is not executable 是什么原因呢?
      • _Vitality:楼主。为什么我的Clutch执行 一直显示killed 9 啊
      • 40dd4b561abe:大神,我调试微信的时候怎么老师显示找不到证书呀,,,我确定有证书的,新建的项目可以在手机上测试:relieved:
      • Hmlyn丶:你好,可以录个视频吗,有些地方不明白,可打赏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
      • 1027165621:你好 我是在越狱机上试的,也能安装成功 但是只有一片空白 ,应用不能正常的运行,是在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的详细日志,一般日志里会提示失败的原因。
        艾斯伯格:@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