前言
#如何防作弊在遊戲開發中還是佔蠻重的比例的,這也涉及到遊戲獲利的問題,如果不做防作弊措施,或許我們開發出來的app當前上線或許第二天就出破解免費版了,這個事情我親身經歷過,當然這是基於app做的比較好被外掛公司盯上了,一度很火紅的吃雞遊戲端遊版本其實外掛非常猖獗,這也是因為沒有做防外掛,如何防作弊在求職者求職的時候也會經常被問到,當然我們能想到最簡單的方案就是不要信任客戶端任何數據,以伺服器資料校驗為準,當然這種方案在一些客戶端伺服器互動比較少的情況是可以這樣設計的,假設FPS,我們每次射擊造成的傷害,一幀裡面會射擊好多次,不可能每次都去向伺服器校驗吧,交互太頻繁了,體驗也很差,但如果不校驗的話,客戶端就是修改武器屬性值,這就是客戶端作弊了,如何解決這樣的問題,下文會介紹到防作弊的思路。
客戶端如何作弊
手機端
我在當初手遊剛起步的時候,flappy bird想必玩遊戲的人都知道,是一款非常虐的手遊,當時也非常火,朋友圈都在曬分數,後來我知道用一款《八門神器》的app能夠作弊修改分數,然後修改成很高的分數曬在朋友圈就顯得自己「很屌」,滿足一下自己的虛榮心,原理就是修改分數內存值來達到作弊的效果。
PC端
PC上修改記憶體也有對應的軟體,例如Cheat Engine,就類似手機上的八門神器,如何應用見下圖:
如何防作弊
Unity開發推薦一款外掛程式Anti-Cheat Toolkit,自行上Asset Store下載。具體原理就是我們透過資料混淆,UI上顯示的值其實是我們經過計算出來的值,所以記憶體修改器根據UI上顯示出來的值去搜記憶體位址是搜不到的。
防作弊原理
private int curATK; private int curAtkKey; public int CurATK { get { return curATK ^ curAtkKey; } set { curAtkKey = Random.Range(0, 0xffff); curATK = value^curAtkKey; } }
分析:^運算是異或運算,需要一點二進位的知識,異或運算是相同為0,不同為1,下面舉例:3 ^ 4=7,3對應的二進位是11,4對應的二進位是100,異或運算之後的結果二進位是111對應的十進位就是7,下圖程式驗證一下:
分析
根據上面的程式你是否真真明白是如何防作弊的呢,num是我們輸入的值,例如玩家目前的金幣數量是4,但我們UI上的顯示並不是直接Coin.Text = num.ToString(),這樣玩家搜到num的內存就很容易修改了,就作弊了,我們UI上的顯示值是hiddenValue^cryptoKey的值。玩家就算搜出num的數值並修改了,對我們顯示金幣真實的數量並沒有影響。
分析插件Anti-Cheat Toolkit
我們Unity開發估計很多人都會用這個插件,他是如何實現資料加密的呢,我們看下手冊就會知道它是將Unity的基本資料類型都封裝了一個對應的資料類型,例如:int->ObscuredInt,Float->ObscuredFloat,string->ObscuredString等。拿ObscuredInt舉例:
會發現它封裝了一個跟Int對應的結構體,並且有一個混淆因子cryptoKey=444444,我們再看string類型的封裝的一個類別ObscuredString,它的混淆因子是string cryptoKey=“4441”,如果我們用這個插件啥都不修改,那如果我是黑客,我知道當前某遊戲是Unity開發的並且數據做了防外掛處理,那麼我如何破解防外掛,我肯定首先就想到的就是這個插件,並且知道這些混淆因子,那麼我就相對容易能破解出來,所以如何再進一步防外掛,就必須要對插件的混合因子再做一個混淆或者修改就顯得很重要。
以上是遊戲開發防作弊以及原理簡述的詳細內容。更多資訊請關注PHP中文網其他相關文章!