首页
社区
课程
招聘
[原创]Virrut变种感染型病毒分析报告(Virut.ce)
发表于: 2017-11-6 09:09 7643

[原创]Virrut变种感染型病毒分析报告(Virut.ce)

2017-11-6 09:09
7643

 恶意代码为感染型病毒,母体病毒通过将正常的PE文件进行加密,然后每个受感染的文件又可以进行全盘传播,通过连接国外IP服务器发送上线报文。

 1)样本的网络行为、文件行为

 2)感染传播的方式

通过母体文件,或被母体文件感染过的文件感染。

运行后会将恶意代码以及模块注入explorer.exe\Conhost.exe\winlogo.exe\dwm.exe等进程。

 1)加密处理:病毒代码处理经过多层的解密指令,运行过程中对后续代码进行解密,解密代码会变形。例如原反汇编指令代码如下:

 执行完【0042477D sbb byte ptr ss:[ebp-0x223],dh】这条语句后,机器码为C3的改成了E8,ret就变成了call。修改后的代码如下:

图:指令被修改

 2)花指令:代码会在指令中增加00,在鼠标滑动时指令发生变化。

图:花指令

图:修改其程序内存

(2)API行为监控:

图:API行为监控

(3)感染文件变化:

图:源文件与感染文件对比

 通过Malware Defender对被感染的文件进行监控,发现每个被感染的文件自成母体病毒文件向当前的系统进程dwm.exe进行了修改。通过dwm.exe文件访问国外IP。

图:注入进程,进程访问网络

 病毒运行后会访问国外IP:148.81.111.121,通过VT查询该IP与多个恶意代码HASH绑定,Wireshark抓包后的数据包:

图:访问IP

 通过Windows系统自带的DNS记录跟踪大量域名后,通过系统命令确定病毒感染后访问的国外IP绑定的域名为ant.trenz.pl。

图:Windwos自带DNS记录访问的域名

图:系统命令关联域名的IP地址

 病毒代码执行前,首先获取kernel32.dll入口循环遍历代码所需函数,通过IDA静态可查看代码运行的结构是在不断进行循环。

图:OD-kernel32入口地址

图:IDA-kernel32函数地址遍历

 当面对这类感染类病毒,很多使用寄存器进行传值的指令是无法用IDA轻轻松松F5查看源码的。

 所以分析过程中我采用通过行为监控+动态调试的思路分析!打开Malware Defender,借助吾爱破解OD进行F8单层步过直到程序结束。当Malware Defender出现关键行为时,对走过的call进行记录,然后深入这个call再逐层分析。

 跟踪到第6个函数时,程序出现了修改其他进程内存、其他进程中创建线程的行为。

图:第6个call为重点分析函数

 通过反复还原虚拟机快照对比,发现该病毒在感染后 [cmp al,bl]执行的分支是不一样的,如果没有被感染的系统JNZ不跳转程序继续向下执行,否则JNZ则跳转到下一个分支处。对比值是eax与ebx的寄存器的低位值。此时的AL与BL的值分别为:Al=B7,Bl=00。

 为了验证这个【B7】的值是否为随机值,切换到另外一台虚拟机再次单步跟踪有操作EAX的的位置,发现在00424A38地址处执行完【mov eax,dword ptr ds:[eax+0x34];】,B7的值就没有发生过改变,由此得出B7这个值就是病毒判断系统有没有被感染的标识,对比反汇编代码如下:

所有寄存器当前的值如下:

 当前已知关键感染代码都在00424A65地址的call内,那么按照原有思路继续根据行为找关键call,F8单步跟踪所有的call后借助监控行为软件的结果细化分析各层call内的反汇编指令。

 病毒代码处理存在两种方式,一种是对后续代码进行解密,解密代码会变形。另一种是后续代码是明文未加密直接调用明文。例如原反汇编指令代码如下:

执行完【0042477D sbb byte ptr ss:[ebp-0x223],dh】这条语句后,机器码为C3的改成了E8,ret就变成了call。修改后的代码如下:

图:指令被修改

在跟随中遇到获取kernel32.dll解密代码的算法。反汇编代码如下:

图:OD-反汇编代码

指令块通过jmp连接,跳转后有指令变形的红色提示。

图:通过JMP连接

 进入代码变形后的指令继续跟踪,发现挂钩了底层API函数。对应的七个函数分别为ZwCreateFile、ZwOpenFile、ZwCreateProcess、ZwCreateProcessEx、ZwCreateUserProcess、ZwQueryInformationProcess、ZwDeviceIoControlFile;反汇编指令如下:

图:OD-挂钩七个底层API函数

 第三层数第3个call后。F8跟踪过程中有一个底层API函数,ZwMapViewOfSection作用为创建内存将自身映射到进程中:

图:OD-调用ZwMapViewOfSection

 第三层第4个call中还在进行多个循环进行判断解密长度、解密数据,当这个call运行完毕,指令块发生改变。

图:OD-Loop循环结束,指令块发生改变

 跟进001F0796这个call内,病毒在此处进行了遍历进程的操作,但在此之前调用了FreeLibrary、CloseHandle可见已经进行了加载某个模块的操作。通过CreateToolhelp32Snapshot通过获取进程信息、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照,然后跳过前4个进程后程序继续向下执行,反汇编代码如下:

图:OD-遍历进程

前四个进程遍历后使用OpenProcess做打开操作, CreateRemoteThread创建远程线程,反汇编如下:

图:OD-创建远程线程注入

 单步跟踪发现每次经过001F0810地址的call便会出现修改其他进程内存的操作, 深入分析,发现这个call内会挂钩其七个api函数,挂钩的已知Api函数名为:ZwOpenSection、ZwMapViewOfSection、ZwDeviceIoControlFile、ZwCreateFile、ZwOpenFile、ZwCreateProcess、ZwCreateProcessEx、ZwCreateUserProcess、ZwQueryInformationProcess,反汇编如下:

图:OD-挂钩底层API函数

在远程线程注入执行后,在winlogon.exe进程出现了联网行为。再此之前的单步跟踪则是dwm.exe进行联网访问,推测病毒是将联网执行的恶意代码注入到某个进程后,将联网操作交给了被注入的进程中。且联网的进程是存在随机性的。

图:联网行为监控

运行后会访问国外IP:148.81.111.121,通过VT查询该IP与多个恶意代码HASH绑定,Wireshark抓包后的数据包:

图:访问IP

通过Windows系统自带的DNS记录跟踪大量域名后,用系统命令确定病毒感染后访问的国外IP绑定的域名为ant.trenz.pl。

图:Windwos自带DNS记录访问的域名

图:系统命令关联域名的IP地址

PChunter查看winlogon已经被注入了3个线程。

跟到最后的几个call,已经是运行原先程序的代码。因为我用母体感染的是我自己写的程序。printf(“11111111”)就是。。。

这个病毒分析起来还是有意思的,没有办法像某些常见病毒一样可以IDA F5大法轻松查看伪C代码。C和汇编的基础需要提升的前提下,也引发了一些思考。

virut详细分析 - 米哈伊尔 - 博客园
http://www.cnblogs.com/Mikhail/p/5615286.html


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 2
支持
分享
最新回复 (8)
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
Q)如果是我自己写这类程序,还有什么思路可以隐藏进程。
A)ring3隐藏进程都是耍流氓,并没有什么卵用,先过了pchunter再说
Q)注入到系统进程内存中的数据,采用什么手段可以排查。
A)你需要监控NtWriteVirtualMemory,不过如果写入的是加壳的PE估计也没什么卵用
2017-11-6 09:38
0
雪    币: 4634
活跃值: (936)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
3
hzqst Q)如果是我自己写这类程序,还有什么思路可以隐藏进程。 A)ring3隐藏进程都是耍流氓,并没有什么卵用,先过了pchunter再说 Q)注入到系统进程内存中的数据,采用什么手段可以排查。 A) ...
感谢回复!这个病毒运行后对自身的病毒代码进行解密,单步跟踪中看到有zwWriteVirtualMemory,当CreatRemoteThread系统进程后,该系统进程就开始向国外IP发送请求。这段发送网络的代码如何提取呢?
2017-11-6 09:47
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
4
lipss 感谢回复!这个病毒运行后对自身的病毒代码进行解密,单步跟踪中看到有zwWriteVirtualMemory,当CreatRemoteThread系统进程后,该系统进程就开始向国外IP发送请求。这段发送 ...
监控ZwDeviceIoControlFile,过滤参数找到对\Device\Afd的操作,然后根据调用堆栈回溯回去
2017-11-6 10:04
0
雪    币: 562
活跃值: (4347)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
virut病毒和Sality病毒比较复杂,变种多,查杀和修复也是难点,之前研究过一段是时间,卡巴和小红伞都能比较好的修复,virut病毒和Sality病毒也是企业安全中比较难处理的病毒~~
2017-11-6 10:59
0
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
mark
2017-11-6 11:14
0
雪    币: 113
活跃值: (76)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
有样本么?
2017-11-6 12:17
0
雪    币: 4634
活跃值: (936)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
8



dragonwang

有样本么?
样本明日再发。
在大佬的指点下,进程注入的方式跟NativeAPI的内存映射进行代码注入的方式很像。
提及帖子:http://blog.csdn.net/coding_hello/article/details/1643083
2017-11-7 00:21
0
雪    币: 3136
活跃值: (97)
能力值: ( LV9,RANK:165 )
在线值:
发帖
回帖
粉丝
9
您好,我想问一下怎么找到那七个API对应的挂钩函数?
2017-11-24 11:04
0
游客
登录 | 注册 方可回帖
返回
//