劉鍵林
(天津現(xiàn)代職業(yè)技術(shù)學院,天津市 300222)
巧用花指令延緩逆向分析
劉鍵林
(天津現(xiàn)代職業(yè)技術(shù)學院,天津市 300222)
防止逆向分析的目標,關(guān)鍵是減緩逆向分析人員對受保護代碼和(或)加殼后的程序分析和理解的速度,重要的是如何處理好:諸如加密/壓縮、垃圾代碼、代碼變形、反-反編譯等技術(shù)。
加密;壓縮;校驗線程
加密和壓縮是最基本的反分析形式。它們只是初步的設(shè)防,防止逆向分析人員直接在反編譯器內(nèi)加載受保護的程序,隨后沒有任何困難地開始分析。加密殼通常都既加密本身代碼也加密受保護的程序。不同的殼所采用的加密算法幾乎不相同,有非常簡單的 XOR循環(huán),也有執(zhí)行數(shù)次運算的非常復雜的循環(huán)。對于某些多態(tài)變形殼,為了防止查殼工具正確地識別殼,每次加殼所采用的加密算法都不同,解密代碼也通過變形顯得很不一樣。解密例程作為一個取數(shù)、計算、存諸操作的循環(huán)很容易辨認。下面是一個對加密過的DWORD值執(zhí)行數(shù)次XOR操作的簡單的解密例程。
0040A 07C LODS DWORD PTR DS:[ESI]
0040A 07D XOR EA X,EBX
0040A 07F SUB EAX,12338CC3
0040A 084 ROL EA X,10
0040A 087 XOR EA X,799F82D 0
0040A 08C STOS DWORD PTR ES:[ED I]
0040A 08D INC EBX
0040A 08E LOOPD SHORT 0040A 07C;decryp tion loop
下面是另一個多態(tài)變形殼的解密例程:
00476056 M OV BH,B YTE PTR DS:[EA X]
00476058 INC ESI
00476059 ADD BH,0BD
0047605C XOR BH,CL
0047605E INC ESI
0047605F D EC ED X
00476060 M OV B YTE PTR DS:[EA X],BH
00476062 CLC
00476063 SHL ED I,CL:::M ore garbage code
00476079 INC ED X
0047607A DEC ED X
0047607B D EC EAX
0047607C JM PSHORT 0047607E
0047607E DEC ECX
0047607F JN Z 00476056;decryp tion loop
下面是由同一個多態(tài)殼生成的另一段解密例程:
0040C045 M OV CH,B YTE PTR DS:[ED I]
0040C047 ADD ED X,EBX
0040C049 XOR CH,AL
0040C04B XOR CH,0D 9
0040C04E CLC
0040C04F M OV B YTE PTR DS:[ED I],CH
0040C051 XCHG AH,A H
0040C053 B TR ED X,EDX
0040C056 M OVSX EBX,CL:::M ore garbage code
0040C067 SAR ED X,CL
0040C06C NOP
0040C06D D EC ED I
0040C06E DEC EA X
0040C06F JM P SHORT 0040C071
0040C071 JN Z 0040C045;decryp tion loop
以上示例中加深顏色字體是主要的解密指令,其余的指令都是用來迷惑逆向分析人員的垃圾代碼。壓縮程序的主要目的是為了縮小可執(zhí)行文件代碼和數(shù)據(jù)的大小,但是由于原始程序包含可讀字符串。將可執(zhí)行文件變成了壓縮文件,因此也有那么一些混淆的作用??纯磶卓顨に褂玫膲嚎s引擎:UPX使用NRV(N ot Really Vanished)和L ZM A(Lempel-Ziv-M arkov chain-A lgorithm),FSG使用aPLib,Upack使用LZM A,yoda加密殼使用L ZO。這其中有些壓縮引擎可以自由地使用于非商業(yè)應用,但是商業(yè)應用需要許可/注冊。
處理器時間戳校驗線程:
一個相當有效的阻止被保護的應用程序被裝入調(diào)試器的一個技術(shù)是加入CPU時間戳校驗線程,這使逆向分析很難在調(diào)試器里對程序進行動態(tài)分析。如果我們加入了一個專門的線程這個線程會頻繁檢查CPU中的時間計數(shù)器,如果主線程的執(zhí)行時間過長(即程序被暫停過可能就是有一個調(diào)試器在分析)這個線程就會把整個程序的進程終止掉。在這一技術(shù)中,很重要的一點就是直接使用底層的RD TSC指令,而不是哪個系統(tǒng)API來實現(xiàn)對CPU時間計數(shù)器的訪問,這樣就可以防止逆向分析人員掛鉤或者替換有關(guān)的函數(shù)。
當進程被調(diào)試時,調(diào)試器事件處理代碼、步過指令等將占用CPU循環(huán)。如果相鄰指令之間所花費的時間如果大大超出常規(guī),就意味著進程很可能是在被調(diào)試,而殼正好利用了這一點。
下面是一個簡單的時間檢查的例子。在某一段指令的前后用RD TSC指令(Read Time-Stamp Counter)并計算相應的增量。增量值0x200取決于兩個RD TSC指令之間的代碼執(zhí)行量。
rdtsc
m ov ecx,eax
m ov ebx,edx
;…m ore instructions
nop
push eax
pop eax
nop;…m ore instructions
;compute delta betw een RD TSC instructions
rdtsc
;Check high order bits
cmp edx,ebx
ja debugger_found;Check low order bits
sub eax,ecx
cmp eax,0x200
ja debugger_found
其它的時間檢查手段包括使用kernel32!GetTickCount()API,或者手工檢查位于0x7FFE0000
地址的SharedUserData7數(shù)據(jù)結(jié)構(gòu)的TickCountLow及TickCountM ultip lier成員。使用垃圾代碼或
者其它混淆技術(shù)進行隱藏以后,這些時間檢查手段尤其是使用RD TSC將會變得難于識別。
通過上述的代碼分析,我們清楚的看到,任何一個程序的加密可以有很多種方法,我們要以最科學的方法減緩逆向分析人員對程序的分析,在滿足程序合理、快捷運行的前提下用最安全的加密方法保護我們的程序,這才是我們根本目的。
[1]Kris KaspersKY著.譚金明譯.黑客反匯編揭秘[M].北京:電子工業(yè)出版社,2004.
[2]Kris KaspersKY著.周長發(fā)譯.黑客調(diào)試技術(shù)揭秘[M].電子工業(yè)出版社,2006.
[3]譚文邵,堅磊.從匯編語言到W indow內(nèi)核編程[M].北京:電子工業(yè)出版社,2008.
Using Junk Code Skillfully to Delay Reverse A nalysis
L IU Jian-lin
(Tianjin M odern Vocational Technology College,Tianjin 300222 China)
To p revent the reverse analysis,we should delay the speed of analysts analyzing and un2 derstanding the p rotected code and packed p rograms.It is important to deal w ith the encryp tion and comp ression,garbage code,code morphing and anti-decompilation technology.
encryp tion;comp ression;verifying thread
TP313
A
1673-582X(2011)08-0043-03
2011-01-17
劉鍵林(1959-),男,天津市人,天津現(xiàn)代職業(yè)技術(shù)學院計算機實驗室管理員,工程師,從事計算機加密與解密教學與研究工作。