《糖豆人》的外掛為什麼這麼多?從它的安全性設計說起
“糖豆人的關卡設計特別棒,真的,我在天上看得一清二楚”
《糖豆人:終極挑戰賽》是一款令人捧腹的多人競技闖關類遊戲。雖然一局遊戲近60名玩家僅有一名可以贏得最後的王冠,但遊戲中糖豆人"沙雕"的動作、有趣的關卡和充滿童真的背景音樂,都極大程度地降低了它的競技感。
《糖豆人》在上線初期就得到了眾人的關注,甚至在開服的一段時間內由於遊玩人數超出預期,伺服器難以承載眾多的玩家而頻繁處於當機狀態。
一款如此火熱的多人聯機遊戲,或早或晚都會遭受外掛軍團的攻擊,這其實也算是玩家意料之內的事情。但是對於《糖豆人》來說,外掛的大潮似乎來得有些過於快了。遊戲上線還不到一週,直播彈幕中就已經有玩家開始反饋遇到了“仙豆”,B站上關於外掛的視訊也開始陸續出現。大家可以注意看下圖視訊的上傳時間,要知道《糖豆人》在8月4日才正式發售:
開啟《糖豆人》的Steam商店連結,你會看到幾乎所有玩家的評論都和外掛有關。
是什麼導致“仙豆”這麼快就出現在了這個繽紛多彩的世界中?本文將暫時不去探討玩家為什麼會在《糖豆人》這麼休閒的遊戲裡開掛,而是從遊戲逆向的角度,去分析這款遊戲的在安全方面的脆弱性。
0x01 初步分析
多人聯機遊戲一般需要對客戶端進行保護,防止攻擊者分析、篡改遊戲客戶端。這一步驟雖不能保證100%防護所有的攻擊,但至少可以一定程度提升攻擊門檻。我們首先測試《糖豆人》遊戲是否具有客戶端保護。
使用未自定義的官方版Cheat Engine,開啟目標程式,除錯目標程式,設定斷點:
可見《糖豆人》遊戲沒有設定任何客戶端保護,僅僅使用最常見的遊戲分析工具就可以檢視遊戲記憶體、設定斷點進行除錯。這說明對該遊戲的逆向分析沒有任何技術門檻。
既然沒有客戶端保護,那如果使用通用的加速齒輪是否能夠加速遊戲,實現人物的加速移動呢?啟動CE的加速齒輪功能,設定倍率5,結果如下:
“逮蝦戶!”
Voila! 我們糖豆人的時間能加速流逝,而其他的糖豆人在我們看來慢得就像沒吃飯一樣。我們只需幾秒就可以快步追上領先的糖豆人們!
由此可見加速外掛開發的成本非常低,普通玩家其實並不需要付出金錢購買外掛,僅需要一篇教程就可自主實現加速了。
0x02 進一步分析
我們僅在初步分析階段就完成了一款實用的《糖豆人》外掛,但本文不將止步於此。我們繼續進行資訊收集,進入遊戲的檔案目錄,可見以下的檔案結構:
該目錄結構說明該遊戲是使用Unity引擎進行開發的。進一步檢視遊戲目錄,發現目錄中沒有找到Assembly-CSharp.dll等託管的Dll檔案,但在目錄中發現il2cpp相關資料夾。因此判斷該遊戲在開發階段使用C#進行遊戲邏輯開發,然後通過il2cpp技術將C#程式碼轉換成cpp,編譯成native程式碼進行釋出。
il2cpp處理後的程式碼可以通過相應工具進行還原,將native程式碼對應至c#程式碼。同時,由於C#語言的反射特性,開發者在進行遊戲開發時使用的包名、類名、方法名和成員名稱都可以被準確地還原。
使用相關工具後,我們得到以下的東西:
可以看到各種開發者自定義的名稱被忠實地還原,這極大地幫助了我們進行遊戲邏輯的逆向分析。圖中紅框處的函式從名稱上來看應該是開發者在開發階段留下的用於除錯遊戲的函式,例如取消重力、玩家瞬移等。這些函式本應在發行時被刪除,但是並沒有。
藉助DebugTeleportPlayer這個除錯方法,我們可以逆向此函式,分析該函式是使用什麼方法瞬移糖豆人的。
上面的程式碼基本比較清晰了,可以仿照上述過程開發糖豆人瞬移外掛:
通過對客戶端邏輯的分析,我們還可以實現幾個比較有意思的外掛功能,比如降低重力:
或者停止比賽中的障礙物(僅對外掛玩家有效,其他玩家依然會被障礙擊倒):
0x03 網路通訊分析
在上述分析後,我們已經實現了多個和玩家座標有關的惡性外掛功能。可以合理猜測,遊戲伺服器並未對玩家的座標位置進行合理性檢驗,導致攻擊者可以在本地任意修改玩家座標,隨後該座標會被伺服器同步至其他玩家的客戶端上,導致其他玩家看見飄在空中的糖豆人。接下來,我們分析遊戲的網路通訊機制來確認這一點。
通過棧回溯和查詢關鍵字的方法,定位到遊戲內的一個與通訊高度相關的函式UnityNetworkingGameConnection__SendUnreliable。在此位置獲取傳入的引數,並通過C#反射機制獲取該引數的物件名稱,最終定位到一個與對局內玩家執行高度相關的遊戲協議。
NetMotorTaskSnapshot會記錄當前玩家的座標、朝向、速度和玩家動作等一系列狀態,然後通過封裝後被送至SendUnreliable函式傳送至伺服器。遊戲伺服器理應對玩家傳送的座標資訊進行校驗,但糖豆人遊戲並沒有,而是直接同步至其他玩家的客戶端,導致飛天等惡性外掛出現。
另外,雖然遊戲目前沒有開放修改角色名稱的功能,但通過對網路協議的分析,我們發現在遊戲開始階段客戶端會向伺服器上報玩家角色的暱稱。通過修改上報的暱稱,可以實現玩家角色改名。修改後的名稱在普通玩家視角中可見。
0x04 總結
通過以上分析我們可以發現,目前在遊戲的安全性上,《糖豆人》還存在著非常高的風險。遊戲的分析門檻很低,而且遊戲的一些基礎設計也存在安全隱患:遊戲過度依賴客戶端的計算,伺服器端缺乏對客戶端上報資訊的校驗。毫無疑問,《糖豆人:終極挑戰賽》是一款非常有趣且好玩的遊戲,遊戲在上線一週內的200萬份銷量也足以說明這款遊戲的成功;但對於一款多人聯機網路遊戲而言,遊戲的安全性是遊戲是否能夠長期穩定運營的一個重要因素。在這一點上,可愛的糖豆人可能要儘快成熟起來,正視黑產軍團帶來的巨大風險,拿起合適的武器保護自己。
來源:騰訊遊戲學院
地址:https://club.gamersky.com/activity/429060
相關文章
- 程式設計為什麼那麼難:從儲值卡扣款說起程式設計
- 《糖豆人》--是時候談談它的未來了
- 為什麼手感粗糙、內容不足的《糖豆人:終極淘汰賽》讓玩家真香了?
- 為什麼說ES6的class是語法糖?
- 《糖豆人》深度拆解:基於直播自然量的產品設計
- 從Android手機的搶紅包外掛說起Android
- 《糖豆人》官方:《糖豆人》免費兩週玩家數突破5000萬
- 尋找中國版的《糖豆人》
- 從內外兩方面解析:Python為什麼這麼火?Python
- 為什麼精益生產實現起來這麼難?這篇文章說的很通透
- 為什麼要這麼設計呢 但其實它只有一把鎖
- HBase的架構設計為什麼這麼厲害!架構
- 糖豆人epic賬戶錯誤14怎麼解決
- 做遊戲為什麼這麼難?從一個動畫和一把椅子說起遊戲動畫
- IT程式設計師必知!TCP/IP為什麼會有這麼多的致命漏洞?程式設計師TCP
- [-Flutter外掛篇 1-] 從自定義外掛開始說起Flutter
- 為什麼會有這麼多的程式語言?
- 《奇葩說》的陳銘,為什麼辯論這麼強?
- 為什麼美國遊戲業加班如此普遍?這得從勞動法說起……遊戲
- Event Loop是個什麼玩意:從 Vue 的 nextTick 說起OOPVue
- 程式設計師你為什麼這麼累?程式設計師
- 邊緣計算是什麼以及為什麼需要它
- 在Steam上爆紅的《糖豆人》也快上移動平臺了 開發者能從遊戲中學到什麼?遊戲
- 當我們說外掛系統的時候,我們在說什麼
- 什麼是外掛?
- 《糖豆人:終極淘汰賽》成功背後蘊含了何種設計?
- 這個從 VR 領域倖存下來的遊戲團隊,想做一個比肩《糖豆人》的爆款VR遊戲
- 說了這麼多次 I/O,但你知道它的原理麼
- GC 為什麼要掛起使用者執行緒? 什麼愁什麼怨?GC執行緒
- 為什麼說外鏈建設中,友鏈交換是最重要的
- 為什麼說js是弱型別語言,它的優缺點分別是什麼?JS型別
- 它憑什麼刷屏?——華為5G時代,這是它的底氣!
- 為什麼說遊戲設計是隱形的建築學?遊戲設計
- Java面試題:你知道Spring的IOC嗎?那麼,它為什麼這麼重要呢?Java面試題Spring
- 我為什麼不想把自己的Emacs外掛放到MELPA上?Mac
- ITAM是什麼?為什麼它很重要?
- [20210301]為什麼邏輯讀這麼多.txt
- 為什麼說程式設計師做外包沒前途?程式設計師