混淆代码的堆栈跟踪显示未混淆的 class 名称?

Stacktrace of obfuscated code displays unobfuscated class name?

我正在使用 Minecraft 的服务器插件,它恰好被混淆了。 我一直认为,经过混淆后,不可能恢复原来的 class 名称,因为它们已被完全删除,这是我到处阅读的内容。 修修补补一段时间后,我注意到当控制台中出现未捕获的异常时,它会显示 classes 的混淆名称(例如 cratereloaded.aT.d),然后在括号内,其中它通常显示 class 的名称和违规行,它显示原始的 class 名称,这让我相信它实际上可以被反混淆。 但是在我尝试过的所有工具中,none 似乎能够恢复原来的 class 名称,即使经过一些十六进制检查我已经确认原来的 class 名称实际上是嵌入的在编译的“.class”文件中。

是否有任何工具可以使用它来自动恢复 class 名称?

示例堆栈跟踪:

[03:49:57] [Server thread/ERROR]: Error occurred while disabling CrateReloaded v1.3.97.1 (Is it up to date?)
java.lang.NullPointerException: null
    at cratereloaded.aT.d(CrateManager.java:303) ~[?:?]
    at cratereloaded.aT.bm(CrateManager.java:298) ~[?:?]
    at cratereloaded.aT.cleanup(CrateManager.java:83) ~[?:?]
    at cratereloaded.aX.disable(Manager.java:27) ~[?:?]
    at cratereloaded.b.cleanup(CrateReloaded.java:122) ~[?:?]
    at cratereloaded.b.onDisable(CrateReloaded.java:109) ~[?:?]
    at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:266) ~[spigot.jar:git-Spigot-596221b-2c5c611]
    at org.bukkit.plugin.java.JavaPluginLoader.disablePlugin(JavaPluginLoader.java:361) [spigot.jar:git-Spigot-596221b-2c5c611]
    at org.bukkit.plugin.SimplePluginManager.disablePlugin(SimplePluginManager.java:421) [spigot.jar:git-Spigot-596221b-2c5c611]
    at org.bukkit.plugin.SimplePluginManager.disablePlugins(SimplePluginManager.java:414) [spigot.jar:git-Spigot-596221b-2c5c611]
    at org.bukkit.craftbukkit.v1_12_R1.CraftServer.disablePlugins(CraftServer.java:342) [spigot.jar:git-Spigot-596221b-2c5c611]
    at net.minecraft.server.v1_12_R1.MinecraftServer.stop(MinecraftServer.java:464) [spigot.jar:git-Spigot-596221b-2c5c611]
    at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:612) [spigot.jar:git-Spigot-596221b-2c5c611]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_131]

我看了一下 CrateReloaded。看来,虽然代码已经 一头雾水,作者忘记去掉调试信息了。因此,你 在堆栈跟踪中看到了一些神奇的反混淆。

有几个独立的反编译器——CFR、Fernflower、JD-Core、JAD、 可用于将 JAR 反编译为接近源代码的 Procryon 等 质量。您还可以使用在线资源,例如 Decompilers online 创建来源。

如果你使用 Eclipse,我建议添加 Eclipse Class Decompiler 通过 Eclipse Marketplace 插件。这个插件支持上面提到的 反编译器并将即时解码 class 文件。例如,如果 CrateReloaded 作为常规依赖项或 Maven 依赖项包含在内,您可以 通过项目浏览器深入到 JAR。打开一个class 以反编译形式呈现它。更重要的是,这种反编译有效 当调试步骤进入混淆代码时自动执行。

但是,我强烈建议你不要依赖混淆Spigot/Bukkit 插件。

  • 这违反了 GPL。 Bukkit 是 GPL,使用 Bukkit 的代码是 分布式也是 GPL。因此,作者在保留对 代码,必须为其他人提供一种方法 ... 生成、安装和 运行 目标代码和修改工作,包括脚本来控制那些 activities. 有一些例外,比如作者开发代码 以混淆的形式而不是使用实用程序,或者考虑他们的工作 作为系统库。故意混淆代码发送错误消息, 特别是因为它只是因为许多其他人编写的代码才起作用,例如 Bukkit、Apache、Google 等。所有这些都是开源的。

  • 插件作者出于某种原因来来去去。我见过很多很棒的 插件变得陈旧是因为他们的作者失去了兴趣,找到了一份真正的工作,等等。 拥有可用的源代码,允许服务器操作员维护内部 他们的服务器和其他人的版本来收拾残局并继续 发展.

  • 尽管出于好意,插件代码的质量可能很低。谨慎的 服务器运营商将始终审查插件源代码以评估体验 作者和代码的质量。

  • 一些插件可能包含有意或无意的漏洞, 可能会危及服务器。拥有可用的源代码允许操作员 和社区审查代码。

  • 某些插件可能会受到 功能蠕变 的影响,并开始尝试做太多事情。 虽然可能需要插件的核心功能,但其他 wizbang、整洁、酷 随着时间的推移添加的功能可能会妨碍,需要更多配置,如果可能的话, 禁用不需要的功能。我们称之为 瑞士军刀综合症 。 在这种情况下,服务器运营商可以分叉他们自己的版本并更新代码 发布新服务器版本时需要。

显然,如果您的插件是为私人服务器设计的,那么私人服务器无法访问 public,其中一些担忧并不适用。但如果是,请 考虑一下。