導讀:2022 年 9 月 15日,網易智企“易+”開源計劃正式釋出網易易盾遊戲安全測試工具——GameSentry,本文將從技術角度分析 GameSentry 的設計邏輯與設計經驗。
文 | 網易易盾
背景
GameSentry 誕生自網易易盾移動安全團隊,源自團隊多年在一線的經驗和方法論沉澱。是一款簡單、高效的工具,主要透過分析遊戲協議內容、遊戲函式邏輯和對應的地址、部分程式碼熱更、自動化 Hook 等功能達到降低深層次安全測試門檻的目的。
GameSentry 目前已正式開源(網易易盾 GameSentry 正式開源,做遊戲安全保障的尖兵利刃),我們希望透過降低安全測試的複雜度,讓遊戲公司能夠提前發現和感知漏洞和風險點,構建更成熟的安全保障體系,降低遊戲風險,回饋玩家對遊戲的熱愛。
什麼是安全測試
通常遊戲的生命週期可分為【開發】【測試】【釋出】【運營】四個階段。
在遊戲釋出之前,做好安全測試工作是非常關鍵的一環,好的【測試】不僅能更好加強外部防禦,抵禦釋出後的外掛破解等侵害,同時還能查漏補缺,發現此前內部設計和程式碼架構上的疏忽,提前最佳化以期減少正式上線後的 bug,讓玩家們獲得更好的遊戲體驗,使得遊戲的生命週期更為長久。
目前,常見的遊戲安全測試有以下三種方向:
遊戲協議漏洞測試:透過修改協議內容來檢查遊戲在設計、資料校驗、邏輯或數值設計上有無可被利用的風險點。這裡與 QA 測試存在一定的重合,但側重點不同。協議測試的輸入不受客戶端的限制。比如聊天功能,客戶端的輸入框是一定會有長度、型別限制的,而協議則沒有這些限制。
伺服器健壯性測試:透過傳送畸形、大量、無序的資料,校驗伺服器是否能正常執行。防止外掛或工作室惡意攻擊,使伺服器異常或當機。
外掛模擬測試:模擬外掛對遊戲進行記憶體修改、變速、資原始檔修改等操作,檢測是否能在遊戲中獲得收益或降低遊戲難度。
測試者們一般會根據需求選用合適的技術和工具,從攻擊者的角度對遊戲進行逆向分析和破解,進而主動發現和挖掘系統中存在的弱點、技術缺陷和安全漏洞,並進行缺陷放大和風險性評估,以期提前暴露遊戲應用程式中潛在的安全風險,提供安全漏洞修復方案,最大程度降低事後危害與外掛打擊成本。
通常有哪些測試方法
資源提取:AssetStudio、UABE
C# 程式碼:il2cppdumper、dnspy
Lua 程式碼:dump、load、reload
修改記憶體:GG、frida、hook技術、root 相關
下文將介紹主要的風險以及測試方法。
資源破解
危害:遊戲資源洩露
測試步驟:使用工具破解資源,觀察是否存在未加密或可破解的資源,包括圖片、音訊、模型等;
注意:以遊戲中不應該暴露的內容為判斷,比如道具圖示,背景音樂等;不因開場動畫,主題曲,CG 這類的資源置為不透過。
unity3d 引擎使用:AssetStudio/GD Ripper;
UE4 引擎使用:umodel;
neox 引擎:GD Ripper/quickBMS;
npk 檔案:NXPK 格式,EXPK 格式使用 NPKExtractor1.1.5.5;
使用 Extractor 工具提取
重簽名校驗
危害:
刪除關鍵美術模型(怪物、角色、寵物等)檔案,重打包,觀察是否影響遊戲邏輯-引發漏洞,且玩家因此獲益。
刪除音訊資源(戰鬥音效、背景音樂等)檔案,重打包,觀察是否影響遊戲邏輯-引發漏洞,且玩家因此獲益。
刪除特效資源(技能特效等)檔案,重打包,觀察是否影響遊戲邏輯-引發漏洞,且玩家因此獲益。
如不能精確定位檔案內容與型別,隨機抽樣測試。
如果美術資源是多個檔案分開放置,並可以從檔名中看出,嘗試修改檔名,觀察能否讓免費皮膚或道具替換為收費資源。
測試步驟:
APK 解析後刪除部分資原始檔後依舊可以重打包,觀察是否可以正常安裝遊戲、執行遊戲。
dll 修改風險
危害:修改遊戲邏輯。
測試步驟:
SO 破解風險
危害:修改遊戲正常邏輯
測試步驟:
觀察函式列表,邏輯函式名是否被刪除。例如:
mono_image_open_from_data_with_name 、
luaL_loadbufferx 、
il2cpp_image_get_class 等。
符號查詢
查詢 data-%p,觀察是否存在(il2cpp.so),一些特殊符號一定程度上能增加遊戲被破解的機率。
反除錯檢測
測試步驟:
使用工具開啟遊戲。
在 libc.so 和 open 處下斷點。
執行遊戲,觀察是否暫停。
存檔移植
測試步驟:
將遊戲目錄下的檔案複製到 PC 中。
將檔案複製到另外一臺裝置/模擬器中。
觀察是否繼承(部分繼承)原先遊戲的進度。
存檔檔案明文儲存
測試步驟:
觀察是否存在存檔檔案,.sqlite, .db 字尾的檔案,測試能否用 sqlitemanager 開啟。
觀察是否存在其他存檔檔案,直接用 notepad 開啟,檢視是否存在明文。
觀察在配置檔案中是否存在明文隱私資訊,例如使用者的賬戶密碼,資源的存放路徑等。
記憶體測試
測試方法:分析遊戲邏輯,修改對應位置的記憶體。(此過程需要使用工具對 APK 反編譯、並 dump 記憶體內容,並使用 Hook 進行修改)
此內容需要根據不同遊戲、不同邏輯進行測試。主要檢測越權、數值、邏輯等異常。
協議測試
測試方法:獲取遊戲中全部協議,並對其進行修改重發。(此過程需要工具對 apk 反編譯,獲取到協議傳送相關程式碼,必要時需要對其進行解密。也需要使用到 Hook 對相關函式進行修改)
主要檢測越權、畸形資料、重發等。不同遊戲需要構造不同的測試用例。
GameSentry 有什麼優勢
普通安全測試需要測試人員有較高的逆向水平,對人員的技術要求較高。對於結果導向的測試,雖然逆向必不可少,但逆向費時費力,測試質量與逆向水平關係並不大。所以需要一款工具讓工作內容不再放在逆向、Hook、Lua 修改這些技術上,而是直接關注遊戲的邏輯。
就以結果為導向的測試而言,雖然對逆向水平要求沒那麼高,但逆向卻費時費力,也並非每個團隊所能接受的。
GameSentry 主要透過分析遊戲協議內容、遊戲函式邏輯和對應的地址、部分程式碼熱更、自動化 Hook 等功能達到降低深層次安全測試門檻的目的。可以簡化記憶體測試、協議測試過程中對於 APK 逆向、Hook 編寫、指令碼修改、指令碼 dump 的繁雜操作,大大降低測試人員的上手門檻和逆向工作。
而從實踐效果上看,GameSentry 的設計思路是從攻擊者的角度對遊戲進行逆向分析和破解,主動發現和挖掘系統中的弱點、技術缺陷和安全漏洞,並進行缺陷放大和風險性評估,提前暴露遊戲潛在安全風險,讓安全團隊可以在危害發生前就著手準備漏洞修復方案,可以最大程度降低事後外掛危害與外掛打擊成本。
為什麼要開源
網易易盾在二十多年的一線實戰經驗中面對不同遊戲型別場景痛點,沉澱了大量的經驗、方法論,並基於此構建了一套成熟的工具集。這些年我們從社群吸取了很多營養,所以也想把這樣一個融合團隊多年經驗的新一代產品回饋到社群。
作為一個開放的專案,我們認為將專案開源也有利於推動產品迭代,比如 Unity 的版本眾多,且 il2cpp 改動比較頻繁,在相容性上面臨著巨大的挑戰。而開源,不僅能讓大家能享受到集體的智慧成果,便捷了遊戲開發者的測試工作,也可以透過社群的貢獻,覆蓋相容更多的引擎版本,提升行業整體效率,不重複造輪子。
更重要的是,作為遊戲熱愛者,我們希望透過降低安全測試的複雜度,讓遊戲公司提前發現並感知到漏洞和風險,構建更成熟的安全保障體系,降低遊戲風險,延長遊戲生命週期,提升使用者體驗,回饋玩家對遊戲的熱愛!期待未來與更多遊戲愛好者、遊戲開發商們攜手共進,生態共享。
目前版本的簡要說明
功能
| 支援情況
|
函式展示 | |
函式 Hook | |
記憶體例項展示 | |
函式呼叫 | |
函式修改 | |
一鍵 Log 展示 | |
dump(Lua、dll) | |
Lua 無重啟修改 | |
協議展示 | |
協議修改 | |
自定義 | |
歡迎加入貢獻
你是否正在規劃新專案上線前的安全測試?
你是否正在頭疼專案 APK 逆向的問題?
非常歡迎你參與遊戲安全測試工具使用及意見反饋,我們期待你的加入。
點選“閱讀原文”或掃描二維碼檢視開源原始碼。
掃描社群二維碼加入社群互動。
掃碼檢視原始碼