什么是一个好的Java反编译器和反混淆器?


36

我使用JD-GUI来反编译Java JAR文件,但问题是它会留下很多错误,例如重复的变量,我必须修复自己并检查程序是否仍然有效(如果我正确地修正了错误)。

我也尝试过Fernflower,但是如果缺少依赖关系,会留下空白类。

我想知道哪些反编译:

  • 给出错误最少的
  • deobfuscates最。
  0

只是好奇,你期望一个deobfuscator将提供什么样的功能?除了手动重命名变量之外,我没有看到任何实际去混淆某些代码的方法。 04 4月. 132013-04-04 07:43:09

24

对于迟来的回复,我表示歉意。
我一直致力于开发新的开源Java decompiler。随时检查一下。
我没有对任何混淆代码进行测试,但我看到它反编译了许多JD-GUI无法处理的方法。请注意,这是一项正在进行的工作,我相信你会发现很多代码无法反编译。

+2

首先,他的反编译器是Procyon,你可以在其他答案中看到。其次,虽然我通常不愿意,“看看我的图书馆是这样做的!”答案,这在这里将是一个错误。上面链接到的Strobel的[readme](https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler)值得仔细阅读。这本身就是一个很好的答案,但对SE来说,可能有点太长了。 21 11月. 142014-11-21 19:36:20

+1

+10000这是一项非常棒的工作,它只是反编译了一个课程,我花了几个小时的时间试图在JD-GUI获得一半的时间后重建。 10 6月. 152015-06-10 04:24:31

  0

尽管我个人讨厌+1评论,但我不得不说,你已经有了一个很好的项目,帮助我在一个狭窄的地方。保持! 08 2月. 172017-02-08 00:12:34

  0

@Signus谢谢,我很高兴我的工作对你有用:)。 08 2月. 172017-02-08 15:12:26


9

我不能说这些是最好的,但有一些java反编译器在那里,如SO question所示。这些反编译器似乎都没有尝试积极处理混淆,并且许多这些项目都被放弃了。

我还没有试过Krakatau,但它听起来像它可能有助于你在找什么。

  • 自述:“喀拉喀托反编译器采用不同的方法对大多数的Java反编译 它可以被认为更象是一个编译器,其输入语言是Java字节码 ,其目标语言恰好是Java源代码。 .Krakatau采用 任意字节码,并试图将其转换为等效的Java代码。这个 使它对较小的混淆有鲁棒性,尽管它具有重构“原始”源的缺陷,导致可读输出比 模式匹配的反编译器会为未混淆的Java类生成。“
  • 这是开源的,似乎是积极的(截至撰写本文)维护。
+3

这实际上是反汇编器的输出。反编译器反编译为Java输出。 (P.S.我是开发人员) 15 4月. 132013-04-15 03:50:28

  0

JD-GUI是目前最好的Java反编译器之一,但它必须在反编译代码之前与Bytecode上的反混淆器一起使用。我所知道的Java最好的去混淆器来自http://www.rune-server.org或http://www.moparscape.org/smf或http://www.moparisthebest.org/smf,这些都是黑客攻击Runescape游戏的社区,它完全用Java编写并且高度混淆。 13 4月. 142014-04-13 07:38:21


0

我想推荐你AndroChef Java Decompiler AndroChef Java Decompiler成功反编译模糊的Java 6和Java 7 .class和.jar文件。

+9

注意ANDROCHEF! AndroChef只是废弃的fernflower反编译器的封装,不要浪费你的钱! 15 11月. 132013-11-15 15:41:55


2

首先,针对Fernflower问题修复了缺失类here。你可以对这个说声谢谢你的蘑菇。

现在,Fernflower仍然是最好的Java反编译器,甚至它最近几年没有维护。我最近试图联系作者,但仍然没有运气。

至于AndroChef Java Decompiler,它使用Fernflower作为引擎,得到作者的许可。仍然不确定如果它使用修补/修改版本或它只是一个GUI。

由@ mike-strobel开发的Procyon反编译器似乎很好,但Fernflower仍然具有巨大的优势,能够反编译我的应用程序(约3000类)的约95%,而procyon只能处理60% 2014年1月检查)。

  0

您的应用程序是“原生”Java还是从Android格式转换而来?如果是前者,我会非常感兴趣的是,让我的手掌握你的二进制文件,看看普罗西恩与费尔弗劳尔相比在哪里崩溃。 07 7月. 142014-07-07 14:26:43

  0

@MikeStrobel它是“本地”Java应用程序。 这只是内部使用,所以我无法分享它。 08 7月. 142014-07-08 10:42:24

+1

任何机会,你可以给我发一封电子邮件,描述你碰到什么样的问题?我一直渴望听到茜茜能如何改进。我的联系信息位于项目的BitBucket站点上。 08 7月. 142014-07-08 14:30:19

  0

@MikeStrobel感谢您的关注。 我会尽力为您提供扩展的信息和示例类,但没有承诺。 09 7月. 142014-07-09 11:26:32


2

尝试采取看看字节码阅读器https://github.com/Konloch/bytecode-viewer它采用5级不同的反编译器进行反编译选项:

  • FernFlower
  • 南河
  • CFR
  • 喀拉喀托
  • JD-GUI

8

个旧,缺乏条目

JAD 前一段时间,选择的每个人的反编译器是JAD。目前,该项目已经死亡(此外,它不是开源的),但你仍然看到很多人提到它。

Java DeObfuscator 另外一个来自fileoffset.com的较老的工具,但仍然可以或多或少地工作。该界面对于较大的项目来说非常笨重,但该工具是open source

JODE JODE是含有反编译和Java一个优化一个Java包。该软件包可在GNU GPL下免费获取。它还没有更新一段时间。

AndroChef 专有工具来反编译Android程序和Java文件,可用here。不值得给予替代品的钱,就像DJ Decompiler

Candle Brad Davis的开源反编译器。我提到它的完整性,但远离功能完整。

现代工具

JD桂 大概一个用于Java的编译使用最广泛的工具,因为它是易于使用,并且提供了一个图形用户界面,可以快速打开和检查一个类文件或JAR。你可以找到它over here

虽然没有开放源代码,但是它并不能反编译Java 8的特性,而且它们是现代的。

FernFlower 非常新和有前途的分析Java反编译器(成为IntelliJ 14的一个组成部分)。支持Java版本6(注释,泛型,枚举类型)。

Download from here

这是一个命令行工具。这个人可以用全名显示Unicode参数。

CFR

Free, but not open source。这一个旨在反编译现代Java功能,包括Java 8 lambda(前和后Java测试103更改),Java 7字符串开关等,虽然它本身是用Java 6编写的。

也是一个命令行工具。这个人做得更好,速度稍快。

南河

Open source,并且还旨在处理与Java 8层的功能(lambda表达式,::运算符)。需要运行Java 7。

Krakatau Krakatau很有趣,因为它是用Python编写的。它目前包含三个工具:用于Java类文件的反编译器和反汇编器以及用于创建类文件的汇编器。

尚不支持Java 8功能。

煤烟

煤烟是用于分析和转化Java和Android应用程序,最初由麦吉尔大学的研究黑貂集团开发的框架。它不是很常用的反编译器,因为它还定义了一种中间字节代码语言。

Konloch的字节码查看器

一种先进的轻质Java字节码阅读器,图形用户界面的Java反编译器,GUI字节码编辑器,GUI Smali,GUI Baksmali,GUI APK编辑器,GUI敏捷编辑器,GUI APK的反编译器,GUI DEX反编译, GUI Procyon Java反编译器,GUI Krakatau,GUI CFR Java反编译器,GUI FernFlower Java反编译器,GUI DEX2Jar,GUI Jar2DEX,GUI Jar-Jar,十六进制查看器,代码搜索器,调试器等。

完全用Java写的,它是open source

它采用FernFlower,南河和CFR进行反编译,使得这种使用状态的最先进的反编译一个真棒可视化工具:

A tool specifically geared for deobfuscation

原本用于反混淆的Minecraft版本。在内部使用Procyon。

有趣的是,我们注意到Java反编译器和去混淆器的很多努力都是围绕Minecraft这个用Java实现的最流行的游戏之一的改变场景的结果。

来源:http://blog.macuyiko.com/post/2015/a-quick-look-at-java-decompilers.html