暴雪和黑客的戰爭六:Warden和外掛的進化(一)

Warden的機制使得暴雪能夠在不需要更新客戶端的情況下任意更新作弊檢測代碼。事實上,自從D2升級到1.11以來,Warden的檢測mod和外掛雙方一直都在針對對方的改變而進化。這一篇介紹外掛如何躲避前一篇提到的.mod使用的三種檢測方法:DLL掃描、進程掃描和窗口掃描。

躲避DLL掃描

前面介紹過,外掛一般是做爲一個普通的DLL遠程注入到遊戲進程進行工作的,因此Warden mod最早的檢測手段是搜查遊戲進程內加載的特定DLL名稱(通過Module32First/Module32Next)。那麼如何避免這種檢測呢,一種簡單的方法是截獲Module32First/Module32Next,但由於枚舉DLL的方法有多種,Windows 9x平臺和NT平臺也有區別,這種方法比較麻煩。高級一點的做法是利用進程內加載的所有模塊由PEB(進程環境塊)結構中的一個模塊鏈表維護這一事實,簡單的把外掛模塊從鏈表中斷開就可達到隱身的目的,當然這種方法只能用在Windows NT based系統中(包括NT/2K/XP/2K3)。更進一步的做法是自己編寫DLL裝載代碼進行手工加載,這樣它不會存在PEB的模塊鏈表中,當然也就不會被Module32First/Module32Next找到。手工加載DLL看起來似乎很難,但其實網上就有現成的源代碼,我的Remote Run Library就能做到,我自己最早則是從著名的back door軟件Back Orifice 2000中學會的。EasyMap早期的一個版本用的斷開模塊鏈表法,後來則用了Darawk的ManualMap手工加載。

躲避進程掃描

.mod檢查外掛的另外一種方法是進程掃描(Process32First/Process32Next)。外掛一般會有一個loader負責把真正的外掛模塊注入到遊戲進程,或者有些外掛(基於AutoIt的BOT等)乾脆就是一個獨立的進程,因此避免這些進程被掃描到也是必要的。避開進程掃描的一種有效的方法是外掛進程的運行時間儘可能短(EasyMap/EasyPlay用的是這種策略),但這隻對那些沒有界面的loader進程有效。另外一種方法是進程隱藏。進程隱藏的方法有好多種,我的Remote Run Library就能做到(把外掛進程注入到宿主進程),這是d2hackmap的做法。另一種方法跟DLL隱藏類似,通過打開//Device//PhysicalMemory內核對象直接操縱物理內存,從系統活動進程鏈表中把外掛進程去掉-當然這種方法也只能用在Windows NT based系統中。甚至你還可以寫個KMD(Kernel Mode Driver)來做,不過這就有點兒小題大做了。

其實躲避進程掃描還有的另外一種簡單的方法,即限制遊戲進程的權限,直接讓Process32First/Process32Next調用失敗。這個用一些現成的軟件可以做到,我記得在WOW!Sharp剛被BAN的時候老外們討論的比較多的一個是ProcessGuard。另外一個我覺得更方便的是Sysinternals的PsTools裏的一個小工具psexec.exe。psexec.exe一個很棒的功能是可以以儘可能小的權限運行一個程序,命令十分簡單:

psexec.exe -l -d "D:gamesDiablo IIDiablo II.exe" -w
順便說一下,推薦大家用這種方法運行瀏覽器,可以避免你無意中中了流氓軟件的招。

躲避窗口枚舉(EnumWindows)

對於有GUI的外掛進程(如d2hackmap),避開窗口掃描也是必要的。由於EnumWindows方法主要是檢測一些固定的window title或window class字符串,因此可行的方法是把這些字符串隨機化。

.mod的數字簽名

由於.mod隨時可變,鑑別哪些.mod是安全的是非常必要的。做法和以前提到的對付version-checking.dll和extrawork.dll的方法一樣:分析已截獲的.mod,針對這些.mod的檢測方法實現相應的反檢測,然後計算它的簽名,把簽名加到安全.mod列表中去。這樣外掛就可以在.mod運行前通過計算它的簽名和安全列表裏的比較,遇到危險或者爲止模塊就能及時停止工作。
d2maphack用的算法是MD5。EasyMap/EasyPlay系列則在比較長的一段時間裏一直用CRC!有點兒密碼學常識就能知道,CRC顯然不是一個合格的簽名算法-讓兩個不同的.mod具有相同的CRC是很容易的事。在這點上EasyMap/EasyPlay很長一段時間內是有漏洞的,不過暴雪倒是一直也沒有利用這一點。再後來,在別人的提醒下,netter終於意識到了這個問題,改用了SHA-256(我和其他黑客都提到過MD5在理論上也是不安全的,因此netter選擇了SHA-256)。下面是我曾經給出的一個針對Maphack的MD5簽名的可能的攻擊序列:

1,做兩個warden mod,其中.mod1是安全的(即不能檢測出Maphack ),.mod2可以檢測出Maphack。
2,計算.mod2的MD5 hash。
3,以.mod1爲前綴,找出一個collision,使得MD5(.mod1+collision) = MD5(.mod2)。
4,發送.mod1+collision到客戶端。
5,用戶分析.mod2發現它是安全的,因此把它加入安全列表。
6,發送.mod2到客戶端。
7,簽名檢查會認爲它是安全的,這樣玩家就被抓了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章