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

XXL*_*rio 6 java obfuscation stack-trace bukkit

我正在使用Minecraft的服务器插件,它恰好被混淆了.我一直认为,在混淆之后,恢复原始的类名是不可能的,因为它们被完全删除了,这就是我到处读到的内容.在修改了一段时间之后,我注意到当控制台中出现未捕获的异常时,它会显示类的混淆名称(例如,在cratereloaded.aT.d中),然后在括号内,它通常显示名称在类和违规行中,它显示了原始的类名,这使我相信它实际上可以被反混淆.但是在我尝试的所有工具中,似乎没有人能够恢复原始的类名,即使经过一些十六进制检查后我已经确认原始的类名实际上嵌入在编译的".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]
Run Code Online (Sandbox Code Playgroud)

Fre*_*ing 6

我看了一下CrateReloaded.看起来虽然代码已被混淆,但作者忘记删除调试信息.因此,您在堆栈跟踪中看到了一些神奇的反混淆.

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

如果您使用Eclipse,我建议您 通过Eclipse Marketplace 添加Eclipse Class Decompiler插件.这个插件支持上面提到的反编译器,并将动态解码类文件.例如,如果将CrateReloaded包含为常规依赖项或Maven依赖项,则可以通过项目资源管理器深入查看JAR.打开一个类会以反编译的形式呈现它.更重要的是,当将调试步骤转换为混淆代码时,此反编译会自动生效.

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

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

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

  • 尽管有最好的意图,插件代码可能质量很低.谨慎的服务器操作员将始终查看插件源代码,以衡量作者的体验和代码的质量.

  • 某些插件可能包含可能危及服务器的有意或无意的漏洞.拥有源代码允许运营商和社区仔细检查代码.

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

显然,如果您的插件适用于公众无法访问的私人服务器,则其中一些问题不适用.但如果是的话,请考虑一下.