作者:threedayman

起源:恒生LIGHT云社区

Allatori 是什么

Allatori是第二代java代码混同工具,为你的产品知识产权提供全方位的爱护。通过代码混同,让代码逆向工程简直变得不可能。

除了代码混同作用,Allatori还能够最小化利用代码大小,进步利用启动速度。

应用案例

创立一个mixup的maven工程如下图

如上图 在根目录下创立allatori文件夹,放入配置文件allatori.xml,创立lib文件夹,在其上面放入allatori.jar和allatori-annotations.jar。

<config>    <input>         <!--混同后间接笼罩原文件,out指向的路劲为混同后的jar -->        <jar in="mixup-0.0.1-SNAPSHOT.jar"  out="mixup-0.0.1-SNAPSHOT-obfuscated.jar" />     </input>      <keep-names>        <!-- protected/public的都保留名称 -->          <class access="protected+">                    <field access="protected+" />              <method access="protected+" />        </class>    </keep-names>    <ignore-classes>        <!-- 留神:spring的框架相干的文件须要排除,防止启动报错 -->        <class template="class *springframework*"/>    </ignore-classes></config>

allatori.xml配置具体可见正文。

pom.xml中退出编译时须要用到的插件

<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>${basedir}/target</outputDirectory>                <resources>                    <resource>                        <directory>allatori</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>            <argument>allatori/lib/allatori.jar</argument>            <argument>${basedir}/target/allatori.xml</argument>        </arguments>    </configuration></plugin>

通过maven package命令进行打包,在taget目录下生成了mixup-0.0.1-SNAPSHOT.jar和mixup-0.0.1-SNAPSHOT-obfuscated.jar(混同后)文件。

通过反编译工具查看mixup-0.0.1-SNAPSHOT-obfuscated.jar。

混同前代码

package com.example.mixup.controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class HelloController {    private Person person;    @RequestMapping("/hello")    public String sayHello(String name){        return "hello "+ name;    }}

混同后通过反编译工具查看

package BOOT-INF.classes.com.example.mixup.controller;import com.example.mixup.controller.Person;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class HelloController {  private Person h;    @RequestMapping({"/hello"})  public String sayHello(String name) {    return (new StringBuilder()).insert(0, a("D@@IC\005")).append(name).toString();  }    public static String a(Object s) {    // Byte code:    //   0: iconst_4    //   1: iconst_3    //   2: ishl    //   3: iconst_5    //   4: ixor    //   5: iconst_4    //   6: iconst_3    //   7: ishl    //   8: iconst_5    //   9: iconst_3    //   10: ishl    //   11: iconst_4    //   12: ixor    //   13: aload_0    //   14: checkcast java/lang/String    //   17: dup    //   18: astore_0    //   19: invokevirtual length : ()I    //   22: dup    //   23: newarray char    //   25: iconst_1    //   26: dup    //   27: pop2    //   28: swap    //   29: iconst_1    //   30: isub    //   31: dup_x2    //   32: istore_3    //   33: astore_1    //   34: istore #4    //   36: dup_x2    //   37: pop2    //   38: istore_2    //   39: iflt -> 79    //   42: aload_1    //   43: aload_0    //   44: iload_3    //   45: dup_x1    //   46: invokevirtual charAt : (I)C    //   49: iinc #3, -1    //   52: iload_2    //   53: ixor    //   54: i2c    //   55: castore    //   56: iload_3    //   57: iflt -> 79    //   60: aload_1    //   61: aload_0    //   62: iload_3    //   63: iinc #3, -1    //   66: dup_x1    //   67: invokevirtual charAt : (I)C    //   70: iload #4    //   72: ixor    //   73: i2c    //   74: castore    //   75: iload_3    //   76: goto -> 39    //   79: new java/lang/String    //   82: dup    //   83: aload_1    //   84: invokespecial <init> : ([C)V    //   87: areturn    // Local variable table:    //   start    length    slot    name    descriptor    //   0    88    0    s    Ljava/lang/Object;  }}

混同后代码难以浏览,通过java -jar mixup-0.0.1-SNAPSHOT-obfuscated.jar命令,混同后的代码可能失常运行。

PS:allatori.xml中要退出一下代码,不要混同spring框架中的代码,不然会影响springboot我的项目启动,呈现ClassNotFoundException谬误。

<ignore-classes>    <!-- 留神:spring的框架相干的文件须要排除,防止启动报错 -->    <class template="class *springframework*"/></ignore-classes>

参考

allatori官网