BinCrack 发表于 2022-1-29 16:30:43

3x0加固防重打包分析与绕过

本帖最后由 BinCrack 于 2022-1-29 16:25 编辑

飘云阁全网首发,未经许可,禁止转载。

好久没有发技术贴了,这一年多都在实习以及写论文。秋招投了三家公司,拿到了阿里与腾讯的头部计划、字节的ssp offer后就打算躺平了,似乎没有了以前对技术痴迷的兴趣。前几天RoOking表哥让绕过“电视家”的签名校验,竟然磨蹭了半天才搞定,手速已经不行了。同时兴致来了,于是就有了今天这篇文章。
本文以最新3x0加固免费版为例,介绍现有的过签名原理、3x0加固防重打包校验以及针对3x0加固的通用绕过方案。想当初CNFIX大火的时候,分析小密盾就是应R版邀请来破解CNFIX的。但破解后一次也没用过,因为当时对这种旁门左道是不屑一顾的。直到最近才尝试自己分析一下3x0加固,结果大跌眼镜。
1.现有方案      防重打包技术以及绕过并不是新鲜的话题,红极一时的一键过签工具有:MT、NP、ARMPro、CNFIX等。配合现有的诸多dex内存dump工具,可以实现无需脱壳、无视dexVMP、带壳修改apk并重打包运行,制作出令无数开发人员头疼的 “破解版”应用。但是随着3x0加固的对抗升级,这些工具已对最新版3x0加固无效。他们所使用的技术原理主要分为PMSHook和IO重定向。其中PMSHook利用反射和动态代理技术替换signature,使得依靠PMS方式获取的signature为攻击者构造后的正确签名信息。IO重定向更多的是针对APK完整性校验,又分为直接修改apkpath与hook IO函数两种方式。如hook libc.so的open openat函数,将路径替换为正版apk路径。感兴趣的朋友可以自行搜索学习,网上有大量的相关技术原理与代码实现。    2.逆向分析      分析前还是对3x0加固充满敬畏的,以为会很复杂,直到分析结束……。3x0加固的so名为libjiagu.so,运行时该so会解密释放真实壳so并以自定义linker方式加载,因此直接静态分析该so无法获取真实逻辑。但解密后的壳so包含大量明文字符串、大量未被混淆的关键函数。不过这些关键函数间的调用关系还是被混淆,然而也并没有什么卵用。这里直接给出分析结果:1)完整性校验:通过sourceDir获取apk路径并做相关校验。这里具体怎么做的校验直接懒得分析,因为IO重定向就能搞定。值得注意的是sourceDir以及open函数的实现方式,这直接决定了IO重定向的成功与否。其中sourceDir的获取过程利用Binder机制直接与PackageManager服务端交互,相当于自行实现了PMS相关函数的功能。因此现有的PMSHook方案无法拦截。Open函数更是类似,直接使用系统调用,相当于自实现libc,同样现有hook工具难以拦截。2)Apkpath校验:判断apk路径是否为/data/app开头,因为正常情况下apk路径会在/data/app/packagename下且该目录不能随便写入,然而过签工具的正版apk通常放在私有目录即/data/data/packagename下。这种校验方式绝对是一大槽点,后续介绍。同时还会判断是否包含黑名单路径。3) 签名校验:直接利用Binder机制,跳过PMS系统提供的函数获取签名。这里与上文获取sourceDir原理一致,仅截取部分实现图片如下:
3.破绽打击      关于防重打包的思路是非常多的,当分析结束发现就以上几点时,直呼不过瘾。通俗的总结以上升级检测方案:不再信任常规系统函数,而是抄安卓源码自实现之,这样常规的通用过签方案自然也就无效了。这里针对检测的破绽提出新的绕过方案:1)   Hook代理类:直接hook android.content.pm.IPackageManager$Stub$Proxy类的getPackageInfo方法,此时便可以拦截3x0加固的sourceDir与signature获取。Signature直接替换正确数据即可,但sourceDir会再次遇到apkpath校验,怎么办?so easy,修改成/data/app/../data/即可!
2)   没有第二了,就这。
4.思考总结问:第3节中提到的apkpath校验绕过方式很容易被对抗,那么不修改apkpath就不行了吗?(绕过)答:当然不是,修改apkpath只是IO重定向的一种方式,另一种方式是hook open等IO函数。由于壳自实现了open函数,常规的libc库函数hook就无效了。此时可以直接去Hook 壳中自实现的open函数,但通用性差,还需要特别注意时机。时机过早的话,可能壳还没有解密释放真实逻辑,对应的偏移地址内存不合法。时机过晚该函数则可能执行过了,hook个寂寞。
问:如果hook壳内部函数怎么对抗呢?(防御)答:1. 动态shellcode执行自实现函数,执行完立即释放。      2. 内存CRC校验
问:有没有办法不侵入壳so实现系统调用hook?(绕过)答:1. 修改内核      2. 加载内核模块
问:能不能只在用户层,又不侵入壳so实现系统调用hook?(站着把钱挣了呗)答:能,sxxxxxp,不是骂人的话,隐藏掉关键字,懂得自然懂,分享的多了大家都没得玩了。攻防永无止境。

怜渠客 发表于 2022-1-29 16:46:19

支持支持,学习一下

快乐小牛 发表于 2022-1-29 17:04:47

感谢分享思路,又可以搞360了

风轻云淡 发表于 2022-1-29 18:29:34

我也想用电视家

sdzcq 发表于 2022-1-29 19:06:03

感谢老师分享!

wgz001 发表于 2022-1-30 08:48:38

彬哥新年快乐!带带我

Rooking 发表于 2022-1-30 10:22:55

沃尔德天呐不屑一顾的大表哥

Rooking 发表于 2022-1-30 10:37:53

这种过签方式的兼容性好不好呢?

666888tzq 发表于 2022-1-30 11:00:56

赞,彬哥无所不能啊。

飞天 发表于 2022-1-30 12:09:33

膜拜大婶,支持分享文章。
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 3x0加固防重打包分析与绕过