为什么Java应用程序/小程序可以被反编译?

时间:2013-06-04 22:28:58

标签: java android applet reverse-engineering

我最近一直在研究一些Android应用程序,并且我的应用程序可以进行逆向工程而感到有点沮丧。我确实对我的代码提出了限制,但这只能到目前为止,一个才华横溢的开发人员可以很容易地解决这个问题。

无论如何,我的问题是,为什么Java应用程序会被反编译? Java设计的哪个部分允许其应用程序被反编译?

我的理解是Java应用程序部署了JIT编译,所以只有在它们用于提高效率之前才进行编译,这是正确的吗?我很想知道原因,

谢谢!

1 个答案:

答案 0 :(得分:3)

  

无论如何,我的问题是,为什么Java应用程序会被反编译?

任何语言的任何应用都可以反编译。对于在编译编程语言中具有一定编程经验的人来说,这应该是显而易见的。

编译器接受字节并创建表示同一组指令的不同字节集。反编译器接收字节并创建表示同一组指令的不同字节集。差别仅在于这些字节是什么。编译器获取(相对)人类可读的字节并创建(相对)机器可读的字节。反编译器反过来。

以及给定的反编译器如何能够完成其工作,但取决于编程语言和反编译器本身的实现。

对于像C这样的语言,编译器会为CPU生成机器指令。这些可以很容易地反编译成汇编语言,因为汇编程序指令非常接近1:1映射到机器指令。一个足够复杂的反编译器可以发出C作为输出,但可能不是C,这是很自然的写入。更重要的是,反编译输出将主要使用反编译器生成的函数和变量名称,除非编译的C代码具有调试符号,在这种情况下反编译器可能能够使用它们。

像Java这样的语言在概念上没有显着差异。虽然Java或Dalvik字节码用于VM而不是CPU,但基本方法是相同的。混淆有助于确保在生成的字节码中存在最少数量的人类可读符号,以降低任何反编译结果的易读性。此外,VM字节码到语言语句的映射往往比机器代码到C语句的映射更加接近,这使得编写反编译器更容易,使您更接近Java语法(例如,smali / baksmali)。 / p>

例如,解释反编译机器代码的难度是导致建议通过NDK将许可证管理逻辑移动到本机代码中。但是,这并不是说C编译器的结果根本无法反编译。