Allatori
最近涉及到一些代码安全方面的工作,找到Allatori 这个代码混淆工具,代码混淆是将代码中类名、方法名、属性名替换为无意义符号,增加代码逆向难度,对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低,从而实现代码保护。
官网下载 http://www.allatori.com/ 压缩包
1.pom.xml中引入插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.1.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Allatori plugin start -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-and-filter-allatori-config</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${project.basedir}/target</outputDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<includes>
<include>allatori.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<id>run-allatori</id>
<phase>package</phase>
<goals>
<goal>exec</goal>
</goals>
</execution>
</executions>
<configuration>
<executable>java</executable>
<arguments>
<argument>-Xms128m</argument>
<argument>-Xmx512m</argument>
<argument>-jar</argument>
<!-- allatori混淆的jar文件目录 -->
<argument>${project.basedir}/lib/allatori.jar</argument>
<!-- allatori混淆的配置文件-->
<argument>${project.basedir}/src/main/resources/allatori.xml</argument>
</arguments>
</configuration>
</plugin>
<!-- Allatori plugin end -->
</plugins>
</build>
2.打开下载好的压缩包,找到 这两个jar包
3.复制上面两个jar包到项目目录下新建一个lib 丢进去,这里我的项目是多模块的项目,先放在start目录下
4.resource 目录下新增allatori.xml
<?xml version="1.0" encoding="UTF-8"?>
<config>
<input>
<!-- 这里的in表示需要混淆的jar(springboot打包后的jar),out表示输出混淆后的jar(混淆器修改springboot打包后的jar) -->
<jar in="../../../target/xxx.jar" out="../../../target/xxx-obfuscated.jar" />
</input>
<!-- 不替换类名、方法名、属性名 -->
<keep-names>
<class access="protected+">
<field access="protected+" />
<method access="protected+" />
</class>
</keep-names>
<ignore-classes>
<!-- 忽略springBoot的启动项(防止启动报错) -->
<class template="class *springframework*" />
<!-- 不混淆框架内的东西(包括Redis,Jbdc,DAO层和Entity层等),最好只混淆自己的核心逻辑-->
</ignore-classes>
<!-- 接口形参名保持不变 -->
<property name="local-variables-naming" value="keep-parameters"/>
<property name="log-file" value="log.xml" />
<!-- 添加水印密匙,主要用来保护版权 -->
<!-- <watermark key="secure-key-to-extract-watermark" value="Customer: John Smith; Date: xx.yy.zzzz"/> -->
<!-- 配置过期时间 -->
<!-- <expiry date="2000/01/01" string="EXPIRED!"/> -->
<!-- 随机命名混淆字符-->
<property name="random-seed" value="cshxzf jrncbd hh"/>
</config>
5.配置都完成之后,使用maven package 打包,完成之后在target目录下会生成两个jar包,一个是正常的jar包一个是混淆后的jar包
6.正常生成之后打开jar包 再使用反编译工具打开class文件查看代码已经被混淆了。
总结: 我这里遇到的几个问题是,因为我是多模块的项目,将配置完成之后发现结果只有starter模块的代码被混淆了,其他的模块的还是原样,网上也搜查了些资料说是在allatori.xml文件里面配置多个模块就可以了,但是最后都给我报错说找不到目标文件,后来也没再继续找下去,我自己的处理方式是在每个模块下面再配置同样的代码,最后每个模块都会生成自己的混淆后的jar包,我最后再将混淆后的jar包 手动丢到start的jar中替换没有混淆的jar包。
不知道大家有没有别的有效的办法 可以share一下。