Like Share Discussion Bookmark Smile

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

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

核心版本

  • L1J-3.80c

接續

上一章節遊戲帳號分析/Debug (二),針對創建帳號的部分做部份分析,尚有以下需要做分析。

  • C_AuthLogin.java內的69~104
  • 對應一下資料表欄位,稍做分析:
    • access_levle
    • online
    • banned
    • character_slot
    • warepassword
    • OnlineStatus

此章節針對C_AuthLogin.java內的69~104行做除錯(Debug)。

Debug

  • 首先針對69~104行程式碼進行除錯(Duebg)。
  • 初步觀看程式碼大概可以猜測:
    • 判斷密碼是否正確。
    • 帳號是否已經登入在線。
    • 帳號是否是被禁止使用的。
    • 帳號登入的動作,且會檢查是否有大於伺服器上線人數。
    • 更新帳號相關資訊,且回應客戶端OK
  • 以下除錯登入的帳號皆為:
    1
    2
    MoroseJJ
    12345678

  • 移除所有斷點。
  • 設定新的斷點於69737784
    1
    src/l1j/server/server/clientpackets/C_AuthLogin.java

  • 啟動天堂登入,登入帳號,並故意輸入錯誤的密碼。
  • 此時觀察第69行的判斷!account.validatePassword(password)IDE並沒有自動顯是判斷結果。

    註:這是因為裡面包了方法,還沒有執行到裡面的方法,無法知道結果。

  • 可以使用評估表達式Evaluate Expression來執行,但是不影響除錯模式。
  • 選取反白!account.validatePassword(password),在點選評估表達式Evaluate Expression按鈕。
  • 會開啟Evaluate視窗,Expression為你剛剛反白的程式碼;如果有錯誤可以編輯修改。
  • 此時點擊Evaluate按鈕,會看到他將程式碼的結果輸出,為true
  • 這樣可以知道會進入if`判斷式內。
  • Step Over:步過,成功進入if判斷式內。
  • 70行發送一個登入結果數據包給客戶端(登入結果 = 8)。
  • 然後到71Return就結束。
  • 此時使用Resume Program恢復程式,讓帳號繼續登入的步驟。
  • 可以看到登入畫面如下,已經被拒絕登入了。

  • 啟動天堂登入,登入帳號。
  • 過程中使用Resume Program恢復程式,讓帳號進入到遊戲。
  • 移除69行的斷點。
  • 此時再次啟動天堂登入,登入相同帳號。
  • 此時觀察第69行的判斷account.isOnlined()IDE並沒有自動顯是判斷結果。
  • 使用上方教學的評估表達式Evaluate Expression來執行。

    註:或是你要看account物件內的_online也可以知道結果。

  • 這樣可以知道會進入if`判斷式內。
  • Step Over:步過,成功進入if判斷式內。
  • 74行發送一個登入結果數據包給客戶端(登入結果 = 7)。
  • 然後到75Return就結束。
  • 此時使用Resume Program恢復程式,讓帳號繼續登入的步驟。
  • 可以看到登入畫面如下,提示已經有同樣的帳號,請重新輸入。

  • 進入資料庫。
  • accounts內找尋namemorosejj的資料。
  • 修改banned = 1
    執行下方SQL語法,修改資料。
    1
    UPDATE `accounts` SET `banned` = 1 WHERE `name` = `morosejj`;
  • 確認accounts中,morosejj的資料banned是否變更為1
  • 移除73行的斷點。
  • 啟動天堂登入,登入帳號。
  • 此時觀察第77行的判斷account.isBanned()IDE並沒有自動顯是判斷結果。
  • 使用評估表達式Evaluate Expression來執行。
  • 這樣可以知道會進入if`判斷式內。
  • Step Over:步過,成功進入if判斷式內。
  • 79行發送一個登入結果數據包給客戶端(登入結果 = 8)。
  • 然後到80Return就結束。
  • 此時使用Resume Program恢復程式,讓帳號繼續登入的步驟。
  • 可以看到登入畫面如下,提示已經有同樣的帳號,請重新輸入。
  • 最後不要忘記把帳號的banned改回為0
    1
    UPDATE `accounts` SET `banned` = 0 WHERE `name` = `morosejj`;

  • 移除77行的斷點。
  • 啟動天堂登入,登入帳號。
  • 此時觀察第84行程式碼,可以發現到有一個Login的方法。
  • 按注鍵盤的Ctrl + 滑鼠左箭點選Login方法,開啟到此方法位置。
  • 稍微觀察程式碼,可以知道這個方法在做:
    • 第一個判斷暫時不確定,先不理會。
    • 第二個判斷在判斷登入遊戲的總人數是否已經達到伺服器的設定的最大值。
    • 第三個判斷在判斷帳號是否已經登入,如果存在則踢掉在線的連線(後踢前)。

      註:如果有興趣去除錯這段程式碼,請直接下斷點,步過進入慢慢分析即可。

  • 85這段程式碼,可以發現到有一個updateLastActive的方法。
  • 按注鍵盤的Ctrl + 滑鼠左箭點選updateLastActive方法,開啟到此方法位置。
  • 注意到217行的SQL,可以知道做更新資料庫的accounts.lastactiveaccounts.ipaccounts.online三個欄位。
  • 8687行的程式碼,主要是將帳號寫入到客戶端的執行緒內,與回傳登入OK給客戶端。
  • 89亦可點入到方法位置,自行分析其程式碼;主要就是檢查人物是否達到七天刪除確認,並刪除人物資料。
  • 91行,又再次更新了一次資料庫的accounts.online欄位。

    註:這邊又在做一次,我覺得是當初沒寫好多做了。

  • 此時使用Resume Program恢復程式,讓帳號繼續登入的步驟。
  • 可以看到登入畫面如下,已經正常進入選擇角色畫面。

結論

  • 資料表:
    • accounts.online帳號是否在線。
    • accounts.banned帳號是否被禁止。
  • 程式碼:
    • src/l1j/server/server/clientpackets/C_AuthLogin.java
      • 69~72行:用於判斷密碼是否正確。
      • 73~76行:用於判斷是否已經登入在線。
      • 77~81行:用於判斷號是否為禁止。
      • 83~100行:正常登入步驟,更新帳號資訊,並夾雜了一些伺服器人數限制檢查和判斷角色刪除邏輯..等等。

結語

依舊算是滿詳細的一步一步分析,但是有些程式碼的部分,開始會慢慢僅大概說明其內容,不在一步一步帶著去做分析了。
主要是到這邊,相信已經有一定程度的程式基礎與了解除錯模式的使用方式了。

有部分的欄位或是程式碼,沒有特別分析或是找到其用途,可能是因為並沒有在這些程式中使用到,後面慢慢分析會了解其用途的。

而後面的文章將會慢慢著重在主要的資料表欄位用途確認,程式碼的部分也會是部分部分的提出來說明。

原創文章真的不易,希望多多支持,感謝。
最後建議回顧一下首章天堂私服 | 天堂私服架設教學,了解其章結目錄,此處會不定時更新。

免責聲明

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