混淆技术研究笔记包含多篇内容,记录了一次混淆的研究和应用的过程。
本文首发于 CSDN,随后会发布在 MyBatis 微信公众号,通过公众号可以免费阅读。
最近有一个 Java 的底层框架需要进行混淆(从原始的 Java 项目改造为了 Maven 多模块),而且要实现和该框架以前一样的混淆和反篡改功能(旧的打包配置我没权限看到),为了实现这些功能,开始了本系列的研究。
1. 常见工具介绍
第一节先来点简单的内容,下面是通过 AI 生成的几款常见的混淆工具简介及对比。
ProGuard
优点: 使用广泛,集成在 Android Studio 中,方便使用。可以缩减代码大小,提高加载效率。
缺点: 主要针对 Java,混淆效果一般。配置复杂,需要处理好白名单。
yGuard
优点: 专门为Android应用设计,混淆效果好。可完全混淆资源文件。
缺点: 学习成本较高,文档不完善。
Bangcle
优点: 无需配置文件,操作简单。支持多种语言的混淆。
缺点: 仅支持在线混淆,需要上传源码,有安全风险,混淆效果一般。
Allatori
优点: 支持多语言,混淆效果强,配置简单。
缺点: 收费昂贵,无法定制规则。
总体来说
YGuard 和 ProGuard 在 Android 混淆中用得较多,前者混淆效果较好,后者使用简单成熟。商业工具混淆效果好但昂贵。所以可以根据需要在这些工具中选择。
我以前用过几次 ProGuard,也知道 yGuard。所以一开始先把 ProGuard 的配置拿来试了试,发现不适合多模块项目的混淆,又了解一下 yGuard,发现也不适合多模块混淆,但是看到下面的配置时,直觉告诉我这种配置方式大概率能够实现多模块混淆。
<inoutpair in="..\modle-b\target\modle-b-${project.version}.jar"
out="..\modle-b\target\modle-b-${project.version}.jar"/>
yGuard确实能实现多模块混淆,也方便和CI/CD流程结合,因此本文后续内容使用的 yGuard 混淆工具。
什么是多模块混淆?
常见的这些工具如果在 Maven 中使用,就只能针对一个模块进行混淆,例如下面的项目:
module-parent
├─module-a
├─module-b
└─module-c
一般只能分别对a,b,c进行混淆,我称这种为单模块混淆。
模块之间如果存在调用关系,就要把需要暴露的接口配置为不混淆,否则混淆后互相不认识就无法调用了,这是单模块混淆的最大特点,如果需要被调用,一定会暴露入口。
多模块混淆就不一样,在混淆的时候,a,b,c一起混淆,如果最终对外暴露的是a中的接口,那么b,c中的所有代码都可以被混淆,也就是b,c无法被单独调用,和a一起的时候,a可以正常调用,a中和b,c有关的调用都是混淆后的代码,这种方式相对单模块混淆更安全,暴露的细节更少。如果软件中有授权相关的重要代码,通过多模块混淆可以更彻底的混淆,然后混入到其他模块中。