Unity MONO 框架 - 以 Gamble With Your Friends 為例

起因
原本看實況看得很爽,然後自己也買遊戲來玩 結果有個中國帳號跑到 Twitch 的實況主的房間喊了 N-Word 所以我就稍微研究一下他是怎麼跑進去的
是遊戲本身的問題嗎?
載了遊戲之後,其實經過一連串的尋找,或是常常逆向 steam 遊戲的都知道 你桌面的遊戲圖示其實只是個快捷,當然目前 AI 時代要知道這些蠻容易的 但要先逆向之前我們可以先從最表層的遊戲內容先分析起
連線方式
遊戲在開始遊戲時會問你這一段話 意思是請確定你的電腦是你的朋友中最好的電腦 其實從這點來說可以大概猜測這遊戲是 P2P 的 但這在現代遊戲來說也沒什麼大不了,畢竟這款遊戲也沒多少錢

再來可以發現到遊戲最下方會有一串數字,這串數字會在每次開啟遊戲時更換 這邊其實可以算做一個後續的伏筆

程式碼
確認大概是 P2P 架構後,就可以著手進行逆向工程。因為這是一款使用 Unity 引擎開發的遊戲,基於 MONO 架構的特性,其核心邏輯並未經過深度加密。我們可以直接使用 dnSpy 這類反編譯工具,打開遊戲目錄下的 Assembly-CSharp.dll 來查看原始碼。
那看了程式碼之後發現什麼問題
問題分幾點:
- 房間邏輯只防君子不防小人
- 是透過 Steam ID 去匹配組隊房間成員
- Steam ID 會被 Steam API 呼叫出來
- 只要知道你 ID 的基本上不是朋友應該也可以加進房間
在程式碼部分需要有一個補充 Unity MONO 架構有一個特點,由於它的程式碼是打包成 DLL,這意味著玩家不僅可以輕易「看」到程式碼,甚至可以直接「修改」並替換掉原本的遊戲邏輯。 當然有一些專門給這種東西的外掛 (也可以用在翻譯遊戲上面)
遊戲只有考慮到多少人玩遊戲,但沒有去預料未知情形發生 所以在我們看到的事件裡面,遊戲就算最多 4 個人,他也可以進到房間裡面
那這邊會有一個問題,考慮到 第1點 以及 第4點,要怎麼準確狙擊某個特定的人呢?
是 Steam 的問題嗎?
在逆向遊戲得時候可以一直看到 SteamMatchmaking 的字眼 搜尋之後可以看到他的文件
https://partner.steamgames.com/doc/features/multiplayer/matchmaking
這是一個 Steam 專門給遊戲 P2P 的 API 函數 可以連線、加入大廳等等的功能
Steam API 🤔
深入研究程式碼後,我發現開發者其實有先將 Steam ID 做過「混淆」處理,再讓玩家連線。但這個保護機制形同虛設。
還記得前面提到的伏筆嗎?遊戲畫面正下方的那串數字,其實就是用你的 Steam ID 轉換生成的 LobbyID(大廳 ID)。
為什麼說混淆機制沒用呢?因為 SteamMatchmaking 伺服器的大廳資訊是公開的。任何人都可以透過 Steam API 抓取目前所有房間的資料,並寫腳本輕鬆比對出哪一串 LobbyID 與實況主畫面上的數字吻合。(當然,它背後的數字組合邏輯不僅僅只有串接 ID 這麼簡單)。
這其實算是對 Steam API 的一種「非預期使用方式」。如果開發者沒有把大廳屬性設定為「僅限好友 (Friends Only)」或「私人 (Private)」,房間就會暴露在公開搜尋列表中。這個問題行之有年,這款遊戲的社群早就有許多玩家抱怨過會有陌生人突然加入的問題,但官方先前一直沒有針對這個漏洞進行修補。

發生的方式是甚麼
- 看實況擷取畫面上的 ID。
- 透過 Steam API Server 請求公開大廳列表,比對找出該實況主的房間。
- 利用腳本繞過遊戲前端的 UI 限制,直接送出加入大廳的請求。 就這樣,攻擊者成功闖入了一個本該是私人的、甚至已經滿人的房間。

後續
那後續呢,遊戲官方也是把這些情況給修改掉了,即使你知道 ID 也沒辦法隨便加進其他人的房間中了
在修補之前有甚麼可以做的
如同前面提到的,Unity 開發的遊戲通常可以透過第三方框架(例如 Thunderstore 上常見的 BepInEx 插件)來修改。如果你有安裝過別人開發的繁體中文模組,對這個東西一定不陌生。
這種工具不只能用來翻譯,你同樣可以將自製的腳本或外掛寫入。因此,在官方還沒修補漏洞的時候,懂技術的玩家其實可以自己(或請 AI 幫忙)寫一段針對連線驗證的防禦程式碼注入到遊戲中,來保護自己的房間不被干擾。