正如问题所述,反编译代码和执行过程之间存在任何主要区别。我知道反编译使用反射,并且在某些时候使用缓冲读取器或某种类型的读取器,因为Oracle已经记录了类二进制文件的结构。在正常执行代码时,它是否也在android和java中都使用反射。
如果是这种情况那么情况应该是如果反编译器不成功那么代码也不会运行(因为它们遵循相同的程序)?
除非在执行代码时,它只获取有关所调用方法的信息而不是整个类?
我还注意到,如果手动编辑,无法编译的内容仍然可以正常运行并反编译。
class A extends A {...} //will run without any problem if manually edited
EDIT1: 最近在尝试某些东西时,我从反编译的代码中得到了这个结果,但是代码无法运行,因为代码就像这样
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
}
答案 0 :(得分:0)
它们都处理中间字节码,但肯定是完全不同的过程。反编译会从类文件中获取字节码,并尝试重新构建纯文本java源代码。虚拟机通过在运行时将其编译为计算机可以处理的机器级代码来执行字节码。因此,它们共享相同的源材料,字节码,但具有完全不同的动机和过程。反编译从机器级别移向人类程序员并编译进一步远离人类程序员朝向机器。
开头的这些过程和字节码有一个有用的解释答案 1 :(得分:0)
我尝试了一个简单的测试,并且能够轻松创建一个无法使用任何反编译器反编译的应用程序,因为Java应用程序的工作原理,但应用程序在所有操作系统上运行完全正常。另一方面,如果黑客或分析人员知道我使用的方法可以很容易地创建一个反编译器来破解这个应用程序。
因此,为了回答我自己的问题,反编译器和运行应用程序采用不同的路径,否则应用程序永远不会运行。我很惊讶他们在互联网上没有这个。