反编译和执行Java代码的区别
Difference between decompiling and executing Java code
正如问题所述,反编译代码和执行代码的过程之间是否存在主要区别。我知道反编译使用反射,并且在某些时候使用缓冲 reader 或某种类型的 reader,因为 Oracle 已经记录了 class 二进制文件的结构。正常执行代码时,它是否也在 android 和 java 中使用反射。
如果是这种情况,那么如果反编译器不成功,那么代码也应该不会 运行(因为它们遵循相同的程序)?
除非在执行代码时它只获取有关调用的方法的信息,而不是整个 class ?
我也注意到有些不能编译的东西还是可以正常运行,如果手动编辑反编译成
class A extends A {...} //will run without any problem if manually edited
编辑1:
最近在尝试一些东西时,我从反编译代码中得到了这个结果,但是代码失败了 运行 因为代码是这样的
private static String voidFunction() {
final int a = -1;
final int b = a * -1;
int c = (int)Math.pow(a, b);
c *= new Random().nextInt(200);
(new short[4])[0] = 48;
true; // code on it's own
-1; //missing return statement
}
它们都处理中间字节码,但肯定是完全不同的过程。反编译将从 class 文件中获取字节码并尝试重构纯文本 java 源代码。虚拟机通过在运行时将字节码编译为计算机可以处理的机器级代码来执行字节码。因此,它们共享相同的源material、字节码,但动机和过程却完全不同。反编译从机器层面转向人类程序员,而编译则从人类程序员转向机器。
的开头有对这些过程和字节码的有用解释
好吧,我尝试了一个简单的测试,并且能够轻松创建一个应用程序,由于 Java 应用程序的工作方式的性质,该应用程序无法使用任何反编译器进行反编译,但是应用程序 运行'在所有 OS 上都很好。另一方面,如果黑客或分析人员知道我使用的方法,则可以轻松创建反编译器来破解此应用程序。
因此,为了回答我自己的问题,反编译器和 运行ning 应用程序采用不同的路径,否则应用程序将永远不会 运行。我很惊讶他们在互联网上对此一无所知。
正如问题所述,反编译代码和执行代码的过程之间是否存在主要区别。我知道反编译使用反射,并且在某些时候使用缓冲 reader 或某种类型的 reader,因为 Oracle 已经记录了 class 二进制文件的结构。正常执行代码时,它是否也在 android 和 java 中使用反射。
如果是这种情况,那么如果反编译器不成功,那么代码也应该不会 运行(因为它们遵循相同的程序)?
除非在执行代码时它只获取有关调用的方法的信息,而不是整个 class ?
我也注意到有些不能编译的东西还是可以正常运行,如果手动编辑反编译成
class A extends A {...} //will run without any problem if manually edited
编辑1: 最近在尝试一些东西时,我从反编译代码中得到了这个结果,但是代码失败了 运行 因为代码是这样的
private static String voidFunction() {
final int a = -1;
final int b = a * -1;
int c = (int)Math.pow(a, b);
c *= new Random().nextInt(200);
(new short[4])[0] = 48;
true; // code on it's own
-1; //missing return statement
}
它们都处理中间字节码,但肯定是完全不同的过程。反编译将从 class 文件中获取字节码并尝试重构纯文本 java 源代码。虚拟机通过在运行时将字节码编译为计算机可以处理的机器级代码来执行字节码。因此,它们共享相同的源material、字节码,但动机和过程却完全不同。反编译从机器层面转向人类程序员,而编译则从人类程序员转向机器。
的开头有对这些过程和字节码的有用解释好吧,我尝试了一个简单的测试,并且能够轻松创建一个应用程序,由于 Java 应用程序的工作方式的性质,该应用程序无法使用任何反编译器进行反编译,但是应用程序 运行'在所有 OS 上都很好。另一方面,如果黑客或分析人员知道我使用的方法,则可以轻松创建反编译器来破解此应用程序。
因此,为了回答我自己的问题,反编译器和 运行ning 应用程序采用不同的路径,否则应用程序将永远不会 运行。我很惊讶他们在互联网上对此一无所知。