如果用 zip 方式打开一个 Jar 包,将会看到一堆配置文件以及class文件。使用一些解码软件可以粗略的逆向出原代码。如果这个jar包的作者再里面加入了一些无用、冗余的指令等代码,逆向出来也完全看不懂。这种方式就是本篇的主题,代码混淆(Obfuscation)
在正式开始实战前,先对代码混淆的核心概念有一些认知。
为什么需要代码混淆呢?经常开发的代码,第三方依赖大多用的是一定协议的开源代码库。有开源就有闭源,闭源通常以在线API,云主机环境预装等手段实现。
还有一种就是提供闭源的Jar包来保护知识产权。
Java 是编译成Class字节码再被JVM所运行的,所以编译和运行阶段都是可以混淆的关键阶段。
字节码工具: ASM、Javassist、Byte Buddy。
最常见的就是字符串加密,对应用程序中的敏感字符串进行加密处理,使得反编译后的代码无法直接获取原始字符串。
为了加大逆向难度,还可以通过插入无用指令、改变指令执行顺序等方式,打乱代码的执行流程等操作。
一款老牌的开源代码混淆器,截止目前,github上最新版为:v7.6,支持JDK 23。

任意版本都可以,内部自带快捷使用、演示包。
├─bin // 脚本
├─docs // 文档
├─examples 工程案例
└─lib // 使用的jar包
proguard-ant.jar
proguard.jar
proguardgui.jar
retrace.jar如果电脑配置了 Java 环境,可以直接双击lib/proguardgui.jar来启动,这是一个友好的 Java 构建的桌面版。
启动失败请检查环境或者尝试用java -jar 的命令来打开。

首页就是广告,从第一个input / output上手,设置要输入等待混淆的jar包,以及设置输出路径。下图就是我的设置完的效果。

然后点击右下角的 Next,进入下一步。如果没有特殊需求可以一直点击Next,直到出现process,开始正式混淆。下面介绍几个经常用的点。
看着飞速划过的并且不懂的英文,以为生效了,最后突然抛出一个找不到依赖。
在input/output中,下面的一览就是这个错误的关键。可是Maven工程Jar包都在本地repo库,该怎样输出到一个路径下,方便添加呢?
Maven 早想到了这一点,你可以在pom文件的build标签下添加如下
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>再次输出,就会保存到target/lib中。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。