2017-08-04 137 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