外掛程式憑著前一篇介紹的三板斧算是應付過了warden的第一**擊。但是還有乙個問題沒有解決:外掛程式的工作原理是通過安裝旁路點(detour patch)修改原有遊戲**的流程,從而獲得遊戲的控制權。但是從反檢測的角度來看,這種工作方式簡直是噩夢-檢測起來太容易了。在這方面那些不依賴於截獲遊戲**工作的外掛程式(d2hackmap和基於autoit的mmbot等都是)具有天然的優勢。對於maphack這種必須依賴於截獲遊戲**工作的外掛程式,一種可能的解決方法是利用x86的硬體斷點暫存器。熟悉x86架構的朋友知道,80386以後的cpu提供4個除錯位址暫存器(dr0-dr3)支援硬體斷點功能。通過在遊戲**的合適位置設定硬體斷點,我們不用修改遊戲**也同樣能夠達到旁路點的作用,獲得遊戲的控制權。netter的easymap/easyplay後來的版本以及wow的一些外掛程式都基於硬體斷點工作。這種方法比較大的缺點在於除錯位址暫存器只有4個,也就是說同一時刻你只能截獲4個地方。d2的maphack以前由於沒有天敵,根本沒想到後來會有warden這種東西,發展到現在大約用了100個旁路點,相比起來4個硬體斷點只是杯水車薪,根本不夠用。這是為什麼做乙個安全的全功能的maphack非常困難的最大原因。wow的外掛程式就幸福多了,我看過的一些wow外掛程式一般只是截獲packet的接收函式(我對wow的了解非常有限,也可能不對,搞wow外掛程式的朋友不要丟磚頭)。不過即使這樣,解決辦法也不是沒有,我覺得乙個比較好的思路是blackhat 2005上提出的一種方法:shadow walker: raising the bar for windows rootkit detection。這種方法的要點是想辦法把記憶體頁面的執行屬性和讀屬性區分開來,對相同的記憶體虛擬位址,當它裡面的內容做為**被執行時對映到一處物理記憶體,它裡面的內容被別的**讀取時則對映到另一處物理記憶體。這樣,對於外掛程式應用來說,在遊戲**執行時它用的是「髒」頁面(即安裝了旁路點的記憶體),在warden進行memory probe檢測時則對映到「乾淨」頁面!這種方法是比較理想的,缺點是實現起來相當的麻煩,有很多細節要考慮。
現在來看warden的mod。針對easymap/easyplay的manualmap和硬體斷點法,.mod通過記憶體掃瞄,檢測api hook(硬體斷點法需要截獲一些win32 api)和檢測特定的字串,後來又成功抓住了幾次easymap。針對.mod簽名,暴雪有一段時期傳送了很多可以變形但功能相同的.mod(是不是有點兒像病毒),大大干擾了使用外掛程式的玩家和黑客。另外為了讓黑客無法得到所有.mod,同乙個.mod也可能不會向所有玩家傳送。再後來,.mod開始檢查資料的完整性。用過maphack的玩家都知道maphack在遊戲裡會在打出一些話(例如進入遊戲時的welcome資訊 "mousepad's diablo ii maphack 1.11b (v7.1) installed.",d2jsp等外掛程式也有類似的輸出資訊)。在最近的一次打擊中,暴雪就是通過檢測這些log資訊抓了很多外掛程式(mousepad重寫了半年的maphack 7.2,在它的beta4時就是因為那句welcome資訊被抓到的)。據說,在wow中,.mod還使用過stack trace(分析棧上的內容)等手段。
我的看法,在這場對抗中,暴雪和黑客各有各的優勢。暴雪的優勢在於他是遊戲規則的制定者,怎麼檢測、檢測哪些東西由他來定,只需抓住一處漏洞即可,掌握著主動權。黑客的優勢在於他可以利用客戶端的全部資源來欺騙warden,比如說利用kmd、限制遊戲程序許可權等;最大的劣勢是難以提防周全,只要稍有不甚一點沒顧到就可能被抓。總的來說,對於公開發布的外掛程式,我覺得暴雪是占上風的,但是對於那些在私下用的外掛程式,黑客還是有一定優勢的。
暴雪和黑客的戰爭七 Warden和外掛程式的進化(二)
外掛程式憑著前一篇 介紹的三板斧算是應付過了warden的第一 擊。但是還有乙個問題沒有解決 外掛程式的工作原理是通過安裝旁路點 detour patch 修改原有遊戲 的流程,從而獲得遊戲的控制權。但是從反檢測的角度來看,這種工作方式簡直是噩夢 檢測起來太容易了。在這方面那些不依賴於截獲遊戲 工作...
暴雪和黑客的戰爭一 外掛程式的幸福時光
在這個過程中,由於版本檢查dll儲存在伺服器端,因此顯然它可能會被隨時修改,增加一些其他功能,如檢測。從版本檢測相關 見文末 呼叫的win32 api,loadlibrarya getprocaddress freelibrary deletefilea,可以大致看出這一過程。另外一處不為人知的機制...
Sizeof和Strlen的戰爭
在這裡插入 片 include include include int main printf d n strlen arr ub printf d n strlen arr 0 ub printf d n strlen arr printf d n strlen arr 1 char arr ab...