前言
本文仅作技术分享,处理iOS SDK开发维护中遇到的一些场景,例如:
客户想提前了解在线APP集成我们SDK后是否会出现SDK兼容性问题,如Crash、符号冲突等。 客户的线上应用集成了我们的SDK,出现了问题。 如何排除故障? 我们想在某个app中测试SDK是否正常运行
对于这些问题,一般来说,我们是无法拿到app的源码的。 为了应对这些场景,我们需要获取客户端的应用程序文件并注入代码。 接下来,我们将从iOS越狱和frida破壳两个方面来介绍如何实现。
iOS越狱
为什么需要越狱? 因为一般情况下,我们无法从手机端获取到App的包文件,只能通过越狱机的动态破壳获取ipa包,使用目前主流的越狱。
iOS越狱,最新版本支持iOS 11-iOS 14.3的不完美越狱。 这里以5S、iOS 12.4.9为例进行不完美越狱
越狱分为“完美越狱”和“不完美越狱”。 简单来说,完美越狱就是越狱的很彻底,把操作系统的读写权限都破解了。 完美越狱完成后,可以自由使用,开关机,下载等,称之为“完美越狱”。 如果越狱不完美,就意味着iPad无法像越狱前那样随时关机。 关机重启后会越狱失败,需要重新进行越狱操作。
对于,我们使用Xcode + iOS App来安装App
通过以上步骤生成的ipa满足苹果的要求,你也可以通过i4助手(爱思助手)快速安装到手机上。
打开,点击越狱,期间弹出REBEL,不用管6.13完美越狱,fork一下,继续。 如果提示重启,就重启,允许,然后继续打开继续,直到越狱完成。 越狱完成后,手机界面会同时显示Cydia和Re-。

配置Cydia 点击Cydia-> ->Edit->Add 添加源build.frida.re,更新。搜索SSH,选择安装搜索frida,因为是5S6.13完美越狱,我们选择Frida for pre-A12,搜索AFC,安装AFC2 iOS12系统文件访问
至此,越狱完成,可以访问系统文件了。
弗里达粉碎外壳
砸壳的目的是获取ipa包。 由于应用程序默认是脱壳的(我不知道它使用的是哪种加密方式),所以需要先脱壳(相当于获取解密后的文件)。 您可以通过您需要的破壳App下载,也可以在i4助手上下载该App,安装到手机上后,我们会动态破壳。
动态脱壳:从运行进程内存中的可执行程序映像开始,dump内存中的内容,实现脱壳。 这种方法比较简单,不关心应用程序使用的加密技术。
对于各种脱壳方案,这里使用Frida脱壳:
混帐克隆
拉下存储库。
wget sudo get-pip.py
cd frida-ios-dump目录下
csudo pip install -r requirements.txt --upgrade

iproxy 2222 22
ssh -p 2222 root@127.0.0.1
或 ssh root@127.0.0.1 -p 2222
PID Name Identifier
---- ----- ---------------------
4621 爱思极速版 rn.notes.best
4650 番茄小说 com.dragon.read
4720 设置 com.apple.Preferences
4547 邮件 com.apple.mobilemail
dump.py com.dragon.read
这里第一次运行卡在0.00B[00:00,?B/s],执行Ctrl+C取消,然后重启dump.py,最终得到frida-ios-dump目录下的shell ipa文件
原版升级,非越狱插件开发集成神器,这里只用到其部分功能,具体安装步骤详见。
使用
提示全部为“”一个团队。 & 中的一个团队。 这时候选择->Build->Add User-
将其添加到 NO 并再次运行。

注入SDK
修改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
1class-dump -H xxx.app -o yourDir/Headers
发现它的类叫做
// See
#import
#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,并有相关日志输出。
至此我们已经解决了前言中提到的第一个和第三个场景问题。 对于第二个问题,如何排查在线App中的SDK问题,需要观察运行后的日志输出,匹配注入的代码,找出合适的入口方法或函数,进行方法交换,测试修改,确定问题点,然后确定如何解决它。
局限性
这个方案还是有不足的
有些APP即使破壳后也无法正常使用。 如果应用集成了旧版SDK,如果要注入新版SDK,需要替换原文件或重命名。
该方案仍有局限性,但足以应付大多数情况。 我们也在改进这些缺点,朝着自动化的平台解决方案发展。
标题:6.13完美越狱|iOS App注入SDK调试
链接:https://www.skyyx.com/news/gl/23733.html
版权:文章转载自网络,如有侵权,请联系删除!