原帖地址:http://blog.duba.net/post/talk_infect_virus_by_snowlee_3_4.html
文章作者:金山网络病毒分析员-snowlee
![](http://blog.duba.net/attachment/2011/03/1-2.jpg)
一.引言
感染型病毒是一种相对其他病毒来说比较恶心的病毒,因为一旦被它感染,我们电脑上的大部分文件都会被感染成病毒文件。轻则机器常卡,重则任何软件都无法使用,只能重装系统。那么究竟什么是感染型病毒?感染型病毒又是怎样让我们的电脑完全瘫痪的?下面我就通过一个比较典型的感染型病毒,给大家解释一下
二.病毒行为概述
病毒通过注入Svchost来全盘感染(包括可移动磁盘)exe,dll,htm,html文件
病毒也会通过U盘传播
三.病毒行为描述
3.1 复制自身到缓存执行
- 获取VirtualAlloc函数,分配ImageSize大小缓存
- 拷贝自身到缓存
- 重定位缓存PE
- 跳到缓存内PE执行
3.2 缓存内解密病毒功能体代码
- VirtualProtect修改原ImageBase处内存属性为可读可写可执行,用于解密功能代码
- 调用aplib解压引擎将偏移0×3960处的数据解压到原ImageBase处
- 解密解压数据。采用ADD方式解密,解密后的病毒功能代码为一个UPX文件。
- 恢复解密文件导入表
- 跳到病毒功能体执行
3.3 病毒功能体代码入口
- 检测互斥体Global\SYSTEM_DEMETRA_MAIN是否存在,判断当前系统是否有感染母体运行,该互斥体为由svchost内注入的感染代码创建
- 检测当前执行体是否为C:\Program Files\Microsoft\DesktopLayer.exe。不是则拷贝自己到C:\Program Files\Microsoft\DesktopLayer.exe创建进程重新运行。
3.4 Hook 函数ZwWriteVirtualMemory
- 获取LdrLoadDll,ZwQueryInformationProcess等系统底层API,Loader代码使用
- 枚举进程中所有线程,挂起除自己以外的所有线程,保证线程同步
- 修改WriteVirtualMemory函数地址为可读可写可执行,用于hook函数
- 获取hook函数地址的指令长度,大于等于5时将指令内容保存,之后写入jmp xxxx
3.5 注入感染代码
- inline hook ZwWriteVirtualMemory 函数
- CreateProcess创建svcho来触发调用ZwWriteVirtualMemory,进入HookCode
- HookCode注入偏移0×5825处大小为0xB200的PE文件和部分Load代码
- 检测Global\\SYSTEM_DEMETRA_MAIN互斥体是否被创建,创建成功则感染代码成功注入,失败则打开IE进程
- 解除inline hook
3.6 注入hooker.dll到svchost
- 创建名字为Global\\SYSTEM_DEMETRA_IMAGE的FileMapping ,拷贝偏移0x10A25处大小0x7C00的数据到FileMapping(即hooker.dll),该Mapping将会被注入的代码使用
- 同3.5一样的方式注入hooker.dll到svchost.exe进程
- 等待10s后释放FileMapping
四.HookCode详细分析
- 病毒调用函数QueryInformationProess通过第三个参数processinformation获取进程的基本信息,其中最重要的是得到PebBaseAddress即peb的基址
![](http://blog.duba.net/attachment/2011/03/1.jpg)
- 读取peb偏移0×08位置的数据得到ImageBase
- 检查MZ头与PE头的有效性,识别pe结构取得目标文件的oep
- 病毒会分别在本地与目标进程中申请同样地址的内存空间,从0×1000开始尝试申请,如果不成功则每次递加0×1000至0×30000000结束,确保本进程与目标进程申请地址相同
- 申请成功后病毒会在本进程空间进行重定位,这样注入目标进程后不必再次重定位
- 将重定位后的PE注入到目标进程,即注入到svchost。并将PE的imagebase和imagesize写入自定义数组VIR_INFO的0×00和0×08位置
- 病毒将一些其他功能的函数(修复导入表,修改节属性)同时注入到目标进程并将其地址保存在自己定义的数组VIR_INFO的相应位置(0x0c,0×10)
- 病毒事实上将一些重要的函数地址都会保存在其自己定义的数组里,除了以上提到的还包括一些注入后需要用到的API,具体内容如下:
![](http://blog.duba.net/attachment/2011/03/2.png)
- 将数组赋值操作之后,病毒会写入VIR_INFO结构到目标进程,VIR_INFO包含了被注入PE的基址,OEP和Loader需要使用API等信息
- 最后病毒将入口代码需要填充函数地址的地方填上地址后拷贝到目标进程,此时感染代码已经完全注入到目标进程,HookCode执行完
![](http://blog.duba.net/attachment/2011/03/3.png)
五.Loader代码详细分析
- Loader代码会从VIR_INFO结构获取函数地址,用以修复感染dll的导入表和节属性
- 之后从VIR_INFO结构获取SectionNum,ImageBase,和MoudeFileName的值并作为参数传进感染dll将其加载
六.感染代码详细分析
- 文件首先会对调用自己的参数做简单判断,确定是否由自己加载,如不是则跳出。
- 文件会创建互斥体Global\\SYSTEM_DEMETRA_MAIN,如该互斥体已经存在则释放,否则会创建成功,确保只有一个进程在感染
- 病毒创建一个写启动项的线程,在死循环中不停的将病毒体写去启动项,用来自启动HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Current Version\Winlogon
![](http://blog.duba.net/attachment/2011/03/4.jpg)
- 病毒创建一个感染全盘的线程(也会感染可移动磁盘中的文件),在死循环中不停的去感染,感染部分详细如下
- 病毒首先获取所有逻辑驱动器的根驱动器路径,感染时枚举磁盘用
- 病毒判断当前磁盘的空间是否大于0x8000h,大于等于则继续感染,小于则不感染本磁盘
- 病毒判断当前磁盘类型,如果是可移动磁盘或者固定磁盘则继续感染,否则不感染本磁盘
- 枚举当前磁盘中的所有文件,判断文件后缀名是否为exe/dll/htm/html,如果是则继续感染,病毒针对pe文件和网页文件会进行不同的感染方式,具体如下
- 病毒将被感染的文件map到内存,简单的判断其结构是否为有效pe(MZ, PE)
- 枚举文件的节表获取节名,判断其是否有rmnet节,如果有则不感染,以免同文件重复感染
- 获取文件的校验和,当校验和不为0时进行感染
- 获取LoadLibraryA和GetProcAddress的IAT,查看其有没有在其他地方被引用
- 修改节表信息,将rmnet写入节表最后,即增加一个节
- 将病毒代码写入文件,并修改入口地址,UnmapFile继续枚举其他文件感染
- 判断被感染文件的大小是否大于9,大于则继续感染,小于等于则继续枚举下个文件
- 将文件指针指向文件倒数0×09字节处,判断是否为”",即判断网页文件的感染标记,如果相等说明文件已被感染,继续枚举,否则会感染该网页文件
- 将文件指针移到文件最后,写入感染代码
![](http://blog.duba.net/attachment/2011/03/5.jpg)
- 感染后的网页文件在每次被运行的时候会将WriteDate中的pe文件写去temp目录后执行
至此,全盘感染线程已经全部执行完,病毒会将这个线程的优先级降至比一般程序低一个级别,防止感染时会影响系统响应速度导致比较卡的情况发生
- 病毒会专门针对可移动磁盘创建一个感染线程,具体详细如下
- 首先判断磁盘类型,是否为可移动磁盘,其次判断磁盘空间是否大于0×8000,是则继续感染,不是则退出
- 在可移动磁盘的根目录创建autorun.inf文件将数据写进,在同目录创建RECYCLER隐藏属性文件夹,在其内再创建一个隐藏属性的文件夹将病毒体拷贝过来,以实现插上U盘打开即中毒的情况
七.Hooker.dll功能分析
Hooker.dll是外围的一个dll,他主要的功能有两点
- 将指定的pe注入到系统当前所有进程
- 将Hooker.dll自身注入到系统当前所有进程
但是由于病毒执行时并没有传pe信息,所以功能1没有被执行
八.查杀与防御
由于这个感染型病毒是全盘感染文件,所以给用户手动清除带来了很大的难度。金山毒霸针对这种恶性病毒可以完美清除,金山急救箱也可以对中毒后的电脑进行彻底修复,金山安全卫士不仅能查杀上亿已知木马,还能5分钟内发现新木马全天候保护您系统安全。
您可以到以下页面下载相关软件:
1.金山毒霸下载地址:http://www.ijinshan.com/duba/
2.金山急救箱下载地址:http://www.duba.net/jijiu/index.shtml
3.金山安全卫士下载地址:http://www.ijinshan.com/ws/
金山人会永远把用户放在首位,不断完善我们的产品,保证用户的上网安全。