|
發佈時間: 2025-11-18 00:25
正文摘要:《燕雲十六聲》Lua腳本注入器 快速閱讀精華 🎯 核心目標: 在《燕雲十六聲》PC版中,注入並執行自訂的Lua腳本。🛠️ 主要功能: 開啟遊戲內隱藏的除錯(Debug)或GM管理員選單。自由調整遊戲內的各種參數與標記。 🔑 運作原理: 透過一個代理`dinput8.dll`檔案,搭配Frida框架與Python載入器,來達成腳本注入的目的。⚠️ 重要提醒: 這是一份給開發者與技術愛好者的實驗性專案(PoC),並非穩定成品。使用本工具有一定風險,請務必了解其原理後再行操作。 本文章目錄.article-toc { border: 1px solid #ddd; padding: 15px; background: #f9f9f9; border-radius: 6px; margin: 20px 0; width: 95%;}.toc-title { /* --- 以下是合併進來的 H2 樣式 --- */ font-size: 1.25em; /* 125% */ border-left: 5px solid #2A98DA; border-radius: 2px; padding: 5px 0px 5px 10px; font-weight: bold; margin: 0 0 15px 0; /* 調整了 margin,只留下方 15px */ color: #333; line-height: 1.5; background-color: #f8f8f8; /* --- 樣式合併結束 --- */}.toc-list { list-style: none; padding-left: 0;}.toc-list li { margin: 8px 0;}.toc-list a { color: #2A98DA; text-decoration: none;}.toc-list a:hover { text-decoration: underline;}.back-to-top { display: block; margin-top: 10px; font-size: 0.9em; color: #666;}風險聲明:使用前必讀document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#warning'; 這是什麼工具?運作原理大揭密document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#what_is_it'; - 【小知識】它是怎麼辦到的?document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#how_it_works'; 事前準備:你需要哪些工具?document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#pre_req'; 安裝教學:一步一步跟著做document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#install_guide'; 啟動與使用:注入你的第一個腳本document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#how_to_use'; 客製化你的專屬腳本document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#custom_script'; 進階探討:如何打造更強大的工具?document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#advanced'; 《燕雲十六聲》Lua注入器 常見問題Q&Adocument.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#faq'; 參考資料document.currentScript.previousElementSibling.href = location.href.split('#')[0] + '#references'; 想不想深入《燕雲十六聲》的遊戲核心,一窺開發者才能看見的秘密?這份教學將帶你認識一款實驗性的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`: 觸發 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)來操作,而不是陽春的控制台。安全性與穩定性: 強化錯誤處理機制,提供更詳細的日誌,甚至可以設計一個「唯讀模式」,只檢查遊戲數據而不做任何修改。 以下廣告滑動後還有帖子內容var custom_call_MIR = function (params) {if ( params === null || params.hasAd === false ) {var divRowSide;for (let index = 0; index < ONEADs.length; index++) {if (ONEADs[index].pub.player_mode === "mobile-inread") {divRowSide = ONEADs[index].pub.slotobj;}}var ins = document.createElement('ins');ins.className = 'clickforceads';ins.setAttribute('style', 'display:inline-block;');ins.setAttribute('data-ad-zone', '18264');divRowSide.appendChild(ins);var js = document.createElement('script');js.async = true;js.type = 'text/javascript';js.setAttribute('src', '//cdn.holmesmind.com/js/init.js');js.onload = function(){console.log('[ONEAD MIR] ClickForce Loaded');};divRowSide.appendChild(js);}};var _ONEAD = {};_ONEAD.pub = {};_ONEAD.pub.slotobj = document.getElementById("oneadMIRDFPTag");_ONEAD.pub.slots = ["div-onead-ad"];_ONEAD.pub.uid = "1000509";_ONEAD.pub.external_url = "https://onead.onevision.com.tw/";_ONEAD.pub.scopes = ["spotbuy", "speed"];_ONEAD.pub.player_mode_div = "div-onead-ad";_ONEAD.pub.player_mode = "mobile-inread";_ONEAD.pub.queryAdCallback = custom_call_MIR;var ONEAD_pubs = ONEAD_pubs || [];ONEAD_pubs.push(_ONEAD);var truvidScript = document.createElement('script'); truvidScript.async = true; truvidScript.setAttribute('data-cfasync','false'); truvidScript.type = 'text/javascript'; truvidScript.src = '//stg.truvidplayer.com/index.php?sub_user_id=597&widget_id=3309&playlist_id=2381&m=a&cb=' + (Math.random() * 10000000000000000); var currentScript = document.currentScript || document.scripts[document.scripts.length - 1]; currentScript.parentNode.insertBefore(truvidScript, currentScript.nextSibling); 《燕雲十六聲》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 |
