java 混淆字符串_Java逆向基础之ZKM字符串混淆与还原

为了防止静态分析,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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值