前言
手游發展至今,與外掛的對抗中,顯然我們手游安全保護已占據上風,今天就帶大家了解了解是如何區分玩家是否使用外掛的原理,
外掛原理分析
透視類外掛
此類外掛通常分為2種
1.修改游戲人物模型渲染資料實作地圖穿透效果
2.讀取游戲角色坐標繪制到螢屏上
對于第1種方式我們很輕易檢測出來,由于通常模型資料并不是動態的,我們可以在初始化模型資料后,記錄資料的crc32校驗值,每隔一段時間對資料進行一次校驗對比,
第2種方式,我們想要檢測出來難度就大大增加了,因為我們并不能判斷外掛是否訪問了角色記憶體地址,再因為安卓并不像windows,游戲權限并沒有外掛高,游戲僅限于用戶態,然而,外掛程式通常為內核態,所以我們只能在應用本身想辦法,
自瞄類外掛
此型別外掛實作方式很多,不過通常在FPS類游戲中實作方法是修改滑鼠坐標(準星),moba類游戲中則是修改技能坐標,由于準星資料是動態的,我們檢測難度也是很高,不過,這怎么能難到我們聰明絕’頂’的工程師呢?
我們首先需要找到此類外掛的特點,比如,準星會追隨角色坐標,我們可以對子彈預瞄軌跡,命中率,爆頭率等資料進行計算得知此玩家是否開了自瞄掛,但是,對于那種技術好的玩家,又可能會誤判,調整檢測閥值又可能會漏網一些外掛玩家,怎么辦呢?時間有限,我們下期文章再說,
進入主題
歸根結底,上述的自瞄類外掛和透視類外掛都需要讀取游戲內角色坐標,所以,理論來說,只要能夠判斷角色地址是否被第三方工具訪問,便能解決此類問題,如何解決呢?
我們先來了解一下Linux記憶體管理,
在linux作業系統有虛擬記憶體與物理記憶體的概念,
虛擬記憶體與物理記憶體的關系圖

頁表作業原理

我們的cpu想訪問虛擬地址所在的虛擬頁(VP3),根據頁表,找出頁表中第三條的值.判斷有效位, 如果有效位為1,DRMA快取命中,根據物理頁號,找到物理頁當中的內容,回傳,
若有效位為0,引數缺頁例外,呼叫內核缺頁例外處理程式,內核通過頁面置換演算法選擇一個頁面作為被覆寫的頁面,將該頁的內容重繪到磁盤空間當中,然后把VP3映射的磁盤檔案快取到該物理頁上面,然后頁表中第三條,有效位變成1,第二部分存盤上了可以對應物理記憶體頁的地址的內容,
缺頁例外處理完畢后,回傳中斷前的指令,重新執行,此時快取命中,執行1,
將找到的內容映射到告訴快取當中,CPU從告訴快取中獲取該值,結束,
有一篇博客已經將此相關內容講解的很詳細了,傳送門:虛擬記憶體與物理記憶體的聯系與區別
回歸主題,上面所述有個關鍵詞叫缺頁例外
比如我們呼叫mmap來映射記憶體,為了防止記憶體無效分配,該記憶體空間在未訪問時是不會創建物理記憶體頁的,當程式需要使用這塊記憶體區域時,會觸發缺頁中斷,然后系統才會創建物理記憶體頁,
由此我們誕生了一種近乎完美的外掛檢測方案,通過在對局角色陣列中插入缺頁記憶體地址,使外掛無法識別是否是正常游戲角色資料,從而觸發檢測,
在這里我們需要學習一個函式:mincore
#include <unistd.h>
#include <sys/mman.h>
int mincore(void *start, size_t length, unsigned char *vec);
函式說明:
mincore()請求向量,描述檔案的哪些頁位于核心,可以在沒有磁盤訪問的情況下讀取,內核將為長度后面的位元組開始地址,回傳時,內核將填滿VEC使用位元組,其中最小有效位指示頁是否為核心駐留,
官方介紹大家可能沒看明白,看下面案例可能就明白了
int pageSize = getpagesize();
unsigned char vec = 0;
unsigned long start = addr & (~(pageSize - 1));
mincore((void *)start, pageSize, &vec);
if (vec == 1)
{
printf("記憶體頁:%p 存在與物理記憶體空間",addr);
}else{
printf("記憶體頁:%p 不存在與物理記憶體空間",addr);
}
到這里就很清晰了,我們通過判斷在對局角色插入的缺頁記憶體地址,即可知道玩家是否使用了外掛!
例如騰訊手游,網易手游等都是使用了此方案,
由于時間關系,也就不放相關案例了,下一期講解外掛是如何使用各種注入實作hook修改游戲函式以及如何防止游戲被hook,點個關注不迷路,
轉載請注明出處:https://xiaowu.blog.csdn.net/article/details/119471016
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292594.html
標籤:其他
上一篇:簡易掃雷游戲的詳解
