导语:常见于谷歌商店内的一些游戏

分析思路第一步,结合网上有限的线索掌握关键信息。该加固无代码抽取。主要运用为混淆、动态注册native、多线程执行验证(root、签名、Frida)。
一开始的思路为解决Java上的一个线程调用,解决Java的退出。该方法成功让我们的存活时间延长了30秒。且java层再无其他调用

现在只能将关注点转移到native,因为我们通过打印可知其实大量方法是通过native进行反射调用我们从Java出发的追踪很麻烦。且dex字节码都是动态生成的

所以与其想那么多不如直接进攻native,其加固so不到1m大小,地址再多可以多到哪里去[滑稽]暴力监听所有线程包括子线程的创建(这个作为一名c开发者来说非常熟悉,耗时的检测操作就喜欢疯狂开线程[滑稽])

根据拿到的入口等地址,接下来进入我们最耗时的逆向,逐一分析f5看代码相关调用,根据经验猜逻辑
最后抓出了几个线程的创建进行ret,游戏存活时间延长10秒,弹窗消失[滑稽]
胜利不远了,这时的退出非常有趣了,Java层、c层都拦截不到。只能一路看调用找到了最终的线程开始处51500,这个地址。伪代码达到了1000多条在这个不到1m的文件下。这个代码量绝对核心。
两眼一闭[呵呵]继续看c代码。一些关键的代码:
strcpy((char *)(v16 - 520), "magisk(Alpha)");
sub_24218(0x1B8Eu, 0x100u, v16 - 520); 好了一个面具的检测,终于让我百分之八十确定了这个方法是个主要的初始化代码可能用于生成动态dex?注册native?建立大量检测线程?
如果直接ret她会导致我们的游戏进入不了,为此只能转为分析出所有关键线程启动位置进行ret。
最终总共耗时1个小时完成整个游戏的过签。
该加固最终总结是不难,但是烦人以我对游戏逆向的习惯。纯靠手动去分析的游戏我是最烦的(所以一些混淆方法名的游戏我很烦),更喜欢分析完成后可以写出自动化的功能脚本 一运行cmd滑滑出现大量成功日志那种[滑稽]所以本次教程我们没有什么自动化脚本提供,全部都是针对性某一个位置或者分析需求写的一些分析代码。个人能力有限找不到共同点以作锚点
分析结束[呵呵]








这一切,似未曾拥有