Posted on 2009-10-14 15:39
S.l.e!ep.¢% 閱讀(916)
評論(0) 編輯 收藏 引用 所屬分類:
Crack
反(調試/跟蹤/脫殼) 技術集錦
轉自看雪,最近看到很多游戲加了反調試技術,從看雪轉一片文章給大家分享。
標 題:又灌水-反(調試/跟蹤/脫殼) 技術集錦
發(fā)信人:kongfoo
時 間:2004-05-27,14:50
詳細信息:
反(調試/跟蹤/脫殼) 技術集錦
kongfoo/2004.4.18-5.27
具體代碼就不貼了,知道原理就可以寫出代碼。一些是實踐所得,一些是別人的成果,也
都收集在一起了。解密、加密這個攻防戰(zhàn)好像和傳統(tǒng)作戰(zhàn)的攻防戰(zhàn)不同,防的一方能用的技術
遠遠多于攻的一方。
1)花指令
很無聊的技巧,但也有一定作用:隱藏指令,干擾分析。
2)花循環(huán)
無用循環(huán),讓跟蹤者浪費時間,心煩。
3)時間比較
經典的反跟蹤技巧,單步跟蹤比連續(xù)執(zhí)行的時間長很多。
4)父進程檢查
被調試器加載后父進程就不是通常的Explorer.exe。
5)檢查調試器
Windows本身就提供一些API可以用來檢查調試器是否存在。如IsDebuggerPresent/NtQueryInformationProcess。
另外還有CreateFile/PEB(和IsDebuggerPresent一樣)等方法檢查調試器。
6)動態(tài)加/解密代碼
干擾分析。把執(zhí)行過的代碼重新加密可以防止跟蹤者翻看代碼。
7)IAT加密
防止ImpREC等工具的自動脫殼修復,加大脫殼難度。
8)指令摘取
有很多方式,從OEP處摘取指令,隨機摘取一段指令等,加大脫殼難度。摘取的指令還可變形處理。
9)CALL處理
根據CALL指令本身特點,讓其先CALL進殼的空間,加大脫殼難度。
10)自調試
對于一個程序,Windows只允許這個程序被一個調試器調試,基于此,采用雙進程或多進程方式,
自已調試自己,加大跟蹤難度。另外,通過設置某中斷地址,使程序發(fā)生某中斷時執(zhí)行程序中的中斷
處理代碼,進行解碼、指令摘取等動作,加大跟蹤難度。
11)異常處理機制
人為產生異常,改變程序流程或在異常處理時進行解碼,加大跟蹤難度。常見的異常有內存存取
錯誤異常,中斷異常(INT3/單步/其它中斷等),非法指令,非法EIP等。
12)多線程的運用
利用被調試程序所有線程會被掛起的特點,達到干擾跟蹤的目的。一,用多線程改變程序流程:在
線程中修改主線程代碼,如果被單步跟蹤線程將不會運行,流程也就不對了。二,用多線程解碼:同理,
線程不能運行解碼也就不能進行。
13)反SMC
用Timer/線程不斷地將敏感的內存空間的屬性設置成只讀,可以防止被打補丁。
14)CRC校驗
代碼被修改之后CRC檢驗值就不同了。
15)破壞調試環(huán)境
破壞調試寄存器內容,破壞中斷處理地址或自己接管中斷處理等,從根本上反調試。
16)反進程轉存
將某個不會用到的代碼空間設置成NO_ACCESS,LordPE等工具dump到這個空間時就
會異常而dump不了啦。
17)監(jiān)視鍵盤
監(jiān)視F7、F9就夠了。
18)固定屏幕
在殼運行期間把屏幕固定,跟蹤者看都不看到,當然跟不了。
19)破壞異常處理環(huán)境
用SetUnhandledExceptionFilter破壞異常處理環(huán)境,使調試器無法捕捉程序產生的異常。
20)調試父進程
利用調試函數的特點,即被調試進程會被掛起的特點,反單步跟蹤。
21)Arm的CC保護,CopyMem-II保護
把所有跳轉改成CC,父進程檢測到INT3中斷時查表改EIP去到正常的位置。
CopyMem-II就是把自己復制到另一塊內存中去運行,哪么dump的時候就麻煩些啦。
22)反attach分析
執(zhí)行過的代碼就破壞掉,防止attach分析。另外,生成一個指明不能用調試器的進程之后本
身進程直接退出,可防attach。(NT系統(tǒng)有效)
23)指令預取
利用CPU會預讀取指令的特點,干擾單步跟蹤。如:
? ? ? mov word ptr [@@],20cdh
? ? @@:
? ? ? nop
? ? ? nop
正常情況下CPU預讀了2個nop,而不會執(zhí)行INT 20(cd20),但單步跟蹤下來就不同了。
24)寫代碼時的反調試
對加殼選項的不同而生成不同的代碼,這樣可以有效地防止脫殼機的patch。只用標志位
來判斷是否加密IAT是很危險的。
25)隨機存放敏感數據
如果用jmp OEP的方式去OEP,并且代碼位置是固定的,哪么寫脫殼機時OEP就隨手可得了,
所以使代碼不定長,或把敏感數據隱藏起來是很好的對策。另外一些殼運行時要用的原程序的
參數放在程序里面比一堆地放在殼后面更安全得多。
26)反匯編
把自己作為一個指令解釋器,反匯編自身代碼并解釋執(zhí)行,這樣就可以防止指令被改。
軟件設計的復雜性比單純的反調試技巧更有效。加密算法的運用更是有力的反脫殼措施。
anti技巧的安排也很重要,比如子程序里面放anti代碼要更好些,因為跟蹤者要先過雙進程
這一關;解碼前設置anti dump比解碼后設置更好些,因為解碼后立即用LordPE的話anti dump
就形同虛設了。
還有很多反調試技術是我未能收集到的,跟貼吧