2017-08-04 156 views
6

我正在使用一个用于Minecraft的服务器插件,它恰好被混淆了。 我一直认为,在混淆后,不可能恢复原来的类名,因为它们被完全删除了,这就是我到处读的东西。 经过一段时间的修改之后,我注意到当控制台中出现未捕获的异常时,它会显示类的混淆名称(例如。at cratereloaded.aT.d),然后在括号内,通常显示该类的名称和有问题的行,它显示了原来的类名,这使我相信它实际上可以被反混淆。 但是我尝试过的所有工具似乎都没有能够恢复原始类名,即使经过一些十六进制检查后,我已经确认原始类名实际上嵌入了已编译的'.class'文件中。Stacktrace的混淆代码显示未混淆的类名?

是否有任何工具能够使用它来自动恢复类名?

实例堆栈跟踪:

[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] 

回答

6

我看了看CrateReloaded。看来,尽管代码已被 混淆,作者忘记了删除调试信息。因此,你在堆栈跟踪中看到有点神奇的反混淆。

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

如果您使用Eclipse,我会建议通过Eclipse Marketplace添加Eclipse Class Decompiler 插件。这个插件支持上面提到的 反编译器,并且会即时解码类文件。例如,如果 CrateReloaded作为常规依赖项或Maven依赖项包含在内,则可以通过项目浏览器将 深入到JAR中。打开课程 呈现它的反编译形式。更重要的是,在将步骤调试到模糊代码时,此反编译会自动运行 。

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

  • 它违背了GPL。 Bukkit是GPL,使用Bukkit的代码是 也是GPL。因此,作者在保留 代码的所有权利的同时,必须为其他人提供一种手段,以便...生成,安装和运行目标代码并修改工作,包括控制这些活动的脚本。有一些例外情况,例如作者以混淆形式开发代码 而不是使用实用程序,或者将他们的作品作为系统库考虑为 。故意混淆的代码会发送错误的消息 ,尤其是因为它只是起作用,因为许多其他代码(如Bukkit,Apache,Google等)编写的代码都是开源的。

  • 插件作者出于某种原因出现或出于某种原因。我看到很多很棒的 插件过时了,因为他们的作者失去了兴趣,得到了一份真正的工作,等等。 源代码可用,允许服务器运营商维护内部版本 服务器和其他人收拾松弛和继续开发 。

  • 尽管最好的意图,插件代码可能是低质量的。谨慎的 服务器操作员会一直检查插件源代码以衡量作者的体验 以及代码的质量。

  • 一些插件可能包含有意或无意的漏洞, 可能会危害服务器。让源代码可用允许运营商 和社区仔细检查代码。

  • 一些插件可能会遭受功能蠕变并开始尝试做太多。 尽管可能需要插件的核心功能,但随着时间的推移,其他随着时间推移增加的功能可能会阻碍,如果可能的话,需要更多的配置, 禁用不需要的功能。我们称之为瑞士军刀综合征。 在这种情况下,服务器运营商可以将自己的版本和更新代码分配为新服务器版本发布时需要的 。

显然,如果你的插件是为不被 公众开放的私人服务器,其中一些问题是不适用的。但如果是这样,请 考虑它们。

+0

该插件的意图当然是一个私人服务器的一部分,虽然在提出这个问题时,我已经有一个工作,虽然哈克解决方案。 CrateReloaded的作者在指出其API的问题后与我联系,他很高兴地同意在未来的更新中公开更多插件的任务。 – XXLuigiMario

+0

优秀。我很高兴听到作者愿意提供符合GPL的代码。 – Frelling