iOS App注入SDK调试

iOS App注入SDK调试对于这些问题,一般来说我们无法拿到App的源码,想要处理这些场景,就需要拿到客户App文件并注入代码,接下来我们从 iOS越狱、frida砸壳、MonkeyDev来讲述如何实现。

前言

本文仅作为技术分享,对于一些iOS SDK开发以及维护所遇到的场景问题进行处理,例如:

  1. 客户想提前知晓线上App集成我们SDK后,是否会有SDK兼容性问题,例如Crash,符号冲突

  2. 客户线上App集成了我们SDK,出现了问题,如何进行排查

  3. 我们想测试SDK在某一款App中是否功能正常

对于这些问题,一般来说我们无法拿到App的源码,想要处理这些场景,就需要拿到客户App文件并注入代码,接下来我们从 iOS越狱、frida砸壳、MonkeyDev来讲述如何实现。

iOS 越狱

为什么需要越狱?因为正常情况下,我们无法从手机中获取到App的包文件,只能通过越狱机 动态砸壳 获得ipa包,使用目前主流的 unc0ver 进行越狱。

unc0ver

对于 iOS 的越狱,这里使用的是 unc0ver ,最新版本支持 iOS 11 – iOS 14.3 版本的非完美越狱,这里采用使用 iphone 5S, iOS 12.4.9 为例,进行 非完美越狱

越狱有分为“完美越狱”和“不完美越狱”。完美越狱简单地说就是越狱很彻底,激活成功教程了操作系统的读写权限,完美越狱完成以后可以自由使用,开关机,下载等。称为“完美越狱”。而不完美越狱,则表示iPhone或iPad不能像越狱之前一样随时可以关机,关机重启后越狱失效,需要再进行越狱操作。

对于 unc0ver ,我们使用 Xcode + iOS App Signer 方式进行安装 unc0ver App

iOS App注入SDK调试

通过上述步骤生成的 unc0ver ipa 是符合苹果要求的,你也可以通过 i4助手(爱思助手) 进行快捷安装到手机中。

打开 unc0ver,点击 Jailbreak 进行越狱,期间弹出 REBEL 不要管它,叉掉,继续。提示你重启就重启,该允许的允许,然后继续打开 unc0ver 继续,直到 unc0ver 完成越狱,越狱好后,手机界面会多出Cydia和Substitude,同时打开 unc0ver 显示 Re-Jailbreak 。

配置 Cydia

  1. 点击 Cydia->软件源->编辑->添加 添加源 build.frida.re ,apt.cydiami.com,并进行更新。

  2. 搜索 SSH ,选择 OpenSSH 进行安装

  3. 搜索 frida ,由于是 5S,我们选择 Frida for pre-A12 devices

  4. 搜索 AFC ,安装 AFC2 iOS12系统文件访问

至此,越狱完成,可以访问系统文件了。

iOS App注入SDK调试

Frida 砸壳

砸壳的目的是为了获取 ipa 包,由于Appstore默认给应用程序加了壳(并不知道其使用了那种加密方式),所以需要先砸壳(相当于获取解密后的文件),你可以通过 AppStore 下载你需要砸壳的 App ,也可以下载 i4助手 上的 App ,安装到手机上后,我们进行动态砸壳。

动态砸壳:在运行进程内存中的可执行程序映像入手,将内存中的内容进行转储处理来实现砸壳。该方法相对简单,并且不用关心应用所使用的加密技术。

对于各种砸壳方案,这里使用的 Frida 砸壳:

  • 下拉 frida-ios-dump

git clone github.com/AloneMonkey…

下拉仓库。

  • 安装Python brew install python

  • 安装wget brew install wget

  • 安装pip

wget bootstrap.pypa.io/get-pip.py sudo python get-pip.py

  • 安装frida sudo pip install frida –-upgrade –ignore-installed six

  • 安装脚本依赖环境

    cd frida-ios-dump目录下 csudo pip install -r requirements.txt –upgrade

  • 安装usbmuxd与手机通信 brew install usbmuxd

  • 通过USB使用ssh连接设备,将22映射到电脑上的2222端口

    iproxy 2222 22

  • 另开终端加入连接 密码为设备的登录密码alpine,需要保持连接

    ssh -p 2222 root@127.0.0.1 或 ssh root@127.0.0.1 -p 2222

  • 由于是动态砸壳,我们打开需要砸壳的app,使用 frida-ps -Ua 查看正在运行的应用程序,记录下标识

    PID Name Identifier


    4621 爱思极速版 rn.notes.best
    4650 番茄小说 com.dragon.read
    4720 设置 com.apple.Preferences 4547 邮件 com.apple.mobilemail

  • 然后cd到frida-ios-dump目录下,执行 dump.py 命令

    dump.py com.dragon.read

  1. 这里第一次运行在 0.00B [00:00, ?B/s] 卡住了,执行 Ctrl + C 取消,再重新开始 dump.py

  2. 最终在frida-ios-dump目录下得到砸壳ipa 文件

MonkeyDev

原有iOSOpenDev的升级,非越狱插件开发集成神器,这里仅仅使用了其部分功能,具体的安装步骤说明见 MonkeyDev安装

使用

  • 拿着之前通过Frida砸壳获取的 ipa包(例如:某宝,某度,某某音乐),先创建一个 MonkeyDev 工程。这里以 PlayTheApp 为例

iOS App注入SDK调试

  • 将砸壳的 ipa 放到 PlayTheApp/TargetApp/ 下,然后拖拽至工程文件中。

  • 设置主工程的证书,dylib的不用设置

iOS App注入SDK调试

提示 Showing All Messages Signing for “PlayTheAppDylib” requires a development team. Select a development team in the Signing & Capabilities editor. ,此时选择 PlayTheAppDylib->Build Settings->Add User-Defined Setting 添加 CODE_SIGNING_ALLOWED 为 NO,再运行即可。

注入SDK

  • 可以运行之后,我们在工程中初始化pod,

    修改pod文件,注释use_frameworks!

    platform :ios, ‘9.0’

    target ‘PlayTheApp’ do

    Comment the next line if you don’t want to use dynamic frameworks

    use_frameworks!

    pod ‘GrowingAnalytics-cdp/Autotracker’

    Pods for PlayTheApp

    end

    target ‘PlayTheAppDylib’ do

    Comment the next line if you don’t want to use dynamic frameworks

    use_frameworks!

    pod ‘GrowingAnalytics-cdp/Autotracker’

    Pods for PlayTheAppDylib

    end

  • 查找对应的appdelegate类,使用class-dump命令

    1class-dump -H xxx.app -o yourDir/Headers

发现其 AppDelegate 类叫 XXXXAppDelegate

iOS App注入SDK调试

// See <http://iphonedevwiki.net/index.php/Logos>

#import <UIKit/UIKit.h>
#import "GrowingAutotracker.h"

static NSString *const kGrowingProjectId = @"91eaf9b283361032";

%hook XXXXAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        BOOL result = %orig;
    GrowingTrackConfiguration *configuration = [GrowingTrackConfiguration configurationWithProjectId:kGrowingProjectId];
    configuration.debugEnabled = YES;
    configuration.impressionScale = 1.0;
    configuration.dataCollectionServerHost = @"https://run.mocky.io/v3/08999138-a180-431d-a136-051f3c6bd306";
    [GrowingAutotracker startWithConfiguration:configuration launchOptions:launchOptions];
        return result;
}

%end


然后再编译运行,已经可以在App中调试SDK,并有相关日志输出了。

至此我们解决了 前言 中所述的第1以及第3个场景问题,对于第2个问题,如何排查线上App所出现的SDK问题,则需要通过MonkeyDev运行之后观察日志输出,搭配注入代码,找准合适的入口方法或函数,进行方法交换,测试修改后,判定出现问题的点再判断如何解决。

局限性

对于此方案仍有不足

  1. 对于部分App,即使砸壳后也无法正常使用。

  2. 如果App集成了老版本SDK,想要注入新版本SDK,就需要替换原文件或重命名。

此方案仍具有局限性,但足以应付大多数情况,后续我们也在完善这些不足,向自动化平台方案发展。

iOS App注入SDK调试

今天的文章iOS App注入SDK调试分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/22233.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注