自己測試私服,直接改exe的IP就夠了。但如果要開放給其他玩家,就需要一個「登入器」,負責三件事:自動比對玩家的檔案版本、設定好連線後直接啟動遊戲、以及防止玩家用改過的 WZ 檔案繞過遊戲內容(例如商城道具、地圖邊界)。
三種方案比較
| 方案 | 難度 | WZ驗證方式 | 適合情境 |
|---|---|---|---|
| Simple Launcher | ⭐⭐ | 客戶端hash比對 | 中小型伺服器,快速上手 |
| MapleLauncher(Fraysa) | ⭐⭐⭐⭐ | 伺服器端封包驗證 | 正式伺服器,安全性要求高 |
| MaplePatcher | ⭐⭐⭐ | CRC32全檔案掃描 | 需要完整自動補丁功能 |
方案一:Simple Launcher(hash 比對,最快上手)
原理很單純:登入器從你的網站讀取官方 hash 清單,跟玩家本機的 WZ / exe 比對,有差異就自動下載更新,沒有差異就直接啟動遊戲。
設定流程:
- 用 Simple Launcher 附帶的
CalculaHash工具,把你的客戶端資料夾拖進去,產生 hash 清單檔案 - 把 hash 清單上傳到你的網站(例如
https://你的網址/launcher/hash.txt) - 在登入器設定檔指定 hash 清單網址、下載伺服器網址、要啟動的執行檔名稱
- 用 Visual Studio 開啟
.sln編譯出.exe發布
這個方案的比對發生在玩家端,理論上玩家可以直接繞過(刪掉檢查邏輯)。如果需要防止玩家用修改版 WZ,要用下面的伺服器端驗證方案。
方案二:MapleLauncher(伺服器端驗證,安全性最高)
MapleLauncher 把 WZ 驗證移到伺服器端:登入器連線後送出一個包含所有 WZ hash 值的 WZ_CHECKSUM 封包,伺服器比對過了才允許登入,玩家端無法繞過。
登入器設定重點:UseMapleEncryption 一定要設為 true(v83 使用自訂加密,設 false 會導致封包解密失敗)。
伺服器端實作步驟(以 Java 架構為例):
// 1. 在 RecvOpcode.java 新增(挑一個未使用的opcode值,登入器設定要一致)
WZ_CHECKSUM(0xEC);
// 2. 建立 Handler
public class WzChecksumHandler extends AbstractMaplePacketHandler {
@Override
public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
// 讀取登入器送來的hash清單,與伺服器官方hash比對
// 通過:c.setAuthenticated(true);不通過:c.disconnect()
}
}
// 3. 在 PacketProcessor 註冊
registerHandler(RecvOpcode.WZ_CHECKSUM, new WzChecksumHandler());
// 4. 加入逾時保護:連線建立後10秒內未收到checksum封包就斷線
Login Server 和 Channel Server 是分開的連線,WZ驗證只需要在第一次連上Login Server時做一次,切換頻道不用重複驗證。
方案三:MaplePatcher(自動補丁系統)
如果你需要更完整的自動補丁功能(不只是「發現版本不同就整包重下載」),MaplePatcher 提供 CRC32 逐檔案掃描、只下載有差異的檔案,並用輕量 JSON API 取代資料庫:
{
"patchInfo": {
"version": "83.1.0",
"files": [
{ "name": "Map.wz", "crc32": "a1b2c3d4", "url": "https://patch.example.com/files/Map.wz" }
]
}
}
登入器設定檔(config.json)大致包含伺服器資訊、補丁行為、啟動畫面三個區塊:
{
"server": { "name": "MyMapleServer", "gameServerIp": "127.0.0.1", "gameServerPort": 8585 },
"patcher": { "checkCrc32": true, "maxConcurrentDownloads": 3, "retryAttempts": 3 },
"launcher": { "showAnnouncement": true, "announcementUrl": "https://myserver.com/announcements.html" }
}
還內建遠端旗標控制,可以在不重新發布登入器的情況下,遠端切換維護模式、強制更新、封禁特定 IP:
{
"serverFlags": { "maintenance": false, "ban_ips": ["203.0.113.45"], "force_update": false }
}
截至最近一次資料更新,MaplePatcher 完成度約九成、仍在測試階段,建議先在測試伺服器評估過再用於正式環境。
整合 Redirector
實務上登入器通常還會順便幫玩家設定好連線方式,不用玩家自己跑 Redirector 的 netsh 指令:登入器啟動時以管理員身份設定好連線 → 完成 WZ 驗證 → 啟動遊戲 → 遊戲結束後清除設定。netsh 指令需要管理員權限,登入器的 exe 要設定 manifest 要求 requireAdministrator。
常見問題
防毒軟體一直誤判登入器是病毒:這是私服登入器的通病,因為登入器通常需要管理員權限、可能呼叫 netsh、又會自動下載並執行檔案,容易觸發行為偵測。實際可行的做法:申請代碼簽署憑證(最有效,但需付費)、把登入器提交到 VirusTotal 公開清白讓玩家自行判斷、或請玩家手動把登入器加入防毒軟體白名單。
玩家繞過驗證用修改版WZ:改用方案二(MapleLauncher)的伺服器端驗證,客戶端無法繞過。
WZ_CHECKSUM opcode要用哪個值:挑一個你的伺服器版本裡沒被使用過的opcode即可,重點是登入器設定和伺服器端handler要用同一個值。