2013-06-04 135 views
-2

我最近一直在研究一些Android应用程序,并且稍微感到沮丧,因为我的应用程序可能被反向设计。我确实隐瞒了我的代码,但这只能走得太远,才华横溢的开发人员可以轻松避开晦涩难懂的事情。为什么Java应用程序/ applet可以反编译?

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

我的理解是,Java应用程序的部署JIT编译,所以它们被用于高效的目的之前,他们只是编译,这是正确的?我很想知道原因,

谢谢!

+6

这不是理由。任何编译语言都可以反编译。如果A + B = C,C-B = A。 – Simon

+2

如果Java类*无法反编译,那么VM *如何运行它? (即使编译为ML的代码也必须由CPU理解*)。请注意,模糊处理与编译不同:模糊处理旨在为人类(即标识符/代码重新编译)设置反编译的编译输出*不那么友好。机器不关心 - 也不会有人真的想看到*如何完成某件事情。 – user2246674

+0

那么为什么不能为iOS应用程序做同样的事情呢? – rusty009

回答

3

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

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

甲编译器采用的字节,并创建一组不同的字节表示同一指令集。反编译器需要字节并创建一组不同的字节来表示相同的指令集。区别仅在于那些字节是什么。编译器需要(相对)人类可读的字节,并创建(相对)机器可读的字节。反编译器做相反的事情。

如何以及一个给定的反编译器可以做自己的工作,不过,依赖于编程语言和反编译器本身的实现。

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

Java这样的语言在概念上没有明显的不同。虽然Java或Dalvik字节码是针对虚拟机而不是CPU,但基本方法是相同的。混淆有助于确保生成的字节码中存在最小数量的人类可读符号,从而减少反编译结果的易读性。此外,VM字节码到语言语句的映射往往比机器代码到C语句的映射要近得多,这使得编写一个反编译器更容易,使您更接近Java语法(例如,smali/baksmali)。例如,解释反编译的机器代码的困难程度导致建议将许可证管理逻辑通过NDK移动到本机代码中。但是,这并不是说C编译器的结果根本无法反编译。

+1

这是一件很有意思的事情,那就是为了使本机运行的代码无法反编译和理解,几乎没有什么可以完成的。如果你真的不希望某人能够理解应用程序背后的逻辑,唯一要做的就是不要分发该代码(在服务器上运行它并使用RESTful API或其他)。即使硬件也不能抵抗反编译(反向工程),因为总会有人有足够的智能去完成产品,并弄清楚它是如何构建的。实际上,这是低效的。 – LucienK

+0

@Dazedy:“如果你真的不想让别人能够理解应用程序背后的逻辑,唯一要做的就是不要分发这些代码” - 同意了。数据也是如此:如果您不希望用户访问“您的”数据,请不要将其放在设备上。 – CommonsWare

+0

安全/数据泄露的主要原因之一是信息被置于不安全的环境中。 IE:无论您将多少个密码放在笔记本电脑上,如果晚上离开门廊,都有可能会有人接受。由于事物相互关联的方式,信息更加难以小心。 – LucienK

相关问题