Java 有人能解释一下为防止字节码被直接反编译而进行的字节码修改吗?

Java 有人能解释一下为防止字节码被直接反编译而进行的字节码修改吗?,java,obfuscation,bytecode,Java,Obfuscation,Bytecode,有谁能向我解释一下,为了防止将以下字节码反编译为有效的java源代码,对其执行了哪些字节码修改 0: aload_0 1: invokevirtual 102 java/lang/String:toCharArray ()[C 4: dup 5: arraylength 6: iconst_2 7: if_icmpge +12 -> 19 10: dup 11: iconst_0 12: dup2 13: caload 14: bipush 33 16: ixor 17: i2

有谁能向我解释一下,为了防止将以下字节码反编译为有效的java源代码,对其执行了哪些字节码修改

0: aload_0
1: invokevirtual 102    java/lang/String:toCharArray    ()[C
4: dup
5: arraylength
6: iconst_2
7: if_icmpge +12 -> 19
10: dup
11: iconst_0
12: dup2
13: caload
14: bipush 33
16: ixor
17: i2c
18: castore
19: areturn
这个字节码是从一个用zkm模糊处理的类中删除的。

看起来它很容易被反编译。所能做的就是混淆字节码,使其更难反编译…这只适用于比代码看起来更复杂的代码

事实上,这可能是手动反编译的,只需看几分钟就可以了…

这看起来很容易反编译。所能做的就是混淆字节码,使其更难反编译…这只适用于比代码看起来更复杂的代码


事实上,这可能是手动反编译的,只需看几分钟就可以了…

看起来原始代码是这样的:

char[] mystery_method(String s) {
   char[] r = s.toCharArray();
   if (r.length < 2) {
       r[0] ^= 33;
   }
   return r;
}
char[]神秘法(字符串s){
char[]r=s.toCharArray();
如果(r.长度<2){
r[0]^=33;
}
返回r;
}

我不认为字节码有什么特别棘手的地方会给反编译器带来麻烦。

看起来原始代码是这样的:

char[] mystery_method(String s) {
   char[] r = s.toCharArray();
   if (r.length < 2) {
       r[0] ^= 33;
   }
   return r;
}
char[]神秘法(字符串s){
char[]r=s.toCharArray();
如果(r.长度<2){
r[0]^=33;
}
返回r;
}


我不认为字节码有什么特别棘手的地方会给反编译器带来麻烦。

大多数时候,优化阶段会阻止您正确反编译整个.class文件。好吧,至少让它复杂得多,因为合并了类似的代码路径。您可能会得到一堆(伪)goto,这在java中是无法使用的。

大多数情况下,优化阶段会阻止您正确地反编译整个.class文件。好吧,至少让它复杂得多,因为合并了类似的代码路径。您可能会得到一堆(伪)goto,而这些goto不能在java中使用。

总是有可能是直接以字节码的形式编写的,而不是从java源代码(或其他JVM语言)编译,然后进行模糊处理……您是如何确定它不能反编译为有效的java源代码的?你怎么知道这是混淆的结果?你用的是哪种反编译器?无法保证任何给定的反编译器都能够理解编译器中所有可能的字节码输出。我测试过的反编译器都无法为其生成有效的输出。我知道它被混淆了,因为它是ZKM字符串混淆的一部分。至于我使用的主要反编译器,那是JD Gui,但它不是我测试的唯一反编译器。它总是有可能直接以字节码的形式编写,而不是从Java源代码(或其他JVM语言)编译,然后进行模糊处理……您如何确定它不能反编译为有效的Java源代码?你怎么知道这是混淆的结果?你用的是哪种反编译器?无法保证任何给定的反编译器都能够理解编译器中所有可能的字节码输出。我测试过的反编译器都无法为其生成有效的输出。我知道它被混淆了,因为它是ZKM字符串混淆的一部分。至于我使用的主要反编译器,那是JDGUI,但它不是我用来测试的唯一一个。关键是,没有一个。没有任何东西阻止直接反编译,除了可能它不是完整的
.class
文件的一部分这一事实。好吧……那么没有任何东西阻止该类被反编译。你试过使用反编译器吗?你能提供更多细节吗?你说的“有效”是什么意思?关键是没有一个。没有任何东西阻止直接反编译,除了可能它不是完整的
.class
文件的一部分这一事实。好吧……那么没有任何东西阻止该类被反编译。你试过使用反编译器吗?你能提供更多细节吗?你说的“有效”是什么意思?你似乎认为有人故意修改。我想没有。也许你的编译器比你的反编译器更聪明。你似乎认为有一些故意的修改。我想没有。也许你的编译器比你的反编译器更聪明。