淺談外掛常識和如何防御


本文首發於行者AI

電子游戲自誕生以來,一直遭受着外掛的困擾,給游戲公司造成了不可估量的損害。本文希望通過介紹外掛的相關知識,讓對游戲安全感興趣、有意願了解游戲安全知識的同學對游戲安全有個基本的認識。


1. 外掛基本概念

1.1 外掛基本定義

未經官方許可的,可以達到游戲作弊效果的游戲工具。使用這種工具,能獲得其他誠實玩家無法達到、或者在短期內得到其他誠實玩家必須通過長期運行游戲才能得到的游戲結果。滿足上述效果的工具,稱之為“外掛”。

1.2 外掛的影響

外掛作弊行為十分惡劣地影響了游戲行業的發展。

首先,外掛的使用損壞了游戲的公平性。在外掛等游戲中作弊的最直接害處便是影響了游戲的公平性並破壞誠實玩家的利益。其次,它會破壞游戲玩法,損害游戲質量,從而縮短游戲生命周期。通過使用外掛,外掛者可以特別容易獲勝或獲得更高分數,失去挑戰將使游戲不那么可玩。此外,外掛的使用會影響服務器的服務質量並加速玩家的流失。第三,它破壞了游戲公司和玩家的經濟利益。游戲外掛造成的犯罪也經常發生。游戲公司主要通過收取增值服務或在線游戲玩家付費來賺錢。外掛的使用破壞了網游的可玩趣味性,減少了游戲用戶的在線時間和該類產品的生命周期,這極大地損害了出品公司的經濟利益。

1.2 外掛的分類

現如今游戲外掛的種類繁多,面對這么多的外掛很有必要對外掛做一些分類,方便分析和總結外掛的技術和特點。

不更改游戲邏輯和數據的”模擬掛”“腳本掛”

以按鍵精靈為代表的一類,它本質上不進入游戲內部,只是在外圍通過識別游戲圖片、文字等方式來模擬點擊,達到獲益的目的。將網絡游戲中很繁瑣的動作或者重復的無聊的很費玩家時間的流程和任務使用外掛幫助玩家完成,達到方便和解放玩家的目的。例如在網絡游戲《地下城與勇士》中,角色存在等級制度,等級越高,可以帶越好的裝備,但是練級並不是一件美妙的事情,想要達到滿級更是要花費很長的時間,在游戲滿級前就要一直殺怪刷圖,可能同一個圖要刷幾百遍。而刷圖殺怪的過程就要一直按技能鍵和普攻鍵,比如普攻是 X 鍵,一天就要按幾千上萬遍,及其無聊和枯燥,所以外掛制作商開發出這種能夠代替人們進行操作的外掛,可以利用其按鍵連點功能,來降低游戲的枯燥和痛苦,按一次就可以連續使用 X 鍵位,達到一直普攻的效果,在游戲人物進游戲后只需按一下 X 鍵,角色就可以一直攻擊,玩家只需要控制角色的移動就可以了,讓玩家遠離這種無趣的連續點擊鍵盤或者鼠標的操作。

圖1. 按鍵精靈使用示意(圖片來源網絡)

修改游戲內存的“內存掛”

內存修改類外掛可以分為以下三種:

(1)第一種方法是利用 virtual X driver(虛擬設備驅動程序)直接查找游戲內存分配地址,這種方法需外掛開發人員有良好的編程基礎和系統的底層驅動知識,是技術較難的一種方法,門檻較高。

(2)第二種方法就是用 ToolHelp API 函數,該函數是用來枚舉進程和模塊,獲取進程和模塊的 ID 與信息。黑客利用 ReadProcess Memory 函數從網絡游戲的進程中讀取到游戲的內存數據,但是該方法沒有修改內存的函數,不能往內存里寫數據,所以這種方法需要其他方法的配合,具有一定的弊端。

(3)第三種方法是利用游戲進程的對應函數,這種方法比前兩種要方便和簡單很多,游戲進程的對應函數很容易就能得到,例如利用:ReadProcessMemory 和 WriteProcess-Memory 兩個函數對游戲進程進行讀取和寫入,這種方法是當下最流行最受歡迎的方法,該方法能修改市面上大多數的游戲內存。

下面是一些例子:

(1)以使命召喚OL卡配件為例。游戲的設定為武器可以裝配不同的配件,正常情況下,M4A1只能裝配2個配件。使用調試器調試游戲,分析武器的配件邏輯,可以發現:每次裝備配件時,都會調用一個游戲函數,定義為AddWeaponAttachment(作者自己的定義,下同),而這個函數的調用參數通過不斷的調試分析可以猜測為插槽Index以及配件ID,即:AddWeaponAttachment(SlotIndex, AttachmentID)。額外調用這個函數,即增加一次游戲邏輯的調用,就可以實現M4A1使用多個配件。

(2)以DNF倍攻為例。玩家在攻擊的時候會有攻擊力的疊加。同樣通過調試分析,找到角色攻擊函數,定義為Attack(Target, Power),參數表示攻擊的對象以及攻擊力,外掛可以修改這個Attack函數,使得Target為當前區域內所有怪物,Power為無窮大,那么Attack的效果即為全屏倍攻。

(3)以CF透視為例。游戲在渲染圖像的時候會使用Windows的DiretX模塊(DX游戲)。一般來說,在渲染每一幀的時候游戲邏輯會根據由遠到近的順序將當前屏幕內所展示的圖像渲染出來,在最終呈現時會根據物體的遮擋關系真實的反映出當前場景,最終覺得當前所看到的畫面。外掛可以修改DirectX的渲染邏輯,強制將遮擋關系修改,那么原本應該被遮擋的物體會在屏幕上顯示出來,形成人物透視。

(4)以棋牌類游戲看牌掛為例。由於游戲邏輯的需要,玩家的底牌會在存放在內存中,而通過內存查看工具不斷的變更查看條件,就可以在內存中的找到對應的底牌記錄,知道別人的底牌之后,玩法就非常隨意了。

竄改網絡數據的“封包掛”“協議掛”

封包類外掛是難度較高的一種外掛技術,涉及多個技術問題,網絡游戲的服務器端和客戶端通信是利用 socket ,服務器端申請一個 socket 監聽消息,並綁定到一個對應的 IP 地址和端口上,等待游戲客戶端的連接,外掛制作者利用封包截取工具截取通信數據包,經過多次截取封包,分析數據,得到封包數據對應的人物操作或屬性,若封包加密則分析其加密算法,網絡游戲的前期由於其服務器功能的限制,一般封包都不加密或者采用異或加密很好破解,修改對應的數據,再利用封包截獲工具轉發給服務器,通過篡改通信數據來實現作弊。WPE是外掛玩家常用的封包編輯工具,下圖是WPE工具示意圖。可以抓到並修改游戲進程發出的封包,如果游戲自身存在封包方面的漏洞,就有可能被外掛作者發現並利用。

圖2. WPE示意圖。

其他類外掛

除了上面的“模擬掛”、“內存掛”、“封包掛”之外,市面上還存在一些比較小眾的外掛。

(1)顯卡驅動級別的外掛,直接修改顯卡驅動。

(2)硬件外掛。定制鼠標芯片、鼠標高級宏、定制鍵盤或機械手等。

(3)AI外掛。基於深度學習、強化學習的人工智能外掛。表現形式類似模擬掛。

2. 防御外掛的一些方法

2.1 檢測外掛的常見方法

(1)變量檢測。設置一個全局變量。在游戲關鍵功能函數的外層函數賦值,在功能函數內部檢測。正常游戲調用肯定是一步一步執行的,必然會對變量賦值,但是游戲外掛會直接調用功能函數,函數內部發現變量沒有被賦值,而檢測到外掛。

(2)堆棧檢測。變量檢測有一個弱點,那就是必須設置一個全局變量來傳遞信息,有可能被外掛作者利用內存掃描工具來回掃描發現變量,在調用前提前賦值規避檢測。堆棧檢測避免了這一點,實現原理是在游戲功能函數內部讀取堆棧信息,以此得到調用函數的代碼來源,如果發現並非正常代碼調用的堆棧,那就是外掛程序了。

(3)數據檢測。不斷讀取關鍵數據以查看是否被外掛篡改,不過直接查看太過容易被外掛作者發現,一般混在游戲正常讀取數據的代碼中間接查看是否異常。

(4)CRC檢測。CRC檢測主要是保護游戲代碼不被外掛程序篡改,游戲中有一些關鍵邏輯代碼,比如如果血量為0的話會判斷人物死亡,外掛課程可以惡意篡改判斷邏輯,讓程序無論怎樣都不會執行死亡代碼,從而實現無敵效果。CRC檢測的原理是,不斷的讀取關鍵代碼的值,以此查看代碼是否被篡改。CRC之類算法對自身的完整效驗勾掛函數的完整效驗,一些重要代碼段另外單獨校驗,校驗相關代碼段VMP,必要的話返回服務器中驗證。

(5)進程檢測。獲取系統進程列表,檢測是否有常見外掛的進程名,如果檢測到存在外掛進程。直接強制下線。

(6)行為檢測。現在大力發展的新興檢測 如某企鵝的DXF就有此保護機制 效果甚好 甚至連圖色輔助都無法在其幸存 搞得 一些人直接上機械臂,與上面幾種方式不同:此種檢測主要是檢測用戶的行為,主要是利用深度學習人工智能大數據對玩家的行為數據進行分析。比如一局游戲中一位玩家爆頭和擊殺率都特別的高,鼠標移動的軌跡幾乎為直線,那么就可以把這些數據異常的玩家抽調出來轉入人工檢測,或者極為異常的直接封號處理。

2.2 防篡改思路

(1)游戲登陸相關封包處理。游戲的登錄封包盡量復雜化,不同的封包類型中部分數據采用多重加密是必要的,多個端口亂序通訊,這些登陸分包是一次性的不用太擔心算法效率問題,而此操作卻可以大大增加逆向難度。

(2)游戲反調試保護。主流思想是驅動層進行調試器進程檢測、標志位檢測,HOOK重要函數等方法以及給游戲執行文件加猛殼利用殼的功能實現反調。

(3)服務器數據校驗。收到客戶端發來的消息后,對消息的合法性進行驗算。比如上面提到的秒通關封包漏洞。服務器可以針對戰斗數據做校驗來進一步判斷是否真的通關成功。

(4)快速小規模更新游戲。更新內容是代碼混淆,基址變更。

(5)協議非對稱加密交換密鑰,對稱加密傳輸內容,保護好服務端私鑰,防止中間人攻擊。流式加密,同樣包發兩次內容不一樣。

(6)不定期彈出反外掛答題,答正確獎勵經驗,錯誤就掉線。

(7)客戶端加密加殼防止調試和注入,程序簽名防止篡改二進制。

(8)重要代碼放虛擬機或者腳本里運行(腳本字節碼需需改),一般黑客主要分析反匯編,復雜邏輯多套幾層黑客就暈了。

(9)關鍵數據不落內存,一律使用getxx,setxx之類的接口,后面將真實數據經過變換以后才落內存。

(10)守護進程動態跟蹤監控情況。

(11)決定性邏輯永遠放在服務端。

(12)發現某黑客/外掛工具利用某漏洞破解了游戲,先看影響大不大,再看他掙不掙錢,影響一般又不掙錢的話可以先養着他,等他掙錢了用戶多了,大型活動之前,一條指令就把它封了,用戶退款都可以弄得他爬不起來。

(13)必須要放在客戶端計算的邏輯將輸入和結果hash同步給其他客戶端驗算,不對就踢掉。

(14)當檢測到客戶端觸碰到某規則不要急着踢掉它,而是有概率踢掉,還要隨機幾秒踢掉,這樣黑客發現一會這里斷一會那里斷,就蒙圈了。

3. 總結

現如今游戲外掛越來越多,網絡開發商和玩家飽受困擾,任何一款相對火爆的游戲,都會成為外掛制作者重點關注的對象,從而造成外掛泛濫,玩家流失,致使游戲縮短運營時間。網絡游戲安全問題日益嚴重,由於本人的能力和時間有限,本文提出的外掛檢測機制和防篡改思路還有很多需要修改和完善的地方,因此希望有更多的人能夠更加深入研究,早日凈化當今的網絡游戲環境,能夠讓后來的研究者少走彎路。

我們是行者AI,我們在“AI+游戲”中不斷前行。

前往公眾號 【行者AI】,和我們一起探討技術問題吧!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM