我的插件源:https://repo.snailovet.com
欢迎添加,关注【蜗牛iOS】公众号,交流提需求
图床不知道为什么挂了,可以移步到公众号文章 https://mp.weixin.qq.com/s/vPLOnLCiaeNZ6lKWN-HeFA
需求背景
作为多年果粉,爱折腾青年,手中iPhone一直都是越狱状态,但总有些APP本身质量不高,但检测是否越狱的挺勤奋,比如本文主角APP -- 建设银行。
你说检测就检测吧,您给个弹窗,用户点击“确定”后APP就缩小退出,也体验太差了。
不能忍~
需求目标
逆向建设银行APP,跳过检测越狱弹窗,让建设APP正常使用。
尝试思路
思路一
既然能进来主界面,并且弹窗能够停留,那么打开FelxAll工具查看“确定”按钮为十六进制内存地址为0x15092F5C0
使用Cycript查看,按钮最终执行方法为[CCBBaseAlertView buttonClick]
,这个方法看起来,并无特殊可言。换思路~
思路二
既然出现弹窗,点击“确定”就被程序主动退出,那么是不是只要把【确定】后所执行的方法重写/Hook掉就可以了?
分析过程
静态分析
打开IDA,静态分析建设银行的可执行文件的汇编代码。在字符串搜索框下搜索“Root设置”。
查看字符串地址
按下键盘X,查看在汇编代码中引用此字符串的代码内存地址。
找到如下,地址sub_1025B194
代码块查看使用了字符串,如下图截图所示。
那么怎么看,“确定”按钮背后的执行功能函数呢? 一般在iOS中按钮的文字赋值和功能函数的添加是依次进行的。在下图我们看到的代码块sub_102582B0
。
进入sub_10258B2B0
,查看代码,可以看到其中执行了[xxxx exitApp]
方法,那么xxx是哪个类的哪个实例对象呢?
不断向上查看调用栈,可以看到最终调用exitApp的为AppDelegate实例对象,即[AppDelegate exitApp]
。符合iOS开发的思路:
一般在APP加载完成后在,[AppDelegate application:didFinishLaunchingWithOptions:]
中执行其他功能,如启动后的越狱检测、弹窗显示。
代码初尝
%hook AppDelegate- (void)exitApp {NSLog(@"如果弹窗展示了,点击了确定即可,并不会退出APP,继续使用");}%end
经过编译为越狱插件,打开建设银行APP-依然显示弹窗-点击“确定”,不会被强制执行退出APP可以继续使用。
但是每次进入建设银行APP,都需要看到“烦人的弹窗和点击”这不符合我们对于完美的追求。
继续分析
在前面查看字符串的内存引用地址,我们看到了弹窗的实现逻辑[xxx showWithTitle: message: btnTitleArray: alertType: callback:]
在IDA中功能函数搜索框中,搜索如下,可以看到有两个类使用此功能函数作为“弹窗展示”的逻辑实现。
既然使用此功能函数的代码不多,那我们就可以开始HOOK重写弹窗展示逻辑。
代码实现
%hook AppDelegate
- (void)exitApp {
NSLog(@"如果弹窗展示了,点击了确定即可,并不会退出APP,继续使用");
}
%end
%hook CCB_5_BaseCellViewController
- (void)showWithTitle:(id)arg1 message:(id)arg2 btnTitleArray:(id)arg3 alertType:(int)arg4 callback:(id)arg5 {
NSLog(@"CCB_5_BaseCellViewController message为:%@", arg2);
if ([arg2 containsString:@"Root"] || [arg2 containsString:@"越狱"]) {
NSLog(@"不展示[手机已越狱提示弹窗]");
} else {
NSLog(@"执行原逻辑");
%orig;
}
}
%end
%hook CCBViewController
- (void)showWithTitle:(id)arg1 message:(id)arg2 btnTitleArray:(id)arg3 alertType:(int)arg4 callback:(id)arg5 {
NSLog(@"CCBViewController message为:%@", arg2);
if ([arg2 containsString:@"Root"] || [arg2 containsString:@"越狱"]) {
NSLog(@"不展示[手机已越狱提示弹窗]");
} else {
NSLog(@"执行原逻辑");
%orig;
}
}
%end
%ctor {
NSLog(@"建设银行已注入");
}
源代码
https://github.com/SnailTheDev/BypassCCBank
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-11-25 17:18
被蜗牛iOS编辑
,原因: