Like Share Discussion Bookmark Smile

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

天堂私服 | 遊戲帳號分析/Debug (一)「L1J版」

核心版本

  • L1J-TW_3.80c

分析

    1. 建立遊戲帳號:
    • 啟動模擬器。
    • 啟動登入器,登入遊戲。
    • 輸入一個全新的帳號/密碼,並登入。
      1
      2
      MoroseJJ
      12345678
    • 進入到建立人物畫面。(不用建立人物)
    • 此時就會建立一個遊戲帳號在此資料庫中。
  • 2.分析資料表:

    • 在資料庫中,先觀察所有的表名,會發現一個accounts的表名(accounts = 帳戶),點進去看資料如下圖。
    • 對應一下資料表欄位,稍做分析:
      • login = 帳號。
      • password = 密碼。
      • lastactive = 最後登錄時間。
      • access_levle = 不清楚。
      • ip = 登入的IP
      • host = 不清楚。
      • online = 不清楚。
      • banned = 不清楚。
      • character_slot = 不清楚。
      • warepassword = 不清楚。
      • OnlineStatus = 不清楚。
    • 會發現滿多的欄位不一定可以透過翻譯確切的知道他的功能,就算翻譯過來有時候也不一定正確。
    • 這時候就是在去分析程式碼,看可不可以反向去推出欄位用途。
  • 3.分析程式碼:

    • 根據猜測accounts為表名,那透過此關鍵字去找尋程式碼,基本上也可以找到相對應的程式。
    • 這邊使用Ctrl + Shift + F,搜尋。
    • 輸入accounts,找尋到有在INSERT INTO此張表的語法程式,發現下面這支程式。
      1
      src/l1j/server/server/Account.java
    • 開啟後分析程式碼。
    • 這邊先關注程式碼的部分130~139行。
    • 可以注意到帶入到SQL裡面的值,都是從account這個物件取得的;像是程式碼的account.name 對應資料表欄位 accounts.login
    • 再關注程式碼的部分119~125行。
    • 可以看到這邊先建立了一個Account的物件,名為account
    • 然後在這物件裡面塞入值,而這些值除了124125行以外的,都是透過方法參入傳入的。

    • 這時候其實可以去看一下Account物件裡面定義的變數,基本上變數都會對應資料表的欄位,好的工程師是會將註解寫好的…
    • Ctrl鍵壓住,再左鍵點擊Account即會開啟此物件。
    • 到這邊已經看到所有欄位對應的用途,還需要分析嗎?

    • 再關注程式碼的部分114行。
    • 注意到此方法名稱為create建立的意思,方法參數為namerawPasswordiphost
    • 所以需要支到呼叫此方法的有幾個地方,帶來的參數值又是如何取得?
    • 在方法create上,按下右鍵並選擇Find Usages
    • 下方會彈出此所有使用此方法的清單
    • 剛好只有一個地方,我們點擊將其開啟在工作區。
    • 這時候會開啟C_AuthLogin.java
      1
      src/l1j/server/server/clientpackets/C_AuthLogin.java
    • 關注程式碼的部分64行。
    • 會發現後面帶入的參數,都是由45~48行來的。

      註:這邊就不在追4546行的readS()這邊的參數由來,怕我繼續深入分析下去;一是講太多,二是怕你在這就放棄了…。

    • C_AuthLogin.java45行設定斷點。
    • Account.java119行設定斷點。

Debug

  • 使用IDE除錯模式來啟動模擬器。
  • 準備完畢後,啟動登入器,登入遊戲。
  • 輸入一個全新的帳號/密碼,並登入。
    1
    2
    Morose
    12345678
  • 接續會跳轉回IDE斷點在C_AuthLogin.java45行的位置。
  • 此時可以觀察accounts資料表內是否已經有Morose的帳號資料?(是沒有的,因為尚未INSERT INTO寫入)
  • 回到IDE,開始使用Step Over:步過,一步一步觀察45~48行來的參數值。
    • accountName = morose
    • password = 12345678
    • ip = 127.0.0.1
    • host = 127.0.0.1
  • 到達第61行,可以發現是呼叫Account.load()的方法,帶入參數為accountName = morose
  • Ctrl鍵壓住,再左鍵點擊load方法即會開啟跳轉到物件與方法位置。
  • 關注到172SQL
  • SQL語法主要是為了找尋是否有name也就是帳號為morose的資料。
  • 這邊就不做斷點並分析,語法不難。
  • 點擊除錯按鈕Show Execution Point,回到剛剛的位置。
  • 因為資料庫確時還沒此帳號資料,所以可以肯定回傳的參數為null,即表示account = null
  • 62if判斷,這邊的邏輯是在說當沒有這個帳號的時候,要進行的行為,反之有此帳號就不做這些行為。
  • 63是取得Config裡面的設定Config.AUTO_CREATE_ACCOUNTS是否要自動建立帳號,這邊可以看到值為True

    註:關於Config的部分,後面會再介紹,這邊先知道有這些參數即可。

  • 一路Step Over:步過到64後,再次Step Over:步過,就會跳轉到Account.java119行設定斷點。
  • 這邊就不在分析,主要就是在accounts表內新增一筆帳號資料。
  • Step Out:步出,讓這個方法執行完畢,會再跳回剛剛進入的位置。
  • 跳回C_AuthLogin.java64行的位置。
  • 此時可以觀察accounts資料表內是否已經有Morose的帳號資料?(是有的)
  • 到此基本上基礎的東西已經除錯(Duebg)完畢。
  • 至於的C_AuthLogin.java內的51~59行與69~104行,這個放到下一章節在做詳細分析。

結論

  • 資料表:
    • accounts建立遊戲帳號後儲存帳號資訊。
    • accounts.name儲存遊戲帳號資訊的帳號。
    • accounts.password儲存遊戲密碼的資訊。(加密過)
    • accounts.lastactive最後登錄時間。
    • accounts.ip建立帳號時所使用的客戶端IP
    • accounts.host建立帳號時所使用的客戶端Host
  • 程式碼:
    • src/l1j/server/server/Account.java用於對應遊戲帳號表的變數與方法。
    • src/l1j/server/server/clientpackets/C_AuthLogin.java處理客戶端登入的請求、判斷帳號、建立帳號..等等主要邏輯。
  • 設定檔:
    • server.properties
      1
      2
      3
      4
      5
      #是否再登入畫面即可創建帳號 True=是 False=否
      #如果需要變更:
      # 可使用的選項: "True" - "False", 使用這選項可選擇帳號是否被自動創建
      # 自動創建或者手動. 如果要手動(false), 你必須在data資料夾內新增 logins.txt 的文件
      AutoCreateAccounts = true

結語

分析程式碼本就不容易,況且要分析到幾乎是手把手一步一步帶著看,真的是非常花費時間和精神。
希望透過這樣的分析,可以帶給新手們更多的信心慢慢學習程式。

這邊沒有用動態圖來做講解,是因為要說明的很詳細所以動態圖不適合。且動態圖會太長太大,造成網頁讀取過慢,使用者體驗很差。
原創文章真的不易,希望多多支持,感謝。
最後建議回顧一下首章天堂私服 | 天堂私服架設教學,了解其章結目錄,此處會不定時更新。

免責聲明

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