找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 951|回复: 0

反病毒引擎设计之虚拟机查毒篇『B』

[复制链接]

739

主题

468

回帖

4307

牛毛

论坛管理员

狼群

积分
4347
发表于 2008-1-20 20:02:58 | 显示全部楼层 |阅读模式
2.2加密变形病毒

前面提到过设计虚拟机查毒的目的是为了对付加密变形病毒。这一章就重点介绍加密变形技术。

早期病毒没有使用任何复杂的反检测技术,如果拿反汇编工具打开病毒体代码看到的将是真正的机器码。因而可以由病毒体内某处一段机器代码和此处距离病毒入口(注意不是文件头)偏移值来唯一确定一种病毒。查毒时只需简单的确定病毒入口并在指定偏移处扫描特定代码串。这种静态扫描技术对付普通病毒是万无一失的。

随着病毒技术的发展,出现了一类加密病毒。这类病毒的特点是:其入口处具有解密子(decryptor),而病毒主体代码被加了密。运行时首先得到控制权的解密代码将对病毒主体进行循环解密,完成后将控制交给病毒主体运行,病毒主体感染文件时会将解密子,用随机密钥加密过的病毒主体,和保存在病毒体内或嵌入解密子中的密钥一同写入被感染文件。由于同一种病毒的不同传染实例的病毒主体是用不同的密钥进行加密,因而不可能在其中找到唯一的一段代码串和偏移来代表此病毒的特征,似乎静态扫描技术对此即将失效。但仔细想想,不同传染实例的解密子仍保持不变机器码明文(从理论上讲任何加密程序中都存在未加密的机器码,否则程序无法执行),所以将特征码选于此处虽然会冒一定的误报风险(解密子中代码缺少病毒特性,同样的特征码也会出现在正常程序中),但仍不失为一种有效的方法。

由于加密病毒还没有能够完全逃脱静态特征码扫描,所以病毒写作者在加密病毒的基础之上进行改进,使解密子的代码对不同传染实例呈现出多样性,这就出现了加密变形病毒。它和加密病毒非常类似,唯一的改进在于病毒主体在感染不同文件会构造出一个功能相同但代码不同的解密子,也就是不同传染实例的解密子具有相同的解密功能但代码却截然不同。比如原本一条指令完全可以拆成几条来完成,中间可能会被插入无用的垃圾代码。这样,由于无法找到不变的特征码,静态扫描技术就彻底失效了。下面先举两个例子说明加密变形病毒解密子构造,然后再讨论怎样用虚拟执行技术检测加密变形病毒。

C++代码
著名多形病毒Marburg的变形解密子:   
  
  
  
00401020: movsx edi,si ;病毒入口  
  
00401023: movsx edx,bp  
  
00401026: jmp 00408a99  
  
......  
  
00407400: ;病毒体入口  
  
加密的病毒主体  
  
00408a94: ;解密指针初始值  
  
......  
  
00408a99: mov dl,f7  
  
00408a9b: movsx edx,bx  
  
00408a9e: mov ecx,cf4b9b4f  
  
00408aa3: call 00408ac4  
  
......  
  
00408ac4: pop ebx  
  
00408ac5: jmp 00408ade  
  
......  
  
00408ade: mov cx,di  
  
00408ae1: add ebx,9fdbd22d  
  
00408ae7: jmp 00408b08  
  
......  
  
00408b08: add ecx,80c1fbc1  
  
00408b0e: mov ebp,7fcdeff3 ;循环解密记数器初值  
  
00408b13: sub cl,39  
  
00408b16: movsx esi,si  
  
00408b19: add dword ptr[ebx+60242dbf],9ef42073 ;解密语句,9ef42073是密钥  
  
00408b23: mov edx,6fd1d4cf  
  
00408b28: mov di,dx  
  
00408b2b: inc ebp  
  
00408b2c: xor dl,a3  
  
00408b2f: mov cx,si  
  
00408b32: sub ebx,00000004 ;移动解密偏移指针,逆向解密   
  
00408b38: mov ecx,86425df9  
  
00408b3d: cmp ebp,7fcdf599 ;判断解密结束与否  
  
00408b43: jnz 00408b16  
  
00408b49: jmp 00408b62  
  
......  
  
00408b62: mov di,bp  
  
00408b65: jmp 00407400 ;将控制权交给解密后的病毒体入口  
  
著名多形病毒Hps的变形解密子:  
  
  
  
005365b8: ;解密指针初始值和病毒体入口  
  
加密的病毒主体   
  
......  
  
005379cd: call 005379e2  
  
......  
  
005379e2: pop ebx  
  
005379e3: sub ebx,0000141a ;设置解密指针初值  
  
005379e9: ret  
  
......  
  
005379f0: dec edx ;减少循环记数值  
  
005379f1: ret  
  
......  
  
00537a00: xor dword ptr[ebx],10e7ed59 ;解密语句,10e7ed59是密钥  
  
00537a06: ret  
  
......  
  
00537a1a: sub ebx,ffffffff   
  
00537a20: sub ebx,fffffffd ;移动解密指针,正向解密  
  
00537a26: ret  
  
......  
  
00537a30: mov edx,74d9cb97 ;设置循环记数初值  
  
00537a35: ret  
  
......  
  
00537a3f: call 005379cd ;病毒入口  
  
00537a44: call 00537a30  
  
00537a49: call 00537a00  
  
00537a4e: call 00537a1a  
  
00537a53: call 005379f0  
  
00537a58: mov esi,edx  
  
00537a5a: cmp esi,74d9c696 ;判断解密结束与否  
  
00537a60: jnz 00537a49  
  
00537a66: jmp 005365b8 ;将控制权交给解密后的病毒体入口  

以上的代码看上去绝对不会是用编译器编译出来,或是编程者手工写出来的,因为其中充斥了大量的乱数和垃圾。代码中没有注释部分均可认为是垃圾代码,有用部分完成的功能仅是循环向加密过的病毒体的每个双字加上或异或一个固定值。这只是变形病毒传染实例的其中一个,别的实例的解密子和病毒体将不会如此,极度变形以至让人无法辩识。至于变形病毒的实现技术由于涉及复杂的算法和控制,因此不在我们讨论范围内。

这种加密变形病毒的检测用传统的静态特征码扫描技术显然已经不行了。为此我们采取的方法是动态特征码扫描技术,所谓“动态特征码扫描”指先在虚拟机的配合下对病毒进行解密,接着在解密后病毒体明文中寻找特征码。我们知道解密后病毒体明文是稳定不变的,只要能够得到解密后的病毒体就可以使用特征码扫描了。要得到病毒体明文首先必须利用虚拟机对病毒的解密子进行解释执行,当跟踪并确定其循环解密完成或达到规定次数后,整个病毒体明文或部分已被保存到一个内部缓冲区中了。虚拟机之所以又被称为通用解密器在于它不用事先知道病毒体的加密算法,而是通过跟踪病毒自身的解密过程来对其进行解密。至于虚拟机怎样解释指令执行,怎样确定可执行代码有无循环解密段等细节将在下一节中介绍。
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5用户社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-1-11 14:29 , Processed in 0.114263 second(s), 23 queries , Yac On.

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表