意犹未尽而来的第一篇Android 逆向

时间:2021-03-01 19:27:10

游戏:咕噜王国大冒险

平台:android

目标:

1. 去除乱七八糟提示(本篇目标)

2. 去除google弹窗

3. 破解“all stages”

意犹未尽而来的第一篇Android 逆向

意犹未尽而来的第一篇Android 逆向

意犹未尽而来的第一篇Android 逆向

破文开始:

  1. 使用APKIDE反编译;搜索字符串“Problem setting up in-app”,看下图

意犹未尽而来的第一篇Android 逆向

于是来到下图

意犹未尽而来的第一篇Android 逆向

分析函数要注意:返回值;这里是V,即void;所以向下关注就应该能达到我们的目的,没必要向上关注;这个函数的功能: 拼接目标字符串,然后作为参数传递给待关注函数;

跟踪函数来到下图:

意犹未尽而来的第一篇Android 逆向

意犹未尽而来的第一篇Android 逆向

意犹未尽而来的第一篇Android 逆向

这个函数功能:使用java中的反射调用;即,这个函数使用java的反射机制,调用了 GameApplication 中的 sendToastMsg 函数;继续跟踪来到下图:

意犹未尽而来的第一篇Android 逆向

这个函数功能:使用java 中的 handle 发送消息,本质就是在传递数据;注意圈出的地方,handle 消息一般都在实现 handle 的那个类中的 handleMessage 中处理,通常 switch 分支 表达式 就是 Message 中的 what 字段;这图中已经圈出了handle sendMessage 的目标是 v0对象,即,GoloRunnerStart 类中的 字段 myHandler; 所以继续跟踪来到下图:

意犹未尽而来的第一篇Android 逆向

意犹未尽而来的第一篇Android 逆向

我们需要找到myHandler变量的值到底是谁,就要关注iput-object语句,看是什么值被赋予了这个变量;这张图,的确符合关注的条件,但是,稍微分析,知道这里是<init>V,是构造函数,初始化变量的地方,再看myHandler被赋予v1,而v1=0x0;所以这里不值得关注,继续寻找来到下图:

意犹未尽而来的第一篇Android 逆向

这里就是值得关注的地方,看到myHandler被赋予了一个有意义的值;这个值是一个实现了handler的类,这个类就是sendMessage的目标;所以跟踪来到下图:

意犹未尽而来的第一篇Android 逆向

看到handleMessage了吧,还记得前面sendMessage的时候那个what字段被赋予的值是多少吗?知道的话,那就看下图吧,不记得了的话,回头看看再回来;

意犹未尽而来的第一篇Android 逆向

这里结合what的值,可以知道,前面sendMessage发送过来的消息,使程序执行了::sswitch_c分支;看下图:

意犹未尽而来的第一篇Android 逆向

还记得sendMessage发送过来的除了what值,还有 什么吗? 还有那个我们第一步搜索的那个字符串经过和另外的字符串拼接之后的字符串,即我们目标图片上显示的那个完整的讨厌的字符串,这个分支就是得到这个字符串,然后 调用包装好的用来显示toast的函数showToast把那个讨厌的提示给我们显示出来;到这里就可以完美的修改代码了,如何修改看下图:

意犹未尽而来的第一篇Android 逆向

如果就这样结束的话,有人可能会问为什么不继续跟进那个showToast呢? 其实这个showToast函数应该跟进去看看,里面根据toast对象是否存在,选择toast的两中使用方法中的一种(一种是使用Toast对象 ,令一种是 使用toast类的makeTest静态方法);由于这个包装函数showToast函数,可能会被其他地方使用来显示我们不讨厌的提示,所以我不建议在这个包装函数里面改代码;最后给出那个包装函数的截图:

意犹未尽而来的第一篇Android 逆向