天天看點

遊戲開發防作弊以及原理

原文連結

http://dingixaowei.cn/2019/06/20/ (手動複制到浏覽器打開)

無意中發現了一個巨牛巨牛的人工智能教程,忍不住分享一下給大家。教程不僅是零基礎,通俗易懂,小白也能學,而且非常風趣幽默,還時不時有内涵段子,像看小說一樣,哈哈~我正在學習中,覺得太牛了,是以分享給大家。點這裡可以跳轉到教程!

前言

如何防作弊在遊戲開發中還是占蠻重的比例的,這也涉及到遊戲盈利的問題,如果不做防作弊措施,或許我們開發出來的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開發的并且資料做了防外挂處理,那麼我如何破解防外挂,我肯定首先就想到的就是這個插件,并且知道這些混淆因子,那麼我就相對容易能破解出來,是以如何再進一步防外挂,就必須要對插件的混合因子再做一個混淆或者修改就顯得很重要。

更多精品文章

http://dingxiaowei.cn (手動複制到浏覽器)

繼續閱讀