您当前位置: 天堂123 > 天堂架設 > 私服模擬器一般指令詳細分析

私服模擬器一般指令詳細分析

2022/6/13

在開始分析前,要知道GM指令的指令效果與使用方式,才方便開啟除錯(Debug)進行分析。

效果:顯示在線用戶數。
範例:

.who
.who all
而一般指令是:

/who
/who ${角色名稱}
1.分析資料表:

先進入commands表,找到who線上人數的指令。
class_name是L1Who。

2.分析程式碼:

透過搜尋L1Who開啟程式碼。
src/l1j/server/server/command/executor/L1Who.java

開啟後分析程式碼。
35將現在在線的人資料放入Collection。
36取得目前在線人數的數量。
37~38建立S_WhoAmount將在線人數寫入,並發送數據包給客戶端。
註:關於S_WhoAmount的部分,目前尚未做太多分析。

41~55判斷指令後方是否有帶參數為all。
如果有帶參數,將會顯示詳細的在線上的角色名稱。
注意一行顯示最多50位玩家,超過50將會在下一行輸出。
3.分析GM指令與一般指令

在L1Who設定斷點。
啟動除錯模式,開啟天堂遊戲登入。
在對話框輸入,.who,確定有進入斷點。
在對話框輸入,/who,並沒有進入斷點。
此時可以斷定,兩個指令的處理位置並不是同一支程式。

4.分析程式碼:

針對一般指令who嘗試做搜尋。
此次使用Ctrl + N,針對classes做名稱的搜。
輸入Who。
可以發現有一個C_Who的檔,點擊將其打開。

在程式碼內下斷點。
在遊戲對話框輸入,/who,確定有進入斷點。
此時可以斷定,一般指令的執行的就是C_Who。
src/l1j/server/server/clientpackets/C_Who.java

回到程式碼,開始分析。
37~40,應該是取得客戶端的資訊。
42這是個readS的方法,解析取得輸入的參數的字串。
註:如果有興趣分析readS的話,需要具備byte array→ASCII的一些相關知識。

43確認輸入的參數名稱是否存在線上。
46~58確認是否有參數,如有參數則顯示玩家的名稱與狀態(正義(Lawful)/中立(Neutral)/邪惡(Chaotic)),如無則顯示線上人數。

此時做個反向分析找尋呼叫的位置。
在方法C_Who上,按下右鍵並選擇Find Usages
下方會彈出此所有使用此方法的清單。
剛好只有一個地方,我們點擊將其開啟在工作區。
這時候會開啟PacketHandler.java。
src/l1j/server/server/PacketHandler.java
在前面幾次分析中也有提到。
PacketHandler會發現對應的是個OP_CODE。
C_OPCODE_WHO:請求查詢遊戲人數
註:我為什麼會知道對應的是客戶端的什麼行為?因為有註解有寫得很清楚。

分析至此告一段落。