《燕雲十六聲》Lua腳本注入器 快速閱讀精華
- 🎯 核心目標: 在《燕雲十六聲》PC版中,注入並執行自訂的Lua腳本。
- 🛠️ 主要功能:
- 開啟遊戲內隱藏的除錯(Debug)或GM管理員選單。
- 自由調整遊戲內的各種參數與標記。
- 🔑 運作原理: 透過一個代理`dinput8.dll`檔案,搭配Frida框架與Python載入器,來達成腳本注入的目的。
- ⚠️ 重要提醒: 這是一份給開發者與技術愛好者的實驗性專案(PoC),並非穩定成品。使用本工具有一定風險,請務必了解其原理後再行操作。
想不想深入《燕雲十六聲》的遊戲核心,一窺開發者才能看見的秘密?這份教學將帶你認識一款實驗性的Lua腳本注入器,它就像一把萬能鑰匙,能讓你開啟遊戲內隱藏的除錯模式與GM選單,自由調整各種遊戲參數。
不過,在開始之前,我們要先有個觀念,這不是一個隨插即用的修改器,而是一個偏向技術研究與逆向工程的「概念驗證(Proof-of-concept)」專案。跟著我們的腳步,你將能了解它是如何運作,並成功注入你的第一個腳本!
風險聲明:使用前必讀
本專案僅供教育與逆向工程研究目的使用。
這不是一個功能完善、穩定可靠的工具。在任何情況下,使用此類工具修改遊戲都可能帶來無法預期的錯誤、遊戲崩潰,甚至有違反遊戲使用者條款的風險。請在充分理解其原理與風險後,再決定是否繼續。
這是什麼工具?運作原理大揭密
簡單來說,這套工具的核心目的,就是確認兩件事:
- 《燕雲十六聲》這款遊戲,內部是使用一套客製化的 Lua 5.4 虛擬機來運作。
- 我們確實有辦法「插隊」,將我們自己寫的 Lua 腳本注入到遊戲裡執行,進而控制遊戲行為,例如打開GM選單。
所以,你可以把它看作一個實驗平台,而不是一個成熟的修改器。
【小知識】它是怎麼辦到的?
這整個流程聽起來很神奇,其實背後的原理就像一場精密的「快遞掉包」計畫:
- 第一步:偽裝的快遞員 (代理 dinput8.dll)
當你啟動遊戲時,系統會自動載入一個叫做 `dinput8.dll` 的檔案。我們準備一個假的 `dinput8.dll` 放在遊戲目錄下,遊戲就會優先載入我們的版本。這個假檔案很聰明,它會把遊戲原本需要的指令轉交給系統裡真正的 `dinput8.dll`,確保遊戲能正常運作;同時,它還會偷偷夾帶私貨——載入我們的核心工具 `frida-gadget.dll`。
- 第二步:建立秘密通訊 (Frida Gadget + Python)
`frida-gadget.dll` 就像在遊戲內部建立一個秘密的通訊站。接著,我們在外部執行一個 Python 腳本 `Loader_gadget.py`,這個腳本會連上這個通訊站,並把我們真正的「駭客腳本」`hook.js` 注射到遊戲進程中。
- 第三步:找到下手機會 (Hooking lua_pcall)
`hook.js` 進入遊戲後,會開始掃描遊戲的程式碼,尋找兩個關鍵的內部函數 `lua_load` 和 `lua_pcall`。你可以把 `lua_pcall` 想像成遊戲執行所有 Lua 腳本的「總開關」。一旦找到它,我們的腳本就會在這裡設下一個埋伏點(Hook)。
- 第四步:執行我們的腳本 (注入 Test.lua)
當你按下觸發鍵(預設是數字鍵 `1`)後,我們的腳本就會待命。等到下一次遊戲呼叫「總開關」`lua_pcall` 時,我們的代碼就會搶先執行一小段載入器,這個載入器會去讀取並執行我們放在 `Scripts\Test.lua` 裡的客製化腳本,進而達成開啟GM選單等各種神奇操作!
事前準備:你需要哪些工具?
在開始前,請確保你的電腦環境符合以下要求:
- 作業系統: Windows x64
- 遊戲版本: 《燕雲十六聲》PC版
- Python 環境: 3.x 版本 (例如 3.10 或更新)
- Python 模組: 需要安裝 frida 函式庫。打開你的命令提示字元(CMD)或PowerShell,輸入以下指令來安裝:
pip install frida
(建議也安裝 frida-tools,方便除錯:pip install frida-tools)
安裝教學:一步一步跟著做
- 下載並建立專案資料夾
首先,將所有檔案下載並解壓縮到一個固定的路徑,教學中以 `C:\temp\Where Winds Meet\` 為例。你的資料夾結構應該會像這樣:- C:\temp\Where Winds Meet\
- │
- ├─ Scripts\
- │ └─ Test.lua # 範例 Lua 腳本
- │
- ├─ dinput8.dll # 代理 DLL
- ├─ frida-gadget.config # Frida 設定檔
- ├─ frida-gadget.dll # Frida 核心
- ├─ hook.js # Frida JS 腳本
- └─ Loader_gadget.py # Python 載入器
複製代碼 - 放置代理 DLL 到遊戲目錄
找到你安裝《燕雲十六聲》的資料夾,也就是 `wwm.exe` 執行檔所在的位置。將我們專案中的 `dinput8.dll` 複製一份到這個資料夾裡。完成後,你的遊戲目錄看起來會像這樣:- <你的遊戲安裝路徑>\...\wwm.exe
- <你的遊戲安裝路徑>\...\dinput8.dll # <-- 把我們的代理 DLL 放在這
複製代碼 請放心,這個操作不會影響到你系統 `C:\Windows\System32\` 裡的原始 `dinput8.dll` 檔案。
- 確認 Python 與 Frida 環境
再次確認你已經安裝好 Python 3,並且透過 `pip install frida` 指令成功安裝了 Frida 函式庫。
- (可選) 檢查設定檔
專案中的 `frida-gadget.config` 檔案預設會監聽 `127.0.0.1:27042` 這個位址。一般情況下不需要修改,除非你有特殊網路配置需求。
啟動與使用:注入你的第一個腳本
重頭戲來了!跟著以下步驟來啟動注入器。
- 啟動遊戲
正常啟動《燕雲十六聲》,等到遊戲主程式 `wwm.exe` 成功運行(不是啟動器),進入到遊戲畫面。
- 執行 Python 載入器
回到我們的專案資料夾 `C:\temp\Where Winds Meet\`,在這裡打開 PowerShell 或命令提示字元(CMD),然後輸入以下指令執行載入器:
python Loader_gadget.py
如果成功,你會看到類似下方的訊息,代表腳本已經成功連上遊戲並注入了 `hook.js`:
👉 GM後台版 遊戲 推薦 ⬇️⬇️⬇️ 快速玩各種二次元動漫手遊app

腳本會開始監聽,並將日誌記錄在 `frida_hook_log.json` 檔案中。
- 觸發 Lua 注入
當注入器正在運行,且你人也在遊戲中時,切換回執行 Python 腳本的那個黑色視窗,然後按下鍵盤上方的數字鍵 `1`。
這個動作會「預備」一次注入。當下一次遊戲內部呼叫 `lua_pcall` 函數時,我們放在 `C:\temp\Where Winds Meet\Scripts\Test.lua` 的腳本就會被執行!
【重要訣竅】 有些腳本(例如開啟GM選單)必須在遊戲載入完成前注入才能正常生效。如果注入得太晚,你可能需要重啟遊戲,並在更早的時間點(例如剛進主選單時)就按下 `1` 鍵觸發。
- 如何停止注入器
當你想結束時,只要在執行 Python 腳本的視窗中按下 `Ctrl+C`,腳本就會嘗試乾淨地從遊戲中卸載並結束。
客製化你的專屬腳本
真正的魔法發生在 `C:\temp\Where Winds Meet\Scripts\Test.lua` 這個檔案裡。你可以用任何文字編輯器打開它,然後撰寫你自己的 Lua 程式碼來控制遊戲。
例如,你可以透過修改全域變數或標記來開啟各種除錯功能:
- `DEBUG = true`
- `DISABLE_ACSDK = true`
- `ENABLE_DEBUG_PRINT = true`
- `ENABLE_FORCE_SHOW_GM = true`
- `FORCE_OPEN_DEBUG_SHORTCUT = true`
- `GM_IS_OPEN_GUIDE = true`
- `GM_USE_PUBLISH = true`
- `acsdk_info_has_inited = false`
基本上,任何遊戲 Lua 環境中可以存取的東西,理論上都可以透過這個方法來進行檢視或修改。
進階探討:如何打造更強大的工具?
目前這只是一個研究性質的專案,但如果要把它變成一個更穩定、更強大的工具,可以從以下幾個方向著手:
- 移除 Frida 依賴: 直接打造一個原生的 DLL,內部整合特徵碼掃描與掛鉤功能(例如使用 MinHook),讓工具更獨立。
- 應對遊戲更新: 建立版本檢查機制。當遊戲更新後,特徵碼可能會失效。一個好的工具應該要有方法來應對這種變化,例如提供診斷模式來掃描新的特徵碼。
- 更佳的使用者體驗: 製作一個設定檔,讓使用者可以自訂腳本路徑、開關特定功能,甚至提供圖形化介面(UI)來操作,而不是陽春的控制台。
- 安全性與穩定性: 強化錯誤處理機制,提供更詳細的日誌,甚至可以設計一個「唯讀模式」,只檢查遊戲數據而不做任何修改。
以下廣告滑動後還有帖子內容
《燕雲十六聲》Lua注入器 常見問題Q&A
- Q:為什麼我執行 Python 腳本後顯示連線失敗或找不到進程?
A:請檢查以下幾點:
- 你是否已經啟動了遊戲主程式 `wwm.exe`(不是啟動器)?
- 你的 Python 和 Frida 函式庫是否都已正確安裝?
- 防火牆或防毒軟體是否阻擋了腳本的連線?
- 所有檔案的路徑是否都與教學中的範例一致?
- Q:我按了數字鍵 1 之後遊戲就閃退了,怎麼辦?
A:這很可能是因為遊戲版本更新,導致內部的函數特徵碼(Signatures)改變了,使得注入器找不到正確的位置而發生錯誤。這類實驗性工具的壽命通常很短,需要等待作者更新特徵碼。另一種可能是注入的時機不對,可以嘗試在遊戲的不同階段(如主選單、載入中)進行注入。
- Q:使用這個會被官方鎖帳號嗎?
A:有極高的風險。任何對遊戲客戶端的修改都違反了使用者協議。此工具僅建議在離線模式或測試環境下,出於學習和技術研究的目的使用。在連線伺服器的情況下使用,後果自負。
- Q:我可以自己修改 `Test.lua` 來實現其他功能,例如修改角色數值嗎?
A:理論上可以。這正是這個工具的核心價值所在。只要你能透過 Lua 腳本找到對應的遊戲數值或函數,你就可以進行修改。但這需要具備一定的逆向工程和 Lua 編程知識。
- Q:什麼是「特徵碼 (Signatures)」?為什麼遊戲更新會讓它失效?
A:你可以把特徵碼想像成在茫茫人海中找人的「尋人啟事」,上面描述了目標人物的特徵(例如「穿著藍色外套,身高180公分」)。我們的注入器就是靠這個特徵碼在遊戲龐大的程式碼中找到 `lua_pcall` 這個關鍵函數。當遊戲更新後,就像是所有人都換了一套衣服,原來的「尋人啟事」自然就失效了,需要更新描述才能重新找到目標。
參考資料
WhereWindsMeet-Lua-Injector by Acedia0
https://github.com/Acedia0/WhereWindsMeet-Lua-Injector
|