目标
版本测试之余分到了一个处理游戏包弹窗的问题。主要目标是把游戏启动时显示的第三方弹窗去掉。
第三方弹窗的表现是:有标题、描述、输入框、确定按钮、取消按钮。
点击取消游戏退出
点击确定,验证输入框内容(怀疑是发送网络请求验证但没有找到确切证据,因为没有授权码进入正确逻辑)
一定时间后游戏会自动退出
尝试1——直接去掉第三方弹窗
钩住弹窗的展示函数
第一次尝试钩住 UIAlertView的show方法,无果
第二次尝试钩住UIViewController的presentViewController:animated:completion:方法,这是基于弹窗使用UIAlertViewController的前提。替换方法rePresentViewController:animated:completion:实现如下
if([viewControllerToPresent isKindOfClass:[UIAlertController class]]){
if([[(UIAlertController *)viewControllerToPresent message] isEqualToString:@"请输入你的游戏授权码进行绑定,取消的话将直接退出游戏"]){
return;
}
else {
[self repPresentViewController:viewControllerToPresent animated:flag completion:completion];
}
}
else {
[self repPresentViewController:viewControllerToPresent animated:flag completion:completion];
}
return;
这一次尝试之后,弹窗不再显示,但之后会crash并在控制台报数组越界错误
尝试2——直接堵住数组越界
给产生数组越界的所有方法都做了交换,如果数组越界则返回nil或者直接return
最后不再crash,弹窗不显示,但是一定时间后游戏会自动退出。
退出日志为:
Process exited: <FBApplicationProcess: 0x13be00120; game; pid: -1> -> <FBApplicationProcessExitContext: 0x170e5d400; exitReason: voluntary; terminationReason: (none)>
尝试3——交换退出方法exit并打印堆栈来追踪逻辑
一开始只钩住了void exit(int status)
发现“点击取消按钮”这种情况下调用了退出方法,但是打出的堆栈似乎不足以分析(之后补充)
但是“一定时间后游戏自动退出”这种情况下并没有调用退出方法
随后还分别钩住_exit() / _Exit() / abort(),但同样没有调用,陷入僵局。
除了通过ida做内部分析,暂时想不到更简便的方法了,跪求大佬提供思路。
版权声明:本文为qq_32792839原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。