在XP时代,少有病毒作者使用.net编程语言开发恶意程序,反病毒厂商也很少检测.net文件,因为默认环境下.net程序需要额外安装运行时环境。但随着Win7的普及,其自带的.net环境免除了这一限制,也让.net型病毒快速增加;另外由于.net的指令是非x86的中间语言(IL),也使传统的启发式和虚拟机引擎很难做到通用检测。最近AVG中国防病毒实验室截获到一款.net下载器,值得一提的是它利用了用户机器中的语言编译器对自身代码进行重新编译,以躲过主防软件的查杀。
原始文件的.net IL经过加密,受保护的文件内容在经过加密后通过Assembly.Load重现装入内存,并进入入口调用。
真实的病毒文件首先向磁盘写入一个vb源代码文件,然后调用%Windows%\\Microsoft.NET\\Framework\\v2.0.50727\\vbc.exe 将其编译为WLIDSCV.exe,并设置自启动。Vbc.exe是.net framework 自带的vb编译器。
由于这个程序是在用户的机器上编译生成的,部分主防认为是开发测试之用,因此忽略这个文件。病毒因此达到躲避主防的目的。另外由于源程序每次编译产生的可执行文件都有一些差异,这样也为病毒逃脱云查杀提供了机会。
该文件的代码也比较简单,结束掉vbc.exe进程,并且每3秒钟检查一次.net病毒母体是否在运行,没有在运行就启动它。这样动态编译出的程序就成为了作为病毒的守护进程存在。
病毒主要的功能是下载,从互联网下载一个新的恶意程序,并运行。
下载下来的文件仍然是一个.net程序。使用同样的加密方式。
首先病毒释放一个C#源代码文件,它的功能是注入代码到目标进程,使用经典的NtUnmapViewOfSection方法。
然后调用位于C:\Windows\Microsoft.NET\Framework\v2.0.50727 下的csc.exe,将此源代码编译为一个dll。Csc.exe是.net framework自带的C#编译器。
病毒体加载这个dll,并调用这个dll将自身中解密出的一个非.net恶意程序注入到svchost中。病毒编译生成新dll并调用新dll,而不是直接调用的原因是部分启发引擎会识别.net程序中的引用的Win32API,会检测产生注入的代码。
由于.net程序难以操作底层,因此.net恶意软件常常以下载器,释放器的面目出现,为黑客进一步入侵用户的计算机做铺垫。尤其随着WP7 等微软移动设备的普及,.net framework 因为其跨平台,开发较容易的特点,会吸引越来越多的开发人员,当然其中也包括病毒作者。.net恶意软件也许会渐渐成为一种趋势。AVG提醒广大用户,经常更新病毒库,不轻易运行陌生的可执行程序,包括.net应用程序。