Like Share Discussion Bookmark Smile

J.J. Huang   2021-09-16   天堂私服   瀏覽次數:

天堂私服 | IntelliJ IDEA 反編譯 Jar包

源起

在技術討論的論壇中,有位網名為「知識領域」的大大提到:

1
2
3
我在看IDEA的java反編譯插件 反編譯出來的內容會差很多嗎...
最主要是目前有的jar透過jd-gui反編譯也沒辦法用debug模式QQ
有些參數跟調用都被jd反編譯後換掉了...

後續與其討論,可以嘗試使用IDEA本身的反編譯試試看,所以才有了此篇文章。
另外幫「知識領域」推廣他的Discord的頻道:

1
2
熱愛天堂技術宅,有興趣協助測試請加入:
https://discord.gg/a6NHsm5sEH

在裡面可以協助幫忙測試,看到一些不一樣的遊戲內容。

問題

網路上充斥著多種的模擬器版本,但是多數是沒有提供原始碼僅提供了Jar檔,尤其是需要花費購買的版本。
但是遊戲內容常有一些Bug或是希望透過修改核心程式碼新增遊戲內容,這樣就無法自行處理。

這時候就需要使用反編譯的工具來將編譯過的class檔,反編回Java檔。

但是…每一套的反編譯結果並不是都是最好的,可能與真時的原始碼差異很多或是反編譯後的內容是有錯誤的。

工具

網路上Java的反編譯工具非常的多,這邊僅介紹兩款。

    1. Java Decompiler(簡稱:JD)
      在這邊使用的軟體為JD-GUI工具,只需要簡單的開啟Jar或是Class即可即時反編譯內容。
    1. Intellij IDEA
      本身IDEA是有反編譯插件,目前已經是預設安裝;只需要將Class檔案拖曳進去工作區就會即時反編譯。
      Jar檔的反編譯,需要透過指令來做反編譯的處理。

JD-GUI 使用教學

首先,我們進入下載Java Decompiler的官方網站:連結

  • 點擊JD-GUI旁的Download切換至下載區塊。
  • 選擇你的作業系統的任一下載點,這裡我以 Windows 示範。
  • 選擇後,便會開始下載。
  • 下載完畢後,ˋ將其解壓縮,直接執行jd-gui.exe使用。
  • 如果遇到執行時跳出A Java Exception has occurred.錯誤視窗。
  • 這是因為電腦的Java版本太高問題。
  • 可以使用以下指令開啟。
    1
    java -jar jd-gui.exe
  • 正常開啟後,可以直接將Class或是Jar檔做開啟,即會反編譯。
  • 如要將Jar檔的反編譯的全部另存。
  • 點擊FileSave All Sources,做另存即可。

IntelliJ IDEA 反編譯教學

開啟IntelliJ IDEA拖曳Class進入反編譯的部分就不在解說。
以下是要針對Jar檔的反編譯做教學。

  • 首先找到IntelliJ IDEA的安裝目錄。
  • 進入\plugins\java-decompiler\lib\找到java-decompiler.jar檔,並複製其檔案路徑。
    1
    "C:\Program Files\JetBrains\IntelliJ IDEA 2021.2\plugins\java-decompiler\lib\java-decompiler.jar"
  • 針對需要反編譯的模擬器Jar檔,也複製其檔案路徑。
    1
    "C:\IntelliJ-workspace\L1J-3.80c\l1jserver.jar"
  • 新建立一個反編譯後要目的的目錄。
  • 這邊建立DC_Temp
    1
    "C:\DC_Temp"
  • 組合反編譯的指令如下去替換三個參數。
  • 替換前
    1
    java -cp ${IDEA plugin decompiler.jar} org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true ${模擬器Jar檔} ${目的路徑}
  • 替換後
    1
    java -cp "C:\Program Files\JetBrains\IntelliJ IDEA 2021.2\plugins\java-decompiler\lib\java-decompiler.jar" org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler -dgs=true "C:\IntelliJ-workspace\L1J-3.80c\l1jserver.jar" "C:\DC_Temp"
  • 開啟命令提示字元輸入上方的指令,並執行。
  • 如有跳出Unsupported major.minor version 55.0錯誤訊息。
  • 這是表示使用的Java版本太低了,而version 55.0表示對應的版本。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # https://en.wikipedia.org/wiki/Java_class_file#General_layout
    Java SE 17 = 61 (0x3D hex)
    Java SE 16 = 60 (0x3C hex)
    Java SE 15 = 59 (0x3B hex)
    Java SE 14 = 58 (0x3A hex)
    Java SE 13 = 57 (0x39 hex)
    Java SE 12 = 56 (0x38 hex)
    Java SE 11 = 55 (0x37 hex)
    Java SE 10 = 54 (0x36 hex)
    Java SE 9 = 53 (0x35 hex)
    Java SE 8 = 52 (0x34 hex)
    Java SE 7 = 51 (0x33 hex)
    Java SE 6.0 = 50 (0x32 hex)
    Java SE 5.0 = 49 (0x31 hex)
    JDK 1.4 = 48 (0x30 hex)
    JDK 1.3 = 47 (0x2F hex)
    JDK 1.2 = 46 (0x2E hex)
    JDK 1.1 = 45 (0x2D hex)
  • 可見55 = Java 11,安裝Java 11後,再次即可正常執行。
  • 反編譯過程需要時間,請耐心等候。
  • 以下為反編譯完成後的畫面。
  • 進入反編譯後的目的目錄。
  • 可見於原來的模擬器核心一樣檔名的Jar檔。(請不要著急)
  • 反編譯後,他依舊是一個Jar檔,但透過解壓縮軟體解壓縮後,內部都已經是Java檔了。

結語

反編譯工具很多也不難使用,難在反編譯後的程式碼修正與除錯。
最後建議回顧一下首章天堂私服 | 天堂私服架設教學,了解其章結目錄,此處會不定時更新。

免責聲明

  • 本部落格文章中皆不提供任何所謂的遊戲「主程式」、「模擬器」、「登入器」…等等相關程式的下載點。
  • 本部落格文章中所見之遊戲主程式和服務器端程序均來自網路發佈,版本歸原作者所有
  • 本部落格文章為研究SQL資料庫與修改JAVA語法使用,非商業用途,亦無做營運事實等任何一切商業行為
  • 本部落格文章內容是為研究學習設計思想和原理為目的,絕沒有故意侵權或惡意抄襲、篡改其他遊戲內容

註:以上參考了
維基百科 - Java class file