Java 字符串反混淆

问题描述 投票:0回答:1

我是 Java 新手,希望有人能帮我解释一个问题。我正在关注这篇博文,其中介绍了恶意 Android APK 文件的逆向工程。

在反编译的Java代码中,有一个字符串混淆方法在代码中出现了数千次:

private static String $(int i, int i2, int i3) {
    char[] cArr = new char[i2 - i];
    for (int i4 = 0; i4 < i2 - i; i4++) {
        cArr[i4] = (char) ($[i + i4] ^ i3);
    }
    return new String(cArr);
}

代码中还有似乎使用此方法的调用,例如

$(556, 664, 4277)

我无法对字符串进行反混淆。我知道我可以定义一个本地范围的变量并使用它来打印解码后的字符串,但我不确定这在 Java 中会是什么样子。谁能提供一个例子来说明它的外观吗?

我确信我的尝试是错误的。我现在有动力真正学习 Java,但我真的很想了解我做错了什么:

public static String $(int i, int i2, int i3) {
    char[] cArr = new char[i2 - i];
    for (int i4 = 0; i4 < i2 - i; i4++) {
        cArr[i4] = (char) ($[i + i4] ^ i3);
    }
    return new String(cArr);
}

var obfuscatedString = $(556, 664, 4277);
System.out.println(obfuscatedString);
java android obfuscation malware
1个回答
0
投票

我认为拥有一个代码版本可能会有所帮助,其中参数和变量具有更好的名称,更容易理解。反编译器只是将

i
i2
等毫无意义的名称分配给所有
int
变量。

private static String $(int start, int end, int xor) {
    int length = end - start;
    char[] chars = new char[length];
    for (int i = 0; i < length; i++) {
        chars[i] = (char) ($[start + i] ^ xor);
    }
    return new String(chars);
}

我正在将其设为社区维基。如果您觉得该方法可以变得更具可读性,请随时进行编辑。我引入了一个临时变量

length
,但我将方法的名称保留为
$
,将反混淆的外部 char 数组保留为
$
,因为这些符号是从外部引用的,因此需要保留如果重写的方法替换原来的方法,也是一样的。

© www.soinside.com 2019 - 2024. All rights reserved.