防外挂和防木马的通用解决方案
[轉]防外掛和防木馬的通用解決方案
Posted on 2012-01-19 11:30 單魚游弋 閱讀(110) 評論(0) 編輯 收藏外掛、木馬和私服一直網絡游戲的三大死敵。一個不小心被任意一個家伙打倒,一款好好的網絡游戲就全毀了。
在這里我要講一下防外掛和防木馬的一個通用解決方案,希望能解決大多數的外掛和木馬問題。從原理上看,也可以用于防私服,具體是否可行,請大家斟酌。這個方案受到了傳奇的反外掛方案的啟發,在這里對盛大表達感謝。
該方案包括“兩點一線”。其中一個“點”是偵測代碼,檢查外掛和木馬是否存在,有點象個“偵察員”。另一個“點”是攻擊代碼,可以抓玩家進監獄,也可以通知玩家修改密碼,有點象個“狙擊手”。一條“線”是指發現外掛或木馬的信息要安全的從偵察員傳到狙擊手那里,有點象“電話線”。下面我分別介紹這“兩點一線”的設計要點。
一、“偵察員”。
偵察員要有什么特點呢?
第一要會隱蔽。
培養偵察員不容易,寫一個偵測代碼也不容易,一但被敵人發現了,很容易被繳械或者被擊斃。下次又寫一段,又被發現搞定,一直這樣打拉鋸戰,也不是克敵制勝之法。
如果我們在客戶端放一段偵測代碼,一定要注意盡量不要被黑客用動態分析法(例如SoftIce),或反編譯法(例如MASM)等很容易的查到。例如不要在代碼段中包含任何可供識別的字符串,如出錯信息文字串,用于查找外掛的關鍵字字符串,包括外掛程序名,外掛進程名……。總之,盡量不要包含字符串就對了,如果要用也要加密后存放,并且解密字符串的過程中用到的臨時字符串變量要放在棧上,在用過之后最好全部置0。
在偵測代碼中,不要進行任何I/O操作,所有的通訊、界面消息、讀盤寫盤、顯示、接收鍵盤鼠標輸入等操作,都容易被黑客順藤摸瓜找到你的代碼段。也不要讀寫任何很容易被黑客監控的內存,包括全局變量和堆變量。因為黑客很容易通過監控內存的修改來找出你的代碼段。
偵測代碼也不要嵌放在容易動態跟蹤的“程序初始化”部分,或者任何固定時間或固定條件下會運行的部分。最好是比較隨機的觸發偵測代碼,增加黑客追蹤你的難度。
還有一點,就是偵測代碼建議不要寫成一個獨立的函數,而是做成個內嵌宏的代碼,這樣雜在功能代碼中間,更不容易被黑客找到。
第二要多樣化。
通過多樣化能解決正確性的問題。大家都知道抓錯人、殺錯人是什么后果。一但你把一個沒有用外掛的玩家抓進外掛監獄,或者把沒有被木馬盜號的帳號強行鎖定,那會比你少抓10個甚至少抓100個更嚴重的傷害到玩家。
除了在發布前認真測試之外,一個比較好的方法就是多做幾個“偵察員”,狙擊手根據多個偵察員匯報的情況進行加權判斷,寧可放過、不可枉殺。必竟“人”命關天啊。
多做幾個偵察員的好處還在于,萬一有個別的偵察員被黑客“殺掉”,狙擊手也不會變成“瞎子”。同時狙擊手還可以根據有問題的偵察員的情況,報告總部該偵察員已死亡,讓總部重新增派偵察員過來。
所以在程序中可以按時間長短設計3種偵測代碼。一種是啟動之后就盡快檢測并報告給狙擊手。這種代碼比較容易被黑客查出,也可以讓此代碼成為一個陷阱,以了解黑客破解我們的情況。
另一種是過幾分鐘之或幾十分鐘后再進行檢測,這種代碼的破解難度會很大,因為黑客破解一段代碼,通常要嘗試許多次,延遲了檢測時間,無疑會增加破解的時間成本。可以用這一類檢測的報告,作為判斷是否被攻擊的主要依據。
第三種檢測最好1小時以后再啟動,甚至是啟動數次才會檢測一次。這段代碼報告的情況,可以檢查出之前的其它檢測代碼是否被黑客全部破解,以提醒程序員是否需要重建防御體系,或者改用其它方案。這一類檢測方法不是必須的,可做可不做。
另外要注意的是,各段檢測代碼一定不要用完全相同的代碼(即程序二進制碼相同),或者各段代碼都檢測唯一的一個外掛特征或木馬特征。如果想同一段檢測代碼放到不同的位置,在不同的時間段進行檢測,也要在不影響功能的前提下,調整一些代碼行的前后順序,以防黑客利用相同的代碼串,查找另一個檢測點的代碼??傊?#xff0c;各個檢測代碼要盡可能的不同,檢測的外掛特征或木馬特征也要多樣化。
二、“狙擊手”。
狙擊手要有什么特點呢?
第一還是要會隱蔽。
為什么要隱蔽?要是不隱蔽,你還有機會開第二槍么?人家知道你在哪里了,還不會躲么?
外掛和木馬比較好的隱蔽方法,是把狙擊手放在服務端。黑客無法修改服務端,服務端可以任意抓玩家進外掛監獄或者通知玩家修改密碼,外掛和木馬無法阻止我。
對于私服要麻煩一些,因為狙擊手必須藏在黑客手中的服務端內。攻擊時不僅要注意隨機性觸發,還可以采用亂寫內存等比較隱藏的手段。觸發藍屏也是個辦法,但要防止黑客“鉤住”觸發藍屏的路徑,否則就會暴露自己。
第二是要延時。
千萬不要在偵察員剛上報敵情時就立即開槍。這無疑是直接告訴黑客偵察員在什么山頭上,好讓對方輕松的剿滅我們的偵察員。好的狙擊手問題會等待最佳的射擊時機。
一定要做足夠的延時,讓敵人多過幾個山頭之后,再開槍殺敵。這樣黑客就不知道偵察員在到底在哪個山頭上,也就能很好的保護我們可愛的偵察員了。
比如我們客戶端有一段檢測代碼會在打開倉庫時檢查是否存在外掛。如果玩家剛一打開倉庫,你就立即將他抓進外掛監獄。那么黑客就能猜出有一段檢測代碼嵌入在打開倉庫的代碼中。只要跟蹤一下或者讀一下代碼,就能很容易找出我們的偵察員。要殺要剮還不由他說了算?
但如果我們有做延時,等玩家又開始用外掛練功、用外掛撿錢、用外掛走路之后。狙擊手再一槍搞定,送玩家進外掛監獄。這樣黑客就有得忙了,練功的地方、撿錢的地方、走路的地方,都要去查是不是有檢測代碼,而且可能查了N久都查不出來,還以為自己的水平太臭。狙擊手在一旁就可以偷笑了。
第三要保護。
因為延時出擊的原故,敵人可能在延時的時間里大開殺戒,造成重大損失。這時一定要對可能造成的傷害進行必要的保護。以保證在出擊之前,減少無辜玩家的損失。
例如客戶端發現了木馬并上報給了服務端。這時如果狙擊手立即出手,告訴玩家密碼已經被盜的事實,無疑違反了第二條“要延時”的原則,極容易暴露我們偵察員的位置。
比較好的解決辦法是,發現木馬后,立即采用“鎖定玩家帳號”之類的辦法,保護玩家在延時期間不被黑客盜號,再延時之后通知玩家及時更換密碼。
要注意的一點,就是保護要悄悄的進行。如果黑客能探測出你什么時候開始保護的,就能知道偵察員發現他的時機,這就違反了狙擊手的第二條守則“延時”。所以在保護玩家利益的同時,也要保護好偵察員。
比如發現木馬后,立即鎖定的倉庫鎖,以保護玩家的重要資產。這時就給黑客一個探測偵察員什么時候發現木馬的方法,只要頻繁的扔一件極品武器,看服務端是否自動鎖定了倉庫鎖,就能探測到什么時候木馬被偵察員發現了。其實保護當前已登錄的玩家資產并無意義,通常這個玩家的身份是正確的。只有下次登錄時,才有可能是黑客在登錄。所以只需要下次登錄時再鎖定倉庫鎖,就能很好的保護玩家資產了。
三、“電話線”。
電話要怎么打才安全呢?
第一不要直接連線。
如果偵察員和狙擊手之間拉了一條電話線,只要找到一個,就能很容易的找到另一個。而后順藤摸瓜,所有成員都會全軍覆沒。
如果檢測代碼和攻擊代碼,都放在客戶端(以防私服為例),千萬不要在檢測代碼中直接調用攻擊代碼。否則找到了一個,就兩個都完蛋了。比較安全的做法是,把檢測結果合并到一個經常會被大量代碼使用的變量中(例如給這個整數變量增加1000000),然后在正常代碼中將此變量計算變化后再寫到更多的其它變量中,而攻擊代碼只在“其它位置”去讀出并分析偵察員發來的信號。
對于外掛和木馬就相對好一些,因為狙擊手在服務端,不存在會暴露的問題。
第二通訊要保密。
如果偵察員一發現敵人,就用明語在步話機上大叫“我看到敵人啦!我看到敵人啦!”,無疑這個偵察員一定很短命。
正確的做法是在一大堆正常的上傳消息中,隱蔽的夾雜著敵情信息。例如在上傳走路消息或戰斗消息時,上傳一個“不合理”的特殊數據。比如走路方向為9,或者被攻擊怪物的ID是一個非法的固定值98372472。在大量的走路消息或攻擊消息中,偶爾出現一個這樣的非法值,很難引起黑客的注意,況且他又不知道我什么時候會上傳這個“帶隱語的消息”,怎么可能發現我們的通訊機密呢?
有了以上的“兩點一線”(其實是多點多線啦),整個防御體系就建立起來了。不管外掛、木馬和私服多么猖獗,我們也能“One?shot,?one?kill!”。
總結
以上是生活随笔為你收集整理的防外挂和防木马的通用解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 让VC编译的Release版本程序在其他
- 下一篇: 非常精确的测试运行时间(比clock()