開發(fā)游戲時(shí),我們需要保護(hù)儲(chǔ)存在客戶端中的重要數(shù)據(jù),防止被玩家修改數(shù)據(jù)從而達(dá)到"開掛"的效果。
內(nèi)存修改器的下載地址:cheat ngine:https://www.cheatengine.org/index.php
當(dāng)然這種內(nèi)存修改器有很多,原理都時(shí)一樣的讨韭。
一、Anti-Cheat Toolkit 介紹
Unity Asset Store 官方插件地址:官方鏈接
二癣蟋、Anti-Cheat Toolkit 可以做什么透硝?
? 保護(hù)內(nèi)存中的變量。
? 保護(hù)和擴(kuò)展PlayerPrefs疯搅。
? 生成構(gòu)建代碼簽名濒生。
? 檢測(cè)速度。
? 檢測(cè)時(shí)間作弊幔欧。
? 檢測(cè)3種常見類型的墻壁罪治。
? 檢測(cè)外部托管程序集丽声。
? 有ObscuredPrefs / PlayerPrefs編輯器。
二觉义、1.保護(hù)內(nèi)存中的變量
假設(shè)我們?cè)谕婊甓妨_的游戲雁社,一共有五條命(存放在內(nèi)存變量中,并用一個(gè)文本顯示)晒骇,每次死亡都會(huì)導(dǎo)致生命數(shù)-1(通過(guò)點(diǎn)擊按鈕模擬死亡)霉撵。直到生命為0時(shí)結(jié)束游戲。效果如下:
下面時(shí)實(shí)現(xiàn)代碼:
usingUnityEngine;
usingUnityEngine.UI;
namespaceTest{
publicclassNewBehaviourScript:MonoBehaviour
? ? {
[SerializeField] Text text;
[SerializeField] Button btn;
//生命數(shù)
publicintlive =5;
voidStart()
? ? ? ? {
text.text ="剩余生命:"+ live;
? ? ? ? ? ? btn.onClick.AddListener(() => {
? ? ? ? ? ? ? ? live--;
if(live >0)
? ? ? ? ? ? ? ? {
text.text ="剩余生命:"+ live;
? ? ? ? ? ? ? ? }
else
? ? ? ? ? ? ? ? {
text.text ="游戲結(jié)束";
? ? ? ? ? ? ? ? }
? ? ? ? ? ? });
? ? ? ? }
? ? }
}
Unity運(yùn)行狀態(tài)洪囤,打開我們下載好的修改器
為了方便測(cè)試(因?yàn)閮?nèi)存中5的值特別多徒坡,掃描結(jié)果不直觀)我們將測(cè)試的live值改為200,然后先First Scan 200的數(shù)據(jù)瘤缩,接著喇完,我們先點(diǎn)擊Unity的Dead按鈕,使值變?yōu)?99剥啤,然后在Cheat Engine中將value的200改為199锦溪,點(diǎn)擊Next Scan按鈕(如果結(jié)果還是多,重復(fù)減生命铐殃,直到少的為止)海洼。
修改內(nèi)存中的值:
修改完之后點(diǎn)擊Dead 發(fā)現(xiàn):
使用Anti-Cheat Toolkit插件 后的代碼:
//生命數(shù)
publicCodeStage.AntiCheat.ObscuredTypes.ObscuredInt live =5;
這樣內(nèi)存中就搜索不到對(duì)應(yīng)的值,為了更加安全我們可以加上監(jiān)聽富腊,監(jiān)聽數(shù)據(jù)被意外修改后應(yīng)該怎么處理(退出游戲,彈框等等)
監(jiān)聽的方法有兩種:
????1.監(jiān)聽事件自己預(yù)設(shè):
? ? ? ? 導(dǎo)入Anti-Cheat Toolkit插件 后 域帐,選中場(chǎng)景中的任意Gameobject 右鍵 Create other -->Code Stage -->Anti-Cheat Toolkit -->Obscured Cheating Detector
上面的數(shù)值什么的我不再一一說(shuō)明赘被,基本上百度一下就可以知道是什么意思。
事件綁定后如圖:
?2.監(jiān)聽事件代碼賦值:
????代碼如下:
????????????ObscuredCheatingDetector obscuredCheatingDetector = ObscuredCheatingDetector.AddToSceneOrGetExisting();
? ? ? ? ? ? obscuredCheatingDetector.enabled = true;
? ? ? ? ? ? ObscuredCheatingDetector.StartDetection(Obscured_CheatDetected);
public void Obscured_CheatDetected()
? ? {
? ? ? ? // 檢測(cè)到數(shù)據(jù)被意外修改后的邏輯
? ? }
運(yùn)行時(shí)會(huì)自動(dòng)創(chuàng)建Anti-Cheat Toolkit 的物體并掛載ObscuredCheatingDetector 腳本肖揣,并添加上監(jiān)聽的事件
總結(jié):1.不論是自動(dòng)創(chuàng)建的Anti-Cheat Toolkit物體都是不銷毀的
? ? ? ? 2.Anti-Cheat Toolkit插件提供了很多加密的類型民假,如ObscuredFloat,ObscuredString龙优,ObscuredVector3等等羊异,其內(nèi)部代碼也不難理解,就是 對(duì)原始數(shù)據(jù)進(jìn)行了簡(jiǎn)單的異或處理彤断,從而達(dá)到加密的效果野舶。(原理:A^B=C,C^B=A)
? ? ? ? 3.同時(shí)還提供了ObscuredPrefs來(lái)替代PlayerPrefs宰衙。
剩下的內(nèi)容等有時(shí)間再給大家分享平道,另外有時(shí)間會(huì)再出一個(gè)Unity混淆的插件,和這個(gè)插件配合使用效果會(huì)更好供炼。
參考文章:https://blog.csdn.net/wangjiangrong/article/details/93021172
每天多學(xué)一點(diǎn)一屋,每天進(jìn)步一點(diǎn)窘疮。