|
@@ -0,0 +1,207 @@
|
|
|
|
|
+
|
|
|
|
|
+下述配置说明摘录自[Java打包混淆之Allatori](https://blog.csdn.net/jy317358306/article/details/117464021)
|
|
|
|
|
+```xml
|
|
|
|
|
+<config>
|
|
|
|
|
+ <!-- input标签是用来设置将要被混淆的jar(war,ear)文件的,input标签至少必须包含一个jar或dir标签来配置输入输出文件 -->
|
|
|
|
|
+ <!-- input标签的basedir属性,可选配置,用来设置jar文件的相对文件目录的 -->
|
|
|
|
|
+ <!-- input标签的single-jar属性,可选配置,Allatori会创建一个包含所有混淆过的类的额外输出jar文件-->
|
|
|
|
|
+ <input basedir="input-jars" single-jar="application.jar">
|
|
|
|
|
+ <!-- jar标签,设置输入输出文件,这种是具体的jar文件,输入输出同名的话,混淆后的文件会覆盖混淆前的为文件 -->
|
|
|
|
|
+ <jar in="app.jar" out="app-obf.jar"/>
|
|
|
|
|
+ <!-- jar标签,通配符的配置方式 -->
|
|
|
|
|
+ <jar in="input/*.jar" out="output/*.jar"/>
|
|
|
|
|
+ <!-- dir标签,配置输入输出目录 -->
|
|
|
|
|
+ <dir in="in-dir" out="out-dir"/>
|
|
|
|
|
+ </input>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- classpath标签用于设置被混淆程序的类路径,它不必配置应用程序所需的所有jar包,但是缺少依赖包可能混淆没那么彻底,同时混淆的过程中也可能会出现告警 -->
|
|
|
|
|
+ <!-- basedir,与input的basedir同理,配置一个相对路径 -->
|
|
|
|
|
+ <classpath basedir="library-jars">
|
|
|
|
|
+ <!-- 添加一个library.jar的jar到类路径中 -->
|
|
|
|
|
+ <jar name="library.jar"/>
|
|
|
|
|
+ <!-- 配置一个目录下的jar到类路径 -->
|
|
|
|
|
+ <jar name="lib/*.jar"/>
|
|
|
|
|
+ <!-- 配置lib2下的目录以及它的子目录下的jar到类路径 -->
|
|
|
|
|
+ <jar name="lib2/**/*.jar"/>
|
|
|
|
|
+ </classpath>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- keep-names标签用于在混淆过程中标记不需要重命名的类、方法、字段的名称,所以该标签下有class/method/field这三种标签。通常不建议混淆的几种情况如下: -->
|
|
|
|
|
+ <!-- 1.如果混淆的jar是一个公共类库,那么public类型的api就不能被混淆(即不需要重命名) -->
|
|
|
|
|
+ <!-- 2.如果混淆的jar是一个独立的应用程序,那么该应用程序的启动类即主类不应该被混淆 -->
|
|
|
|
|
+ <!-- 3.如果某些类和方法被反射使用了,那么这些类和方法也不应该被混淆 -->
|
|
|
|
|
+ <keep-names>
|
|
|
|
|
+ <!-- class标签用来匹配类,它有access、template、ignore、stop四个属性,至少要带有access、template中的一个属性 -->
|
|
|
|
|
+ <!-- access通过访问权限隔离来匹配,带加号('+'),表示更宽的权限范围都可以匹配上 -->
|
|
|
|
|
+ <!-- template通过表达式来匹配,*标识通配符 -->
|
|
|
|
|
+ <!-- ignore可选,当它设置为'true'或'yes'时,类会被混淆,但是方法和属性不会被混淆 -->
|
|
|
|
|
+ <!-- stop可选,当它设置为'true'或'yes'时,类、方法、属性都会被混淆 -->
|
|
|
|
|
+
|
|
|
|
|
+ <!-- stop属性,控制是否被重命名,等于true,配置的class com.company.abc.*下的类、方法、属性都会被重命名 -->
|
|
|
|
|
+ <class template="class com.company.abc.*" stop="true"/>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 下面是不需要重名名的规则 -->
|
|
|
|
|
+ <!-- 匹配任何包下名字为'Main'的类 -->
|
|
|
|
|
+ <class template="class *.Main"/>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 匹配以‘Bean’结尾的类 -->
|
|
|
|
|
+ <class template="class *Bean">
|
|
|
|
|
+ <!-- 匹配所有的属性,access匹配方式 -->
|
|
|
|
|
+ <field access="private+"/>
|
|
|
|
|
+ <!-- 匹配所有public int的属性 -->
|
|
|
|
|
+ <field template="public int *"/>
|
|
|
|
|
+ <!-- 匹配所有的静态属性 -->
|
|
|
|
|
+ <field template="static *"/>
|
|
|
|
|
+ <!-- 匹配所有protected和public且为String的属性 -->
|
|
|
|
|
+ <field template="protected+ java.lang.String *"/>
|
|
|
|
|
+ <!-- 匹配所有方法 -->
|
|
|
|
|
+ <method template="private+ *(**)"/>
|
|
|
|
|
+ <!-- 匹配所有Get方法 -->
|
|
|
|
|
+ <method template="private+ get*(**)"/>
|
|
|
|
|
+ <!-- 匹配所有参数为String的方法,同时parameters="keep"会使方法的参数不会被混淆 -->
|
|
|
|
|
+ <method template="private+ *(java.lang.String)" parameters="keep"/>
|
|
|
|
|
+ </class>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 匹配序列化的类 -->
|
|
|
|
|
+ <class template="class * instanceof java.io.Serializable">
|
|
|
|
|
+ <field template="static final long serialVersionUID"/>
|
|
|
|
|
+ <method template="void writeObject(java.io.ObjectOutputStream)"/>
|
|
|
|
|
+ <method template="void readObject(java.io.ObjectInputStream)"/>
|
|
|
|
|
+ <method template="java.lang.Object writeReplace()"/>
|
|
|
|
|
+ <method template="java.lang.Object readResolve()"/>
|
|
|
|
|
+ </class>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 匹配所有applets -->
|
|
|
|
|
+ <class template="class * instanceof java.applet.Applet"/>
|
|
|
|
|
+ <!-- 匹配所有servlets -->
|
|
|
|
|
+ <class template="class * instanceof javax.servlet.Servlet"/>
|
|
|
|
|
+ <!-- 匹配所有 midlets -->
|
|
|
|
|
+ <class template="class * instanceof javax.microedition.midlet.MIDlet"/>
|
|
|
|
|
+ </keep-names>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- ignore-classes标签配置忽略混淆的类,被忽略混淆的类所引用的类和方法也不会被混淆 -->
|
|
|
|
|
+ <!-- ignore-classes的匹配规则和keep-names的匹配规则是一样的 -->
|
|
|
|
|
+ <ignore-classes>
|
|
|
|
|
+ <class template="class com.company.abc.*"/>
|
|
|
|
|
+ <class template="class com.company.xyz.SomeClass"/>
|
|
|
|
|
+ </ignore-classes>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- watermark标签是用来设置水印的标签的,它有key和value两个属性,不管jar是否混淆,都可以添加水印 -->
|
|
|
|
|
+ <!-- key必填,应用程序嵌入水印的密钥 -->
|
|
|
|
|
+ <!-- value必须,水印的具体类容,可以是版本、客户名称、公司名称等等,也可以通过额外的配置文件去配置-->
|
|
|
|
|
+ <watermark key="secure-key-to-extract-watermark" value="Customer: John Smith"/>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- expiry标签设置应用程序的过期时间,它有两个属性data、string -->
|
|
|
|
|
+ <!-- data到期日期,必填,yyyy/mm/dd格式 -->
|
|
|
|
|
+ <!-- string,必填,程序到期后的提示信息 -->
|
|
|
|
|
+ <expiry date="2017/01/01" string="EXPIRED!"/>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- property标签用来设置不同混淆处理的属性,它有两个属性,name和value-->
|
|
|
|
|
+ <!-- name为log-file的属性是日志文件,日志文件用来从混淆后的堆栈还原原始堆栈跟踪的,它保持对名称和行号的原始映射的混淆 -->
|
|
|
|
|
+ <!-- value 为日志文件名或路劲加文件名,不配置的话,日志就不会被创建-->
|
|
|
|
|
+ <property name="log-file" value="log.xml"/>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- random-seed随机种子,不设置的情况下,每次混淆出来的jar内容其实都是不一样的,这样每次重新打包无法分析差异,以及定位问题,随机种子就保证了同一应用程序可以输出相同的混淆jar,同一应用程序的不同版本我们应该使用不同的随机种子 -->
|
|
|
|
|
+ <!-- 随机种子的值可以是任何文本,默认值为当前时间的毫秒数 -->
|
|
|
|
|
+ <property name="random-seed" value="any text here"/>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- string-encryption, encryption虽然是加密的意思,但这里这个标签我觉得应该是string字符串比较的优化,可能会导致结果与源代码的不一致-->
|
|
|
|
|
+ <property name="string-encryption" value="enable"/>
|
|
|
|
|
+ <!-- 通过apply2class设置不同的加密类型应用于不同的类下的字符串,加密类型有三种:fast、strong、custom -->
|
|
|
|
|
+ <!-- fast,默认类型,Allatori将使用非常快速的字符串混淆算法 -->
|
|
|
|
|
+ <!-- strong,Allatori将使用强大而复杂的字符串混淆算法,但是这比较缓慢 -->
|
|
|
|
|
+ <!-- custom,Allatori将使用指定的字符串混淆算法 -->
|
|
|
|
|
+ <property name="string-encryption-type" value="strong" apply2class="class com.abc.*"/>
|
|
|
|
|
+ <!-- string-encryption-version 混淆字符串的算法版本,默认V4,V4和V3是不同算法思想,不代表V3过时 -->
|
|
|
|
|
+ <property name="string-encryption-version" value="v3"/>
|
|
|
|
|
+ <!-- string-encryption-ignored-strings 设置该文件中包含的字符串都不会被混淆 -->
|
|
|
|
|
+ <property name="string-encryption-ignored-strings" value="patterns.txt"/>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 通过apply2class启动或禁用控制流混淆处理,属性有enable 和 disable -->
|
|
|
|
|
+ <!-- enable默认属性,Allatori会修改方法的代码,但不会改变程序运行的行为,这会使得反编译更困难,同时使程序更小更快 -->
|
|
|
|
|
+ <property name="control-flow-obfuscation" value="disable" apply2class="class com.abc.*"/>
|
|
|
|
|
+ <!-- 配置指定的类使用控制流混淆处理,它有三种属性normal、disable、maximum -->
|
|
|
|
|
+ <!-- normal默认,Allatori默认混淆程序控制流,这会让程序更大更慢,Allatori也会尽量少的去转换-->
|
|
|
|
|
+ <!-- disable,禁用控制流混淆 -->
|
|
|
|
|
+ <!-- maximum,充分使用控制流混淆 -->
|
|
|
|
|
+ <property name="extensive-flow-obfuscation" value="maximum" apply2class="class com.abc.*"/>
|
|
|
|
|
+
|
|
|
|
|
+ <!-- 配置默认包的名称,如果某个包下的所有类都被重命名了,该包下的类就会被移动到这个默认包下,配置空字符会使得输出包变小 -->
|
|
|
|
|
+ <property name="default-package" value="com.company.product"/>
|
|
|
|
|
+ <!-- 是否强制将所有重命名的类移动到默认包下,默认disable -->
|
|
|
|
|
+ <!-- disable默认,只有包下所有的类重命名了才会移动到默认包下面,否则只有重命名了,类就会被移动到默认包下 -->
|
|
|
|
|
+ <property name="force-default-package" value="enable"/>
|
|
|
|
|
+ <!-- 包混淆命名规则,有abc、123、keep、customer四种 -->
|
|
|
|
|
+ <!-- abc/123,包名混淆会被命名为abc/123等等字符串或数字,默认abc -->
|
|
|
|
|
+ <!-- keep 维持包的原名字,即不混淆 -->
|
|
|
|
|
+ <!-- custom(filename.txt) 自定义,名字从配置的文件中取-->
|
|
|
|
|
+ <property name="packages-naming" value="abc"/>
|
|
|
|
|
+ <!-- 类名字的混淆规则 -->
|
|
|
|
|
+ <!-- compact默认,尽可能的使用单字符混淆类名,可能存在a和A的class -->
|
|
|
|
|
+ <!-- iii/abc/123 使用罗马数字/字符串/阿拉伯数字命名 -->
|
|
|
|
|
+ <!-- windows 使用windows上禁用的名称作为类名('con'、'prn'、'aux'、'nul'等)-->
|
|
|
|
|
+ <!-- custom(filename.txt) 自定义,从自定义文件中取-->
|
|
|
|
|
+ <!-- unique 类名的混淆唯一 -->
|
|
|
|
|
+ <!-- keep-$-sign 类名重命名保留java内部的命名符号$ -->
|
|
|
|
|
+ <property name="classes-naming" value="abc"/>
|
|
|
|
|
+ <!-- 方法名混淆命名规则,跟类名混淆类似,没有 keep-$-sign,多了real和keywords -->
|
|
|
|
|
+ <!-- real,方法名没被配置规则所重命名就会被命名为重命名方法 -->
|
|
|
|
|
+ <!-- keywords,使用java的保留字命名-->
|
|
|
|
|
+ <property name="methods-naming" value="keywords"/>
|
|
|
|
|
+ <!-- 属性混淆命名,同方法名一样的规则 -->
|
|
|
|
|
+ <property name="fields-naming" value="keywords"/>
|
|
|
|
|
+ <!-- 指定的字符串会作为所有重命名类、方法、属性的前缀 -->
|
|
|
|
|
+ <property name="classes-naming-prefix" value="c_"/>
|
|
|
|
|
+ <property name="methods-naming-prefix" value="m_"/>
|
|
|
|
|
+ <property name="fields-naming-prefix" value="f_"/>
|
|
|
|
|
+ <!-- optimize默认,局部变量名优化,减少局部变量名,尽量使用同一名称 -->
|
|
|
|
|
+ <!-- single-name,几乎所有的局部变量名使用同一名称-->
|
|
|
|
|
+ <!-- abc,局部变量名使用a/b/c等字符串-->
|
|
|
|
|
+ <!-- remove,删除原始的局部变量名-->
|
|
|
|
|
+ <!-- keep-parameters,参数名不变,局部变量名被重命名-->
|
|
|
|
|
+ <!-- keep 保留原局部变量,但不推荐-->
|
|
|
|
|
+ <property name="local-variables-naming" value="single-name"/>
|
|
|
|
|
+ <!-- disable默认,Allatori根据keep names规则执行类、方法和字段的重命名 -->
|
|
|
|
|
+ <!-- enable,不会重命名所有类、方法和字段。局部变量命名由局部变量命名属性单独控制。根据配置文件中的设置,将正常应用字符串加密、流混淆等-->
|
|
|
|
|
+ <property name="skip-renaming" value="enable"/>
|
|
|
|
|
+ <!-- 资源文件重命名,diable默认,不重命名 -->
|
|
|
|
|
+ <property name="update-resource-names" value="enable"/>
|
|
|
|
|
+ <!-- 指定资源文件内容的字符编码集 -->
|
|
|
|
|
+ <property name="update-resource-contents" value="enable" apply2file="*.xml"/>
|
|
|
|
|
+ <!-- 堆栈信息行号设置,obfuscate默认,堆栈信息行号也会被混淆,不过可以恢复-->
|
|
|
|
|
+ <!-- remove 移除堆栈信息行号,keep 保留原始堆栈信息行号-->
|
|
|
|
|
+ <property name="line-numbers" value="obfuscate"/>
|
|
|
|
|
+ <!-- keep 如果您使用反射来确定泛型类型,或者需要使用模糊化jar作为库来编译其他类,那么您需要保留泛型类型签名。 -->
|
|
|
|
|
+ <!-- remove 移除泛型 -->
|
|
|
|
|
+ <property name="generics" value="keep" apply2class="class com.abc.*"/>
|
|
|
|
|
+ <!-- Java内部类设置,keep默认混淆类的内部类会被保留 -->
|
|
|
|
|
+ <!-- remove 会移除信息属性和改变类结构-->
|
|
|
|
|
+ <property name="inner-classes" value="keep" apply2class="class com.abc.*"/>
|
|
|
|
|
+ <!-- Allatori将会混淆类内部的字段和方法的顺序,enable默认,random和enable相同会混淆顺序 -->
|
|
|
|
|
+ <!-- alphabetic字段和方法将会按照字母顺序排列,disable类内部的方法和属性顺序混淆不可用 -->
|
|
|
|
|
+ <property name="member-reorder" value="random" apply2class="class com.abc.*"/>
|
|
|
|
|
+ <!-- 设置进行类垃圾回收,disable默认,默认禁用类回收,enable 无子类的类将会被设置为final,这个设置仅用于独立应用程序 -->
|
|
|
|
|
+ <property name="finalize" value="enable"/>
|
|
|
|
|
+ <!-- Allatori将使用给定的标识符重命名方法和字段的名称,这会标记你的混淆文件,你可以用这些来标记你的演示版本 -->
|
|
|
|
|
+ <!-- 这个值会添加到'ALLATORI_DEMO_'后面作为你的演示版本的名称 -->
|
|
|
|
|
+ <property name="version-marker" value="THIS_IS_DEMO_VERSION"/>
|
|
|
|
|
+ <!-- 标记为复合的方法,private,all,package,protected,public,disable,根据权限来确定是否标记 -->
|
|
|
|
|
+ <property name="synthetize-methods" value="all" apply2class="class com.abc.*"/>
|
|
|
|
|
+ <!-- 标记为复合的属性,private,all,package,protected,public,disable,根据权限来确定是否标记 -->
|
|
|
|
|
+ <property name="synthetize-fields" value="all" apply2class="class com.abc.*"/>
|
|
|
|
|
+ <!-- 移除toString方法,disable默认不会移除,enable由于toString通常用于调试,故会删除toString方法 -->
|
|
|
|
|
+ <property name="remove-toString" value="enable" apply2class="class com.abc.*"/>
|
|
|
|
|
+ <!-- 移除指定方法的调用,可用于删除调试日志记录调用 -->
|
|
|
|
|
+ <property name="remove-calls" value="com.package.Logger.debug" apply2class="class com.abc.*"/>
|
|
|
|
|
+ <!-- 是否删除一些注释,可用于删除不必要的或者调试的注释 -->
|
|
|
|
|
+ <property name="remove-annotations" value="com.package.Annotation" apply2class="class com.abc.*"/>
|
|
|
|
|
+ <!-- 设置压缩级别,根据ZipOutputStream来的0不压缩,9最高压缩 -->
|
|
|
|
|
+ <property name="output-jar-compression-level" value="9"/>
|
|
|
|
|
+ <!-- 如果输入jar的同文件目录下包含了同名文件是否保留一个,remove默认保留一个 -->
|
|
|
|
|
+ <!-- Allatori允许同名文件的输出,但是java标准api不允许,所以你要设置JVM的‑‑illegal‑access=permit参数保留同名文件 -->
|
|
|
|
|
+ <property name="output-jar-duplicate-name-entries" value="keep"/>
|
|
|
|
|
+ <!-- 设置增量log文件,用来保证这次的混淆跟上次的混淆相同部分的一致性 -->
|
|
|
|
|
+ <property name="incremental-obfuscation" value="input-renaming-log.xml"/>
|
|
|
|
|
+ <!-- 同名方法混淆一致性的设置,disabled默认禁用,enable,同名方法和属性混淆后的名字和属性也是一致的 -->
|
|
|
|
|
+ <property name="unique-renaming" value="enable" apply2class="class com.abc.*"/>
|
|
|
|
|
+</config>
|
|
|
|
|
+```
|