2009-07-20 84 views
3

有时,在反编译Java代码时,反编译器无法正确反编译它,并且输出中只有少量的字节码。是否有任何难以反编译的代码示例?

反编译器的缺点是什么?有没有编译成难以反编译的字节码的Java源代码的例子?

更新:

注意,我知道,利用这个信息是不是隐藏在代码中秘密安全的方式,以及反编译可以在将来得到改善。

尽管如此,我仍然有兴趣找出哪些代码狐狸今天是反编译的作物。

回答

0

Java在字节码中保存了大量信息(例如许多名称)。所以反编译相对容易。难以反编译的字节码大多是由难以读取源代码(所以这不是一个真正的选择)。如果你真的想混淆你的代码,使用混淆器,将所有方法和变量重命名为无法识别的东西。

3

任何通过混淆器的Java字节代码都会有反编译器的“荒谬”输出。另外,当你有像Scala这样的编译成JVM字节码的其他语言时,没有规则说明字节码很容易用Java代表,并且可能不是。

随着时间的推移,反编译器必须跟上新的语言特性和它们生成的字节代码,所以很有可能新语言特性不容易被你使用的工具逆转。

编辑:如在.NET,下面的代码的示例:

lock (this) 
{ 
    DoSomething(); 
} 

编译成这样:

Monitor.Enter(this); 
try 
{ 
    DoSomething(); 
} 
catch 
{ 
    Monitor.Exit(this); 
} 

的反编译器必须知道C#(相对于任何其他.NET语言)具有专门用于这两个调用的特殊语法。否则你会得到意想不到的结果(详细)。

+0

+1表示将Java代码反编译为Scala – Jorn 2009-07-20 08:22:28

0

异常往往难以反编译。 但是,任何被混淆或已经被写入另一种语言的代码都很难反编译。

顺便说一句:为什么你想知道这个?

3

DB2 Connect的JDBC类型4驱动程序是经典的。所有称为一个或两个字母的名称,不相关的代码最终无效,等等。我曾试着去调试一个特别恼人的问题,基本放弃了。我希望(但绝对没有把握)这是通过一个混淆器而不是实际看起来像这样的代码。

另一个最喜欢的技巧(虽然我不记得产品)是重新命名所有对象集{'0','O','l','1'},这使得阅读非常困难。

+0

我不熟悉您的设置符号。你可以扩展这个吗? – ojblass 2009-07-20 08:37:49

0

Java Bytecode并不直接与Java构造相对应,所以反编译意味着您知道某个Java字节码序列对应于Java代码构造。

用于反编译java字节码的Soot框架有很多这方面的信息,但是他们的网页现在已经关闭了。

http://www.sable.mcgill.ca/soot/

2

假设你可以反编译回源代码的合理的风格(你不能总是这样做),有什么难“反向工程”是在不熟悉的问题域操作算法。如果你不了解快速傅里叶变换,如果你能找回实现FFT蝶形码的代码,那么它并不重要。 (如果你对这个短语不熟悉,我已经赢了,如果我编码的话。如果是你熟悉的,你是一位非常优秀的工程师,可能对逆向工程代码没有任何兴趣)。 [您与朝鲜人的距离可能有所不同。]

相关问题