遊戲反外掛技術揭秘

前面的文章,我們介紹了inline hook、硬體斷點hook、遠程執行緒、程式碼完整性校驗。其實都是為了本篇文章做鋪墊,作者做過3年的遊戲反外掛工作,今天就把反外掛技術做一個總結。

反外掛工作感悟

永遠在路上

沒有破解不了的反外掛系統,反外掛是一個對抗過程,需要不斷升級。我們反外掛小組會採取對抗方式提升防禦,也會研究競品來獲取靈感。反外掛也是非常有意思的,可以學到很多很多底層知識。

善戰者無赫赫之功

反外掛,很難做出成績,你把遊戲保護的固若金湯,你會顯得很平庸,可有可無。但是如果一旦有一款外掛不能及時防禦,你又會顯得很無能,所以我選擇離開這個行業,主要是所在城市沒有太多選擇。

本文的結構如下:
結構圖

1 反調試

反調試是反外掛中很重要的環節,可以提高外掛作者的門檻。每一種反外掛手段我們成為「暗樁」,其實沒有不能破解的反外掛手段,但是如果「暗樁」太多,對於外掛作者也是很難調試遊戲的。

下面開始介紹一些反外掛手段。 這裡有一個很好的網站,裡面包含8大類反調試技術,感興趣可以看一下。
//anti-debug.checkpoint.com/

1.1 調試檢測

1.1.1 執行時間

當遊戲被調試時,運行肯定會變慢,我們可以檢測遊戲主循環的運行時間,來判斷是否被調試,實際上這種檢測是最難拔出的「暗樁」。

1.1.2 調試位檢測

windows提供了一些api來檢測,例如IsDebuggerPresentCheckRemoteDebuggerPresent

// IsDebuggerPresent
static bool xx_is_debug_1() {
	return IsDebuggerPresent();
}

// CheckRemoteDebuggerPresent
static bool xx_is_debug_2() {
	BOOL debuged = false;
	bool ret =  CheckRemoteDebuggerPresent(GetCurrentProcess(), &debuged);
	return ret && TRUE == debuged;
}

1.2 硬體斷點檢測

硬體斷點既是調試手段、也是一種hook手段,反外掛時一定要檢測的。檢測時有兩種手段:

  1. GetThreadContext:獲取暫存器資訊,判斷Dr0~Dr3如果不是0,則被下了硬體斷點。
  2. 硬體斷點占坑:硬體斷點只有4個,反外掛系統把硬體斷點佔住,我只要檢測我的斷點存在即可。

我使用了硬體斷點占坑方式檢測,因為調用GetThreadContext檢測時容易被hook。

後期我們做對抗時,發現可以用設置記憶體屬性,來繞過硬體斷點占坑,以後會寫一篇文章來介紹。

2 外掛檢測-特徵

遊戲反外掛系統會「主動出擊」,檢測一些「知名」的通用外掛工具,例如cheat engine、OD調試器、變速齒輪等。檢測的方式可以是進程名、窗口名、模組名(dll)等資訊。反外掛系統還會從服務端動態拉取一些特徵庫,實現不停服升級反外掛系統。

當然特徵檢測主要還是為了提高外掛製作門檻,不能起到太大作用,有勝於無吧。

3 自我保護

遊戲反外掛系統做的再牛,把遊戲保護的再好,但是如果反外掛系統被本身幹掉了也就白玩了,所以自我保護是重中之重。

3.1 反外掛執行緒保護

反外掛系統會啟動一個反外掛執行緒來檢測,不在主執行緒運行,以免拖慢遊戲程式,首先我們就要保護反外掛執行緒不被幹掉。

我們採取使用遊戲主執行緒與反外掛執行緒守望相助,由主執行緒專門來檢測反外掛執行緒的存貨,反外掛執行緒可以採取更新變數、訊號等方式通知主執行緒自己存活。如果主執行緒檢測到反外掛執行緒不正常工作,就退出遊戲程式。

3.2 安全退出

當發現外掛或發現被調試時,遊戲程式會彈框提示玩家,然後再退出遊戲。如果不做保護,外掛作者可以從彈框入手、順藤摸瓜來分析反外掛的工作原理,然後指定破解方法。

這裡主要防禦手段是:延遲退出;堆棧清理。

3.2.1 延遲退出

當發現異常後,反外掛系統不會立即退出,做個標記然後等一會退出,這樣被分析時也不會是第一執行緒,無法定位工作原理。

3.2.2 堆棧清理

彈框時,我們要做堆棧清理,把堆棧弄亂,讓外掛作者無法分析調用關係。

    DWORD dwEBP = 0,dwEBPMain = m_MainEBP.GetT();
    __asm
    {
        mov dwEBP,ebp
    }
    while (dwEBP < dwEBPMain)
    {
        *((DWORD*)dwEBP) = 0;
        dwEBP += 4;
    }

4 遊戲保護

遊戲保護是反外掛的根本,是反外掛系統的內功,以不變應萬變。

4.1 程式碼保護

程式碼保護時要考慮執行效率,進行不同的保護手段。

  • 反外掛程式碼:加殼保護,加殼可以混淆程式碼,增加調試難度。我選擇使用宇宙最強殼,vmprotect。
  • 遊戲程式碼:遊戲程式碼要考慮效率,無法加殼。這裡就使用前面介紹的程式碼完整性校驗,把PE文件重定位、修復導入表以後進行校驗。

4.2 數據保護

一些遊戲記憶體數據也需要進行保護,一些敏感字元串,一些重要遊戲屬性。

  • 字元串保護:例如「發現外掛」,如果明文保存,很容易被od搜索出來,然後定位使用的位置。我們採取簡單加密,只要搜索不出來即可。
  • 遊戲記憶體保護:我採取動態多級指針,每次啟動隨機指針的級數,這個不知道作用有多大,畢竟沒和外掛作者討論過。很多保護措施都是我們反外掛小組攻防實驗時,加固的。

5 資訊收集

資訊收集是反外掛系統的重要組成部分,可以幫助我們收集玩家使用外掛證據、收集外掛等。

  • 玩家監控:我們會重點監控「重點玩家」的資訊,重點玩家來自於玩家舉報,我們會加入監控觀察一周。
  • 遊戲程式修改:反外掛系統會全量檢測遊戲.exe和d3d9.dll的程式碼段,發現修改就把版本和修改的地址上報,會定時分析其中可疑的味道。
  • 文件上傳:這個功能有點流氓,我們控制台可以指定上傳玩家本地的文件,是我們收集外掛的重要手段。

最後,求關注、點贊、轉發,謝謝~
求關注