您当前位置: 天堂123 > 天堂架設 > 模擬器遊戲帳號分析詳細說明

模擬器遊戲帳號分析詳細說明

2021/12/14

接續
上一章節遊戲帳號分析/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。
以下除錯登入的帳號皆為:
MoroseJJ
12345678
移除所有斷點。
設定新的斷點於69、73、77、84。
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)。
然後到71行Return就結束。
此時使用Resume Program恢復程式,讓帳號繼續登入的步驟。
可以看到登入畫面如下,已經被拒絕登入了。

啟動天堂登入,登入帳號。
過程中使用Resume Program恢復程式,讓帳號進入到遊戲。

移除69行的斷點。
此時再次啟動天堂登入,登入相同帳號。
此時觀察第69行的判斷account.isOnlined(),IDE並沒有自動顯是判斷結果。
使用上方教學的評估表達式Evaluate Expression來執行。
註:或是你要看account物件內的_online也可以知道結果。


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

進入資料庫。
於accounts內找尋name為morosejj的資料。
修改banned = 1。
執行下方SQL語法,修改資料。
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)。
然後到80行Return就結束。
此時使用Resume Program恢復程式,讓帳號繼續登入的步驟。
可以看到登入畫面如下,提示已經有同樣的帳號,請重新輸入。

最後不要忘記把帳號的banned改回為0。
UPDATE `accounts` SET `banned` = 0 WHERE `name` = `morosejj`;
移除77行的斷點。
啟動天堂登入,登入帳號。
此時觀察第84行程式碼,可以發現到有一個Login的方法。
按注鍵盤的Ctrl + 滑鼠左箭點選Login方法,開啟到此方法位置。
稍微觀察程式碼,可以知道這個方法在做:
第一個判斷暫時不確定,先不理會。
第二個判斷在判斷登入遊戲的總人數是否已經達到伺服器的設定的最大值。
第三個判斷在判斷帳號是否已經登入,如果存在則踢掉在線的連線(後踢前)。
註:如果有興趣去除錯這段程式碼,請直接下斷點,步過進入慢慢分析即可。


85這段程式碼,可以發現到有一個updateLastActive的方法。
按注鍵盤的Ctrl + 滑鼠左箭點選updateLastActive方法,開啟到此方法位置。
注意到217行的SQL,可以知道做更新資料庫的accounts.lastactive、accounts.ip、accounts.online三個欄位。

86與87行的程式碼,主要是將帳號寫入到客戶端的執行緒內,與回傳登入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行:正常登入步驟,更新帳號資訊,並夾雜了一些伺服器人數限制檢查和判斷角色刪除邏輯..等等。