是否有任何难以反编译的代码示例?

时间:2009-07-20 08:14:20

标签: java obfuscation decompiling

有时在反编译Java代码时,反编译器无法正确地对其进行反编译,并且最终会在输出中输入少量字节码。

反编译器有哪些缺点?是否有任何Java源代码编译成难以反编译的字节码?

更新

请注意,我知道利用这些信息并不是一种隐藏代码秘密的安全方法,并且将来可以改进反编译器。

尽管如此,我仍然有兴趣找出今天的反编译器代码类型。

6 个答案:

答案 0 :(得分:3)

任何通过混淆器的Java字节代码都会有来自反编译器的“荒谬”输出。此外,当您使用其他语言(如Scala)编译为JVM字节代码时,没有规则可以很容易地用Java表示字节代码,而且可能不是。

随着时间的推移,反编译器必须跟上新的语言功能和它们产生的字节代码,因此新的语言功能很难通过你正在使用的工具来反转。

编辑:以.NET为例,代码如下:

lock (this)
{
    DoSomething();
}

编译到:

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

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

答案 1 :(得分:3)

DB2 Connect的JDBC type-4驱动程序是经典的。一切都叫做一个或两个字母的名字,不相关的代码最终没有效果,等等。我曾试图调查一个特别恼人的问题并且基本上放弃了。我希望(但绝不自信)这是通过混淆器传递而不是实际看起来像这样的代码。

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

答案 2 :(得分:2)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

异常通常很难反编译。 但是,任何被混淆或用其他语言编写的代码都很难反编译。

BTW:你为什么想知道这个?

答案 5 :(得分:0)

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

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

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