前面的文章,我們介紹了inline hook、硬體斷點hook、遠端執行緒、程式碼完整性校驗。其實都是為了本篇文章做鋪墊,作者做過3年的遊戲反外掛工作,今天就把反外掛技術做一個總結。
反外掛工作感悟
永遠在路上
沒有破解不了的反外掛系統,反外掛是一個對抗過程,需要不斷升級。我們反外掛小組會採取對抗方式提升防禦,也會研究競品來獲取靈感。反外掛也是非常有意思的,可以學到很多很多底層知識。
善戰者無赫赫之功
反外掛,很難做出成績,你把遊戲保護的固若金湯,你會顯得很平庸,可有可無。但是如果一旦有一款外掛不能及時防禦,你又會顯得很無能,所以我選擇離開這個行業,主要是所在城市沒有太多選擇。
本文的結構如下:
1 反除錯
反除錯是反外掛中很重要的環節,可以提高外掛作者的門檻。每一種反外掛手段我們成為“暗樁”,其實沒有不能破解的反外掛手段,但是如果“暗樁”太多,對於外掛作者也是很難除錯遊戲的。
下面開始介紹一些反外掛手段。 這裡有一個很好的網站,裡面包含8大類反除錯技術,感興趣可以看一下。
https://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的程式碼段,發現修改就把版本和修改的地址上報,會定時分析其中可疑的味道。
- 檔案上傳:這個功能有點流氓,我們控制檯可以指定上傳玩家本地的檔案,是我們收集外掛的重要手段。
最後,求關注、點贊、轉發,謝謝~