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

时间:2017-08-04 14:23:26

标签: 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]

1 个答案:

答案 0 :(得分:6)

我看了一下CrateReloaded。似乎虽然代码已经存在 模糊不清,作者忘了删除调试信息。因此,你 正在看到堆栈跟踪中有些神奇的反混淆。

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

如果您使用Eclipse,我建议您添加Eclipse Class Decompiler 通过Eclipse Marketplace插件。这个插件支持上面提到的 反编译器将动态解码类文件。例如,如果 可以将CrateReloaded包含为常规依赖项或Maven依赖项 通过项目资源管理器深入研究JAR。开课 以反编译形式呈现它。更重要的是,这种反编译工作 在调试混淆代码的步骤时自动执行。

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

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

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

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

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

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

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