遊戲反外掛技術揭秘
前面的文章,我們介紹了inline hook、硬體斷點hook、遠程執行緒、程式碼完整性校驗。其實都是為了本篇文章做鋪墊,作者做過3年的遊戲反外掛工作,今天就把反外掛技術做一個總結。
反外掛工作感悟
永遠在路上
沒有破解不了的反外掛系統,反外掛是一個對抗過程,需要不斷升級。我們反外掛小組會採取對抗方式提升防禦,也會研究競品來獲取靈感。反外掛也是非常有意思的,可以學到很多很多底層知識。
善戰者無赫赫之功
反外掛,很難做出成績,你把遊戲保護的固若金湯,你會顯得很平庸,可有可無。但是如果一旦有一款外掛不能及時防禦,你又會顯得很無能,所以我選擇離開這個行業,主要是所在城市沒有太多選擇。
本文的結構如下:
1 反調試
反調試是反外掛中很重要的環節,可以提高外掛作者的門檻。每一種反外掛手段我們成為「暗樁」,其實沒有不能破解的反外掛手段,但是如果「暗樁」太多,對於外掛作者也是很難調試遊戲的。
下面開始介紹一些反外掛手段。 這裡有一個很好的網站,裡面包含8大類反調試技術,感興趣可以看一下。
//anti-debug.checkpoint.com/
1.1 調試檢測
1.1.1 執行時間
當遊戲被調試時,運行肯定會變慢,我們可以檢測遊戲主循環的運行時間,來判斷是否被調試,實際上這種檢測是最難拔出的「暗樁」。
1.1.2 調試位檢測
windows提供了一些api來檢測,例如IsDebuggerPresent
、CheckRemoteDebuggerPresent
。
// 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手段,反外掛時一定要檢測的。檢測時有兩種手段:
GetThreadContext
:獲取暫存器資訊,判斷Dr0~Dr3如果不是0,則被下了硬體斷點。- 硬體斷點占坑:硬體斷點只有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的程式碼段,發現修改就把版本和修改的地址上報,會定時分析其中可疑的味道。
- 文件上傳:這個功能有點流氓,我們控制台可以指定上傳玩家本地的文件,是我們收集外掛的重要手段。
最後,求關注、點贊、轉發,謝謝~