Allatori 字符串加密、破解分析

1、加密解密原理

混淆工具字符串加密的原理基本都是相同的,在混淆的使用进行加密,并且在Class类中会生成一个静态的解密方法,在使用到字符串的地方,调用解密方法解密,参数就是加密后的字符串。

2、代码示例

  • 强加密方式
    强加密方式会获取调用堆栈,在性能上会有些消耗。
1
<property name="string-encryption-type" value="strong"/>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static String ALLATORIxDEMO(String a)
{
StackTraceElement tmp16_15 = new RuntimeException().getStackTrace()[1];
1.0F;
int tmp64_61 = (a = (String)a).length();
int tmp68_67 = 1;
tmp68_67;
int i;
int ? = tmp68_67;
int n = tmp64_61;
int tmp78_74 = (i = new char[tmp64_61] - 1);
tmp78_74;
int k = 5 << 4 ^ 0x5;
tmp78_74;
int j;
int m = j = 4 << 3 ^ 0x3;
float f = 2.0F;
while ((i < 0 ? 1 : i) >= 0)
{
int tmp103_100 = (i--);
?[tmp103_100] = ((char)(k ^ a.charAt(tmp103_100) ^ f.charAt(j)));
((char)(n ^ a.charAt(i) ^ f.charAt(j)))[(i--)] = (j--);
if (j < 0) {
j = m;
}
}
return new String(?);
}
  • 快速加密方式
1
<property name="string-encryption-type" value="fast"/>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static String ALLATORIxDEMO(String a)
{
int tmp15_14 = 3;
int tmp28_25 = (a = (String)a).length();
int tmp32_31 = 1;
tmp32_31;
int j;
int ? = tmp32_31;
int k = tmp28_25;
int tmp42_38 = (j = new char[tmp28_25] - 1);
tmp42_38;
int i = tmp15_14 << tmp15_14 ^ 0x2;
((0x2 ^ 0x5) << 4);
if (tmp42_38 >= 0)
{
int tmp52_51 = j;
j--;
?[tmp52_51] = ((char)(a.charAt(tmp52_51) ^ i));
int tmp73_70 = (j--);
?[tmp73_70] = ((char)(a.charAt(tmp73_70) ^ k));
}
return new String(?);
}

3、字符加密注意事项

在上面的函数中返回的对象都是new String(?); 方式返回的,都会创建一个新的String对象。 在Java 中使用 name==”AAA” 使用可以判断字符串相等的,因为JVM对于字符串做了缓存,但是上面的函数会直接返回新的String,可以 == 就会出错,使用字符串加密,应该强制使用 equals 方法判断。
参考 http://www.allatori.com/doc.html#property-string-encryption

4、破解字符串加密方式

  • 还原解密方法
    代码混淆工具一般生成的解密的逻辑都是相同的,不同的类中使用不同的参数,把上上述的方法还原成可执行的方法,反编译每一个类获取中间参数,进行修改。反编译可以直接获取加密后的字符,直接调用方法解密。
  • 反射方式解密
    还原解密方法 使用起来比较麻烦,适合特定的class来解密,如果是一个大jar包,工作量太大。混淆工具在运行环境下属性的值一般就直接解密的了。

比如:

1
2
3
public class A{
public static String name = "Apptalking";
}

可以在运行环境下使用反射获取解密后的字符串内容。