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