【iOS】记一次失败的hook尝试(游戏去弹窗失败)

目标

版本测试之余分到了一个处理游戏包弹窗的问题。主要目标是把游戏启动时显示的第三方弹窗去掉

第三方弹窗的表现是:有标题、描述、输入框、确定按钮、取消按钮。

点击取消游戏退出

点击确定,验证输入框内容(怀疑是发送网络请求验证但没有找到确切证据,因为没有授权码进入正确逻辑)

一定时间后游戏会自动退出

尝试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版权协议,转载请附上原文出处链接和本声明。