巧用花指令延缓逆向分析
2011-03-19刘键林
刘键林
(天津现代职业技术学院,天津市 300222)
巧用花指令延缓逆向分析
刘键林
(天津现代职业技术学院,天津市 300222)
防止逆向分析的目标,关键是减缓逆向分析人员对受保护代码和(或)加壳后的程序分析和理解的速度,重要的是如何处理好:诸如加密/压缩、垃圾代码、代码变形、反-反编译等技术。
加密;压缩;校验线程
加密和压缩是最基本的反分析形式。它们只是初步的设防,防止逆向分析人员直接在反编译器内加载受保护的程序,随后没有任何困难地开始分析。加密壳通常都既加密本身代码也加密受保护的程序。不同的壳所采用的加密算法几乎不相同,有非常简单的 XOR循环,也有执行数次运算的非常复杂的循环。对于某些多态变形壳,为了防止查壳工具正确地识别壳,每次加壳所采用的加密算法都不同,解密代码也通过变形显得很不一样。解密例程作为一个取数、计算、存诸操作的循环很容易辨认。下面是一个对加密过的DWORD值执行数次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
下面是另一个多态变形壳的解密例程:
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
下面是由同一个多态壳生成的另一段解密例程:
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
以上示例中加深颜色字体是主要的解密指令,其余的指令都是用来迷惑逆向分析人员的垃圾代码。压缩程序的主要目的是为了缩小可执行文件代码和数据的大小,但是由于原始程序包含可读字符串。将可执行文件变成了压缩文件,因此也有那么一些混淆的作用。看看几款壳所使用的压缩引擎:UPX使用NRV(N ot Really Vanished)和L ZM A(Lempel-Ziv-M arkov chain-A lgorithm),FSG使用aPLib,Upack使用LZM A,yoda加密壳使用L ZO。这其中有些压缩引擎可以自由地使用于非商业应用,但是商业应用需要许可/注册。
处理器时间戳校验线程:
一个相当有效的阻止被保护的应用程序被装入调试器的一个技术是加入CPU时间戳校验线程,这使逆向分析很难在调试器里对程序进行动态分析。如果我们加入了一个专门的线程这个线程会频繁检查CPU中的时间计数器,如果主线程的执行时间过长(即程序被暂停过可能就是有一个调试器在分析)这个线程就会把整个程序的进程终止掉。在这一技术中,很重要的一点就是直接使用底层的RD TSC指令,而不是哪个系统API来实现对CPU时间计数器的访问,这样就可以防止逆向分析人员挂钩或者替换有关的函数。
当进程被调试时,调试器事件处理代码、步过指令等将占用CPU循环。如果相邻指令之间所花费的时间如果大大超出常规,就意味着进程很可能是在被调试,而壳正好利用了这一点。
下面是一个简单的时间检查的例子。在某一段指令的前后用RD TSC指令(Read Time-Stamp Counter)并计算相应的增量。增量值0x200取决于两个RD TSC指令之间的代码执行量。
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数据结构的TickCountLow及TickCountM ultip lier成员。使用垃圾代码或
者其它混淆技术进行隐藏以后,这些时间检查手段尤其是使用RD TSC将会变得难于识别。
通过上述的代码分析,我们清楚的看到,任何一个程序的加密可以有很多种方法,我们要以最科学的方法减缓逆向分析人员对程序的分析,在满足程序合理、快捷运行的前提下用最安全的加密方法保护我们的程序,这才是我们根本目的。
[1]Kris KaspersKY著.谭金明译.黑客反汇编揭秘[M].北京:电子工业出版社,2004.
[2]Kris KaspersKY著.周长发译.黑客调试技术揭秘[M].电子工业出版社,2006.
[3]谭文邵,坚磊.从汇编语言到W indow内核编程[M].北京:电子工业出版社,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-),男,天津市人,天津现代职业技术学院计算机实验室管理员,工程师,从事计算机加密与解密教学与研究工作。