解析一种可同时感染32位与64位系统环境的新型病毒

 
1 概述Expiro64病毒的感染过程
    我们打开一个被Expiro64感染的文件,就会发现和以往被PE病毒感染的文件没有太大差别。Expiro64病毒在感染文件的后面添加了一个名字是VMPx(x是一个0到9的随机数)的节,节的大小约为512KB。VMPx节由三部分组成:第一个部分是受感染文件的原入口点代码;第二部分是加密的当前体系结构恶意代码;第三部分是加密的其它体系结构恶意代码。如果感染的是64位文件,第二部分就是感染64位文件的恶意代码,第三部分就是感染32位文件的恶意代码。
 感染文件原入口点代码被替换成一段1248字节的代码,这段代码的作用就是解密和转移。解密VMPx节第二部分的恶意代码,转移到恶意代码的执行位置。恶意代码执行后会启动真正的感染线程the Main Expiro64,同时将原入口点代码复制到它原来的位置,随后程序跳到这个位置,文件开始正常执行。以后感染任务就交给了the Main Expiro64。
2 Expiro64具体感染过程
2.1 启动感染主线程the Main Expiro64
    the Main Expiro64线程启动后,此时VMPx节的结构如下:
  因为感染的文件是64位,所以第二部分是64位文件系统的恶意代码执行体,第三部分依然是被加密的恶意代码,感染目标是32位文件系统。
    the Main Expiro64线程需要构建自己需要的IAT(导入地址表),使用一些函数如LoadLibrary、GetProcAddress等,利用动态加载技术去获得一些动态链接库的基地址(如kernel32.dll、Msvcrt.dll、user32.dll、shell32.dll、Advapi32.dll等)。另外the Main Expiro64线程为了隐藏这些重要函数,使用了一些加密技术。下面是一段字符串解密函数的代码:
 the Main Expiro64线程在对文件进行感染时,需要判断文件的类型,如果是系统服务,它就要调用服务感染线程,否则就会调用文件感染线程。the Main Expiro64线程在感染的过程中,也会通过建立互斥体来保证感染程序的唯一性。
2.2服务感染线程
    服务感染线程通过使用ChangeServiceConfig函数去改变服务的配置参数。
1)服务感染线程会识别被感染文件的操作系统版本,以确定服务感染线程是否能顺利运行。
2)Expiro64病毒维护一个需要感染的服务清单,利用EnumServiceStatus函数列举出所有的系统服务,最后找到要被感染的服务文件。
3)Expiro64病毒维护一个常见杀毒软件服务的清单,出现在这个清单中的服务将被关掉。例如:MsMpSvc(微软onecare live杀软)、NisSrv(mse的网络检查系统功能的进程)、WinDefend(防间谍软件)和wscsvc(windows安全中心)等。同时也会将一些进程停掉,例如MSASCui.exe(微软反间谍软件)、msseces.exe (微软免费杀软 MSE进程)、Tcpview.exe  端口查看程序。
2.3文件感染线程
2.3.1 申请数据块
Expiro64病毒在内存中申请两个大小约512K字节的临时数据块1和数据块2。如下:
数据块的组成:入口点代码+32位和64位恶意代码+内存对齐时的节填充码(一般为0)。Expiro64病毒使用CreateFile函数打开需要感染的目标文件,获取目标文件的大小为M,接着从内存中申请M(第一部分)+512K字节(第二部分)大小的临时数据块3。
 Expiro64将目标文件读取到临时数据块3的第一部分。这时需要分析目标文件:如果目标文件是32位,则准备将数据块1复制到临时数据块3的第二部分。如果目标文件是64位,则准备将数据块2复制到临时数据块3的第二部分。Expiro64也要检查目标文件的PE头,目的是判断目标文件是否已经被感染。主要是对PE头的IMAGE_OPTIONAL_HEADER结构进行解析:如果MajorLinkerVersion等于9、MajorimageVersion等于0xD、minorimageversion等于0x1C、TimeDateStamp的最后4比特等于0同时满足条件,则可以判定此文件已经被感染了,文件感染线程退出。
2.3.2 调整PE头
    对文件感染前,需要进行一个判断:如果原入口点代码大小小于感染后的重新计算的入口点代码大小,则文件感染线程退出。接下来重新设置被感染文件PE头中的域值,利用公式计算感染文件PE 头IMAGE_OPTIONAL_HEADER结构中SizeOfHeaders字段的值。如果目标文件的Certificate Table中的大小不为0,并且偏移地址位于目标文件的最后一节,表示目标文件存在数字签名并且数字签名在文件的最后,为了去掉数字签名,将Certificate Table的大小和RVA都设置为0,数字签名的空间被病毒用来存放一部分VMPx节的开头部分,通过这种方式来缩小感染文件的大小。
因为新增了VMPx节,所以目标文件的PE头要设置一些关于VMPx节的信息:如节名称设置为VMPx、节的原始大小等于VMPX节在文件中被分配的大小,节的虚拟地址等于目标文件最后一节尾部的虚拟地址,节的数据特征值被设置为可读、可写、可执行等。     
如果被感染文件存在Bound Directory,则绑定目录中IAT 的 IMAGE_THUNK_DATA 结构数据需要重新计算。最后被感染文件NT头中的NumberOfSection、SizeOfImage及重定位信息都需要进行调整。
2.3.3 计算密钥
    Expiro64需要对数据块1和数据块2中的恶意代码进行加密,下面是密钥的计算方法:
1)设内存中恶意代码的大小为N,将N右移12比特,结果存在数据块中恶意代码的第二个字节。
2)右移出来的12比特,继续右移9个比特,结果存在数据块中恶意代码的第三个字节。
3)利用RAND()函数获得一个随机值,随机值除以0x fd,得到的余数加1后作为恶意代码的密钥,密钥与0x 4d进行异或,异或后的值被存储在数据块中恶意代码的第一个字节。
2.3.4开始感染
   此时内存中数据块1和数据块2的第一部分还是空的,文件感染线程将目标文件的入口点代码拷贝到第一部分。接下来感染线程判断目标文件的系统环境,如果系统环境是32位,则将数据块1复制到数据块3的VMPx节,否则将数据块2复制到数据块3的VMPx节,到此目标文件的感染基本结束。最后就是使用密钥将VMPx节的恶意代码进行加密,密钥等于恶意代码的第一字节与0x4d异或后得到的值,加密的位置从恶意代码的第四个位置开始。
    为了表示目标文件已经被感染,需要在文件PE头的IMAGE_OPTIONAL_HEADER设置一些记录信息。设置MajorImageVersion值域为0xd,设置MajorLinkerVersion值域为9,设置MinorImageVersion值域为0x1c,设置TimeDateStamp值域的最后4比特为0。
密钥=4E^4D=3; 恶意代码的大小=(0x2C<<C)+(0x35<<9)=32A00
2.4完成感染
Expiro64病毒根据目标文件的系统环境,用相应的解密代码替换感染文件的原入口点代码,并修改文件的重定位信息。接下来使用内存中数据块3的内容,创建一个与目标文件名字相同但后缀名是.vir的文件。最后Expiro64病毒将.vir文件内容全部覆盖到要感染的目标文件,如果成功,则删除.vir文件,完成目标文件的感染。
3 感染Expiro64病毒流程
1)用户被引诱访问一个驻留Expiro64攻击代码的网址。
2)恶意代码执行后,开始搜索本地盘、映射盘和移动盘中的文件,重点搜索系统文件及一些重要目录下的文件,比如开始菜单和桌面目录中的文件。
3)使用FindFirstFile和 FindNextFile两个函数,列举出目标目录下所有的exe、scr、dll等PE文件。
4)关闭一些安全防护的服务,开始感染文件。
5)Expiro64病毒安装chrome和firefox的插件,从IE、Outlook、FileZilla中盗取证书和密码,取得访问FTP服务器的权限。
6)根据浏览器中的信息,将经常浏览的网址重定向到一个恶意链接。
7)Expiro64病毒在本地路由器上设置一个端口转发,尝试将搜集到的信息传送到远程主机,同时也从远程主机接收命令。
4 Expiro64病毒特点分析
4.1 多态代码
这段多态代码是根据目标文件系统环境的不同,调用相应的恶意代码。这也是Expiro64病毒实现多系统环境感染的核心技术。
4.2 迷惑代码
所谓迷惑代码就是增加一些无用的代码,目的就是躲避杀毒软件的查杀和增加程序被反汇编破译的难度。
这段代码目的是将NT头的相对虚拟地址放入64位的通用寄存器R11中。6条汇编指令本可以通过一条汇编指令完成:mov r11d , dword ptr [r12+3ch]。
 这段代码目的是移动字符串M到EAX寄存器。Expiro64病毒使用的数学公式,让代码变得更加繁琐。
4.3填充随机值
    在PE文件头部中的空闲区域填充随机值,使感染文件通过部分杀毒软件的查杀。此外为了较少感染文件的大小,将感染文件的数字签名去掉后,充分利用这段空间存储了一部分恶意代码。
4.4 加密算法
    前面内容中已经介绍过了对VMPx节中恶意代码的加密过程,其目的也是为了增加分析病毒的难度。
5 结论
  Expiro64病毒代码中的混淆算法和异或加密算法都过于简单,对于静态分析几乎不会造成太大的困难。此外因为病毒需要消耗很长时间搜索系统中的文件,所以被感染的进程读写量特别大,这样病毒就很容易被发现。但我们也要认识到感染PE文件依旧是传播恶意代码的一种非常有效的方式,因为如果系统中有一个病毒没有被清除,并再次被执行后,那么整个感染过程将会又重复一遍。对系统来说Expiro64病毒对移动盘和映射盘的感染是非常致命的,Expiro64病毒的感染函数每隔120秒被调用一次,因此完全可以感染刚刚插入的移动盘,被感染后的移动盘就成为了病毒的载体。
   总之Expiro64病毒对于病毒制造者是非常有借鉴意义的,不仅因为恶意代码能够扩散的非常快,而且多系统环境的感染方式也大大增强了病毒本身的适应性。
 

猜你喜欢

转载自www.cnblogs.com/ready-gogo/p/12508409.html
今日推荐