有时候,当反编译Java代码时,反编译程序无法正确地对其进行反编译,最后输出中会出现少量字节码。
反编译器的缺点是什么?是否有将Java源代码编译成困难到反编译字节码的示例?
更新:
请注意,我知道利用这些信息在代码中隐藏秘密并不是一种安全的方法,将来可以改进反编译器。
尽管如此,我仍然感兴趣的是找出哪种类型的代码,狐狸,今天的反编译。
发布于 2009-07-20 08:18:57
任何通过混淆器的Java字节代码都会有来自反编译器的“荒谬”输出。另外,当您有其他语言(如Scala )编译为JVM字节码时,没有任何规则可以轻松地用Java表示字节代码,而且很可能不是。
随着时间的推移,反编译器必须跟上新的语言特性和它们生成的字节码,因此新的语言特性不容易被您使用的工具逆转是合理的。
编辑:作为.NET中的一个示例,下面的代码如下:
lock (this)
{
DoSomething();
}
为此汇编如下:
Monitor.Enter(this);
try
{
DoSomething();
}
catch
{
Monitor.Exit(this);
}
反编译程序必须知道,C# (与任何其他.NET语言相反)都有专门用于这两个调用的特殊语法。否则,您会得到意想不到的(冗长的)结果。
发布于 2009-07-20 08:28:03
JDBC 4驱动程序是DB2连接的经典。每件事都叫一个或两个字母的名字,不相关的代码,最终没有效果,等等。有一次,我试着去调试一个特别烦人的问题,结果基本上放弃了。我希望(但绝不相信)这是通过混淆器传递的,而不是代码实际上是这样的。
另一个最受欢迎的技巧(尽管我不记得产品)是重命名所有要从集合{'0','O','l','1'}
构建的对象,这使得阅读变得非常困难。
发布于 2009-09-04 04:04:15
假设您可以反编译回一种合理的源代码样式(您不能总是这样做),那么在不熟悉的问题域中操作的算法很难“反向工程”。如果您不了解快速傅立叶变换,那么如果您能够返回实现FFT蝴蝶的代码,那么这并不重要。(如果这个短语你不熟悉的话,如果我编码一个,我已经赢了。如果你对它很熟悉,那么你是一个相当好的工程师,可能对逆向工程代码没有任何兴趣)。你和朝鲜人的里程可能会不同。
https://stackoverflow.com/questions/1152261
复制相似问题