天堂私服 | 遊戲帳號分析/Debug (一)「L1J版」
核心版本
- L1J-3.80c
分析
- 建立遊戲帳號:
- 啟動模擬器。
- 啟動登入器,登入遊戲。
- 輸入一個全新的帳號/密碼,並登入。
1
2MoroseJJ
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。 - 然後在這物件裡面塞入值,而這些值除了
124和125行以外的,都是透過方法參入傳入的。
- 這時候其實可以去看一下
Account物件裡面定義的變數,基本上變數都會對應資料表的欄位,好的工程師是會將註解寫好的… Ctrl鍵壓住,再左鍵點擊Account即會開啟此物件。- 到這邊已經看到所有欄位對應的用途,還需要分析嗎?

- 再關注程式碼的部分
114行。 - 注意到此方法名稱為
create建立的意思,方法參數為name、rawPassword、ip、host。 - 所以需要支到呼叫此方法的有幾個地方,帶來的參數值又是如何取得?

- 在方法
create上,按下右鍵並選擇Find Usages
- 下方會彈出此所有使用此方法的清單
- 剛好只有一個地方,我們點擊將其開啟在工作區。

- 這時候會開啟
C_AuthLogin.java。1
src/l1j/server/server/clientpackets/C_AuthLogin.java
- 關注程式碼的部分
64行。 - 會發現後面帶入的參數,都是由
45~48行來的。註:這邊就不在追
45、46行的readS()這邊的參數由來,怕我繼續深入分析下去;一是講太多,二是怕你在這就放棄了…。
- 在
C_AuthLogin.java的45行設定斷點。
- 在
Account.java的119行設定斷點。
- 根據猜測
Debug
- 使用
IDE除錯模式來啟動模擬器。 - 準備完畢後,啟動登入器,登入遊戲。
- 輸入一個全新的帳號/密碼,並登入。
1
2Morose
12345678 - 接續會跳轉回
IDE斷點在C_AuthLogin.java的45行的位置。 - 此時可以觀察
accounts資料表內是否已經有Morose的帳號資料?(是沒有的,因為尚未INSERT INTO寫入) - 回到
IDE,開始使用
Step Over:步過,一步一步觀察45~48行來的參數值。accountName=morosepassword=12345678ip=127.0.0.1host=127.0.0.1
- 到達第
61行,可以發現是呼叫Account.load()的方法,帶入參數為accountName=morose。
Ctrl鍵壓住,再左鍵點擊load方法即會開啟跳轉到物件與方法位置。- 關注到
172的SQL。 - 該
SQL語法主要是為了找尋是否有name也就是帳號為morose的資料。 - 這邊就不做斷點並分析,語法不難。
- 點擊除錯按鈕

Show Execution Point,回到剛剛的位置。
- 因為資料庫確時還沒此帳號資料,所以可以肯定回傳的參數為
null,即表示account=null。 62的if判斷,這邊的邏輯是在說當沒有這個帳號的時候,要進行的行為,反之有此帳號就不做這些行為。63是取得Config裡面的設定Config.AUTO_CREATE_ACCOUNTS是否要自動建立帳號,這邊可以看到值為True。註:關於
Config的部分,後面會再介紹,這邊先知道有這些參數即可。
- 一路

Step Over:步過到64後,再次
Step Over:步過,就會跳轉到Account.java的119行設定斷點。 - 這邊就不在分析,主要就是在
accounts表內新增一筆帳號資料。 
Step Out:步出,讓這個方法執行完畢,會再跳回剛剛進入的位置。
- 跳回
C_AuthLogin.java的64行的位置。 - 此時可以觀察
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
- server.properties
結語
分析程式碼本就不容易,況且要分析到幾乎是手把手一步一步帶著看,真的是非常花費時間和精神。
希望透過這樣的分析,可以帶給新手們更多的信心慢慢學習程式。
這邊沒有用動態圖來做講解,是因為要說明的很詳細所以動態圖不適合。且動態圖會太長太大,造成網頁讀取過慢,使用者體驗很差。
原創文章真的不易,希望多多支持,感謝。
最後建議回顧一下首章天堂私服 | 天堂私服架設教學,了解其章節目錄。
免責聲明
- 本部落格文章中皆不提供任何所謂的遊戲「主程式」、「模擬器」、「登入器」…等等相關程式的下載點。
- 本部落格文章中所見之遊戲主程式和服務器端程序均來自網路發佈,版本歸原作者所有。
- 本部落格文章為研究SQL資料庫與修改JAVA語法使用,並非商業用途,亦無做營運事實等任何一切商業行為。
- 本部落格文章內容是為研究學習設計思想和原理為目的,絕沒有故意侵權或惡意抄襲、篡改其他遊戲內容!
