为了防止静态分析,ZMK在混淆时对输出的字符串使用对称加密方法进行加密
早期的ZKM只在静态代码块的时候进行简单的异或加密,后续版本使用了流加密技术进行二次加密
看一个简单的字符串输出例子package com.vvvtimes.main;
public class Main {
public static void main(String[] args) {
System.out.println("Hello");
System.out.println("World");
}
}
混淆反编译之后的代码//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.vvvtimes.main;
public class a {
public static int a;
public static int b;
private static String[] c;
private static String[] d;
public a() {
}
public static void main(String[] var0) {
int var10000 = b;
System.out.println(a(-7991, 8444));
int var1 = var10000;
System.out.println(a(-7992, -25829));
if (var1 != 0) {
int var2 = a;
++var2;
a = var2;
}
}
static {
String[] var5 = new String[2];
int var3 = 0;
String var2 = "\u0093íè[Í\u0005ükçÀú";
int var4 = var2.length();
char var1 = 5;
int var0 = -1;
boolean flag =true;
while(flag) {
char[] var10002;
label41: {
++var0;
char[] var10001 = var2.substring(var0, var0 + var1).toCharArray();
int var10003 = var10001.length;
int var6 = 0;
var10002 = var10001;
int var7 = var10003;
char[] var9;
int var10004;
if (var10003 <= 1) {
var9 = var10001;
var10004 = var6;
} else {
var10002 = var10001;
var7 = var10003;
if (var10003 <= var6) {
break label41;
}
var9 = var10001;
var10004 = var6;
}
while(true) {
char var10005 = var9[var10004];
byte var10006;
switch(var6 % 7) {
case 0:
var10006 = 116;
break;
case 1:
var10006 = 91;
break;
case 2:
var10006 = 57;
break;
case 3:
var10006 = 40;
break;
case 4:
var10006 = 121;
break;
case 5:
var10006 = 92;
break;
default:
var10006 = 118;
}
var9[var10004] = (char)(var10005 ^ var10006);
++var6;
if (var7 == 0) {
var10004 = var7;
var9 = var10002;
} else {
if (var7 <= var6) {
break;
}
var9 = var10002;
var10004 = var6;
}
}
}
String var11 = (new String(var10002)).intern();
var5[var3++] = var11;
if ((var0 += var1) >= var4) {
c = var5;
d = new String[2];
flag=false;
}else{
var1 = var2.charAt(var0);
}
}
}
private static String a(int var0, int var1) {
int var2 = (var0 ^ -7991) & '\uffff';
if (d[var2] == null) {
char[] var3 = c[var2].toCharArray();
short var10000;
switch(var3[0] & 255) {
case 0:
var10000 = 181;
break;
case 1:
var10000 = 149;
break;
case 2:
var10000 = 85;
break;
case 3:
var10000 = 171;
break;
case 4:
var10000 = 128;
break;
case 5:
var10000 = 103;
break;
case 6:
var10000 = 238;
break;
case 7:
var10000 = 159;
break;
case 8:
var10000 = 225;
break;
case 9:
var10000 = 234;
break;
case 10:
var10000 = 14;
break;
case 11:
var10000 = 200;
break;
case 12:
var10000 = 138;
break;
case 13:
var10000 = 205;
break;
case 14:
var10000 = 127;
break;
case 15:
var10000 = 50;
break;
case 16:
var10000 = 186;
break;
case 17:
var10000 = 169;
break;
ca