Allatori混淆技术介绍

Allatori是一个Java 混淆器,它属于第二代混淆器,因此它能够全方位地保护你的知识产权。 Allatori具有以下几种保护方式:命名混淆,流混淆,调试信息混淆,字符串混淆,以及水印技术。对于教育和非商业项目来说这个混淆器是免费的。支持war和jar文件格式,并且允许对需要混淆代码的应用程序添加有效日期。 有项目需要对代码进行保护,比较初级的方案就是对代码进行混淆,打包之后的文件进行反编译后,就可以看到效果。此外,使用Allatori打的包体积也会小一点。

工程介绍

【20200524】Spring Boot使用Allatori代码混淆 - 图1
一个很普通的maven工程,不同的是在根目录下加入Allatori的jar包。

下面我们来看看pom.xml文件:
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3. <modelVersion>4.0.0</modelVersion>
  4. <groupId>com.lovnx</groupId>
  5. <artifactId>confusion</artifactId>
  6. <version>0.0.1-SNAPSHOT</version>
  7. <packaging>jar</packaging>
  8. <build>
  9. <plugins>
  10. <plugin>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-maven-plugin</artifactId>
  13. </plugin>
  14. <!-- Allatori plugin start -->
  15. <plugin>
  16. <groupId>org.apache.maven.plugins</groupId>
  17. <artifactId>maven-resources-plugin</artifactId>
  18. <version>2.6</version>
  19. <executions>
  20. <execution>
  21. <id>copy-and-filter-allatori-config</id>
  22. <phase>package</phase>
  23. <goals>
  24. <goal>copy-resources</goal>
  25. </goals>
  26. <configuration>
  27. <outputDirectory>${basedir}/target</outputDirectory>
  28. <resources>
  29. <resource>
  30. <directory>${basedir}/allatori</directory>
  31. <includes>
  32. <include>allatori.xml</include>
  33. </includes>
  34. <filtering>true</filtering>
  35. </resource>
  36. </resources>
  37. </configuration>
  38. </execution>
  39. </executions>
  40. </plugin>
  41. <plugin>
  42. <groupId>org.codehaus.mojo</groupId>
  43. <artifactId>exec-maven-plugin</artifactId>
  44. <version>1.2.1</version>
  45. <executions>
  46. <execution>
  47. <id>run-allatori</id>
  48. <phase>package</phase>
  49. <goals>
  50. <goal>exec</goal>
  51. </goals>
  52. </execution>
  53. </executions>
  54. <configuration>
  55. <executable>java</executable>
  56. <arguments>
  57. <argument>-Xms128m</argument>
  58. <argument>-Xmx512m</argument>
  59. <argument>-jar</argument>
  60. <argument>${basedir}/lib/allatori.jar</argument>
  61. <argument>${basedir}/target/allatori.xml</argument>
  62. </arguments>
  63. </configuration>
  64. </plugin>
  65. <!-- Allatori plugin end -->
  66. </plugins>
  67. </build>
  68. <dependencies>
  69. <!-- Test Begin -->
  70. <dependency>
  71. <groupId>junit</groupId>
  72. <artifactId>junit</artifactId>
  73. <scope>test</scope>
  74. </dependency>
  75. <!-- Test End -->
  76. <!-- springboot启动 -->
  77. <dependency>
  78. <groupId>org.springframework.boot</groupId>
  79. <artifactId>spring-boot-starter-web</artifactId>
  80. </dependency>
  81. </dependencies>
  82. <parent>
  83. <groupId>org.springframework.boot</groupId>
  84. <artifactId>spring-boot-starter-parent</artifactId>
  85. <version>1.5.8.RELEASE</version>
  86. </parent>
  87. </project>
  88. 复制代码

使用maven打包插件,Spring Boot构建的工程,Allatori的配置在上面也有说明,Allatori配置里面比较重要的是:

  1. <argument>${basedir}/lib/allatori.jar</argument>
  2. <argument>${basedir}/target/allatori.xml</argument>
  3. 复制代码

指定Allatori的allatori.jar文件路径,如果你的工程是一个pom工程,可以在父工程中放lib目录,然后子工程只需要:

  1. <argument>../lib/allatori.jar</argument>
  2. 复制代码

即可。

allatori.xml这个文件也很重要,看看其中的内容:
  1. <config>
  2. <input>
  3. <jar in="confusion-0.0.1-SNAPSHOT.jar" out="confusion-0.0.1-SNAPSHOT-obfuscated.jar"/>
  4. </input>
  5. <keep-names>
  6. <class access="protected+">
  7. <field access="protected+"/>
  8. <method access="protected+"/>
  9. </class>
  10. </keep-names>
  11. <property name="log-file" value="log.xml"/>
  12. </config>
  13. 复制代码

即是对Allatori混淆器的具体配置,这里可以配置很多信息,很多种策略,也可以指定哪些类不被混淆,具体的各种方式可以在在文末附件里面的文档得到。 这里需要说明的是:

  1. <input>
  2. <jar in="confusion-0.0.1-SNAPSHOT.jar" out="confusion-0.0.1-SNAPSHOT-obfuscated.jar"/>
  3. </input>
  4. 复制代码

confusion-0.0.1-SNAPSHOT.jar这个是打包后的未被混淆的包,而confusion-0.0.1-SNAPSHOT-obfuscated.jar是混淆后的包,这个是我们需要的。

打包步骤

1、clean maven工程。
2、将resources下面的allatori.xml文件复制到target目录下面。
3、install maven工程,看到如下信息后表示成功:

  1. ################################################
  2. # #
  3. # ## # # ## ### ### ## ### #
  4. # # # # # # # # # # # # # #
  5. # ### # # ### # # # ## # #
  6. # # # ### ### # # # ### # # ### #
  7. # #
  8. # DEMO VERSION! #
  9. # NOT FOR COMMERCIAL USE! #
  10. # #
  11. # Demo version adds System.out's #
  12. # and gives 'ALLATORI_DEMO' name #
  13. # to some fields and methods. #
  14. # #
  15. # #
  16. # Obfuscation by Allatori Obfuscator v6.4 DEMO #
  17. # #
  18. # http://www.allatori.com #
  19. # #
  20. ################################################
  21. 复制代码

4、成功后的工程:
【20200524】Spring Boot使用Allatori代码混淆 - 图2
箭头所指处即是我们需要的包,此包代码已被混淆。

效果查看

这里使用反编译工具对混淆后的包进行查看,我用的是jd-gui这个软件,小巧实用。
TestApplication.java混淆前:

  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. @SpringBootApplication
  4. public class TestApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(TestApplication.class, args);
  7. }
  8. }
  9. 复制代码

TestApplication.java混淆后:

  1. import java.io.PrintStream;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class TestApplication
  6. {
  7. public static String ALLATORIxDEMO(String a)
  8. {
  9. int tmp4_3 = 4;
  10. int tmp7_6 = 1;
  11. int tmp21_18 = a.length();
  12. int tmp25_24 = 1;
  13. tmp25_24;
  14. int j;
  15. int ? = tmp25_24;
  16. int k = tmp21_18;
  17. int tmp35_31 = (j = new char[tmp21_18] - 1);
  18. tmp35_31;
  19. int i = 5 << 4 ^ (0x2 ^ 0x5);
  20. (tmp4_3 << tmp4_3 ^ tmp7_6 << tmp7_6);
  21. if (tmp35_31 >= 0)
  22. {
  23. int tmp45_44 = j;
  24. j--;
  25. ?[tmp45_44] = ((char)(a.charAt(tmp45_44) ^ i));
  26. int tmp66_63 = (j--);
  27. ?[tmp66_63] = ((char)(a.charAt(tmp66_63) ^ k));
  28. }
  29. return new String(?);
  30. }
  31. public static void main(String[] a)
  32. {
  33. System.out.println("\n################################################\n# #\n# ## # # ## ### ### ## ### #\n# # # # # # # # # # # # # #\n# ### # # ### # # # ## # #\n# # # ### ### # # # ### # # ### #\n# #\n# Obfuscation by Allatori Obfuscator v6.4 DEMO #\n# #\n# http://www.allatori.com #\n# #\n################################################\n"); SpringApplication.run(TestApplication.class, a);
  34. }
  35. }
  36. 复制代码

TestController.java混淆前:

  1. import org.springframework.web.bind.annotation.GetMapping;
  2. import org.springframework.web.bind.annotation.RestController;
  3. @RestController
  4. public class TestController {
  5. @GetMapping("/test")
  6. public String test(){
  7. return "88888888888888888";
  8. }
  9. }
  10. 复制代码

TestController.java混淆后:

  1. import org.springframework.web.bind.annotation.GetMapping;
  2. import org.springframework.web.bind.annotation.RestController;
  3. @RestController
  4. public class TestController
  5. {
  6. @GetMapping({"/test"})
  7. public String test()
  8. {
  9. return ALLATORIxDEMO("*]*]*]*]*]*]*]*]*");
  10. }
  11. public static String ALLATORIxDEMO(String a)
  12. {
  13. int tmp27_24 = a.length();
  14. int tmp31_30 = 1;
  15. tmp31_30;
  16. int j;
  17. int ? = tmp31_30;
  18. int k = tmp27_24;
  19. int tmp41_37 = (j = new char[tmp27_24] - 1);
  20. tmp41_37;
  21. int i = (0x3 ^ 0x5) << 4 ^ 0x5;
  22. (2 << 3 ^ 0x2);
  23. if (tmp41_37 >= 0)
  24. {
  25. int tmp51_50 = j;
  26. j--;
  27. ?[tmp51_50] = ((char)(a.charAt(tmp51_50) ^ i));
  28. int tmp72_69 = (j--);
  29. ?[tmp72_69] = ((char)(a.charAt(tmp72_69) ^ k));
  30. }
  31. return new String(?);
  32. }
  33. }
  34. 复制代码

哈哈哈,怎么样,是不是看不懂?并且混淆包照常运行,没有任何问题。

作者:Lovnx
链接:https://juejin.im/post/5a97b50a518825558358a024
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。