恶意代码分析实战17-3
Posted Neil-Yale
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了恶意代码分析实战17-3相关的知识,希望对你有一定的参考价值。
本次实验我们将会分析lab17-03文件。先来看看要求解答的问题
Q1.与lab12-02.exe比较,当你在虚拟机中运行这个恶意代码时会发生什么?
Q2.怎么让这个恶意代码运行,并且关闭它的键盘记录呢?
Q3.这个恶意代码使用了何种反虚拟机技术?
Q4.你可以对系统做什么样的变化,从而使你能够永久避免恶意代码所使用的反虚拟机技术?
Q5.为了让反虚拟机技术永久失效,你该如何用OllyDbg对二进制文件进行修补?
在运行文件之前,打开process monitor设置过滤条件进行监控
接着双击运行试验文件
此时在process monitor就可以捕获很多信息了
这个程序除了添加了相应的反虚拟机技术以外,其他方面是和Lab12-02.exe完全相同的,也就是说,它使用了进程的替换技术,替换了正常的svchost.exe进程。运行之后,发现程序很快终止了,从而隐藏了真正的行为。
Q1.与lab12-02.exe比较,当你在虚拟机中运行这个恶意代码时会发生什么?
A1.与Lab12-2不同的是,当这个恶意代码在虚拟机中运行时,它会立即终止。另外,这个恶意代码在svchost.exe上执行了进程替换。
IDA载入Lab17-03.exe
使用findAntiVM.py查找x86漏洞指令
结果如下
在401ac8处识别了一个反虚拟机指令,以红色高亮显示
这里是通过in指令查询的后门I/O通信端口
如果运行在虚拟机中,则sub_401a80返回1,否则返回0
查看该函数的交叉引用
来到main函数
可以看到该函数的返回值会通过test,jz指令影响程序的执行
如果是往左边走
是直接就结束了
很明显,我们是希望往右边走
那么我们就要保证eax为0
为了实现给eax赋0,我们可以将test修改为xor
接下来我们看看stirng窗口
上图显示为阴影的字符串似乎是一个注册表的路径,上面的GetAdapterInfo是用于获取网络适配器相关信息的函数,这类注意到vmware
我们分析一下,双击后查看交叉引用
跟入sub_4011c0
看看它交叉引用图
可以看到调用了多个注册表相关函数,最重要的是上图圈起来的,有一个循环的箭头,表示它还会调用自身。我们可以推测这是在注册表中递归检查字符串vmware
分析sub_4011c0
这里有个循环结构,这是在循环遍历DeviceClasses下的注册表子键
调用sub_401060
跟入可知其作用是将字母转为小写
在将每个子键名的前6个字节转为小写后,与字符串vmware进行比较
查看sub_4011c0交叉引用
跟入在main函数中调用的地方
在其调用之前,有三个push,说明有三个参数
其中之一就是之前看到的注册表的路径,所以猜测函数就是从这个路径开始递归检查注册表的,这就是对系统驻留痕迹的检查
我们希望能够实现004019c0的跳转,所以我们将test改为xor即可确保零标志位置位
接着我们看看GetAdapterInfo字符串
双击后查看交叉引用
来到main
通过LoadLibraryA和GetProcAddress动态解析GetAdapterInfo,并将地址保存在dword_403114,这里可以将其重命名为GetAdapterInfo_Address
查看其交叉引用
跟入第一处
其上是一系列字节mov,一共有27条
双击Var_38,将其设置为一个大小为27字节的数组来将这些mov字节初始化Wie一个字节数组
如下操作,右键
Array Size设为27
修改完成后如图所示
可以将var_38重命名为Byte_Array
在调用GetAdapterInfo时可以看到,其有两个参数
查阅MSDN文档可知
两个参数分别为IP_ADAPTER_INFO结构的链表和链表的长度
而对应着IDA可知,传入的链表为NULL,传入的链表大小来自dwBytes
一般来说,在调用GetAdapterInfo_Address时,设置它的第一个参数为NULL是找出函数返回数据大小的简单方法,从而为第二个GetAdapterInfo_Address调用使用的链接结构分配内存。
所以我们可以在之后简单GetProcessHeap,HeapAlloc使用dwBytes
调用HeapAlloc为再次调用GetAdapterInfo_Address分配内存,其返回值在lpMem
在第二次调用GetAdapterInfo_Address时可以看到传入的第一个参数不是NULL,而是IpMem
随后,lpMem成了大小为dwBytes的IP_ADAPTER_INFO结构链表的一个指针
我们需要在IDA中添加IP_ADAPTER_INFO结构
来到structure窗口,按insert键
点击add standard structure
找到该结构,点击ok
这样我们就可以将这个结构应用到反汇编数据上
修改后如图
在上图中注意到,type分别与0x6,0x71比较,查阅MSDN可知,这分别对应的是以太网和802.11无线适配器类型。用于检查网络接口时以太网接口还是无线接口。
而最后一个cmp则是对地址长度进行比较
如果检查失败,则循环到链表中下一个适配器。检查成功则会来到
将循环计数器var_3c加3
将194h右键转换如下
004017d0:给ecx赋3
004017e2:var_3c赋给eax
004017e5:使用eax索引Byte_Array
将Byte_Array中的一个索引与当前的IP_ADAPTER_INFO.Address比较
由于ecx被赋3,所以004017f4处的repe cmpsb指令会将IP_ADAPTER_INFO.Address的前三个字节与Byte_Array比较
Byte_Array内容:
光标定位到Byte_Array,按x键
也就是说此处是在查看MAC地址的前三个字节是否为{00h,50h,56h}或者{00h,0ch,29h}等
我们查到,00,0c,29是VMware MAC地址的默认开始。由于数组长度为27,所以可知此处比较了9个不同的MAC地址
为了避免这种技术的检测,我们可以将40169f的jnz指令改为jmp 0x40184a
这样就可以跳过MAC地址的检查,直接到资源节操纵代码
恶意代码最后一处针对虚拟机的检查在sub_401400
跟入该函数
调用了sub_401130,可以看到传入的两个参数分别为6和0f30d125ah
该函数返回值将决定jz指令时候会跳转
跟入这个函数
通过上图看到的几个关键函数和循环结构可知,这是在遍历进程列表
之后调用了sub_401060,其参数之一是进程名称,这函数用于将字母转成小写
之后调用sub_401000,其参数为arg_4,以及sub_401060的返回值,也就是其返回的小写字符串
而sub_401000的返回值会在00401195处的cmp与arg_0比较
回溯可知
arg_0就是F30D125A
如果00401195处比较结果相等,则走右边
eax被赋1,恶意代码终止
sub_401000将进程名称转换为一个数字,然后将数字与预设值比较。Sub_401000是一个简单的字符串hash函数,如果给定的参数是vmware,则返回0xF30D12A5.从而终止恶意代码
为了禁用这个检查反虚拟机检查的部分,可以用nop替换到40145d处的sub_401130调用
Q2.怎么让这个恶意代码运行,并且关闭它的键盘记录呢?
A2.我们可以使用nop指令将位于0x0040145D的指令填充掉即可
Q3.这个恶意代码使用了何种反虚拟机技术?
A3.这个恶意代码使用了如下4种不同的反虚拟机技术:
使用后门I/O通信端口。
搜索在注册表键SYSTEM\\CurrentControlSet \\Control \\DeviceClasses下的vmware字符串。
检查MAC地址,查看它是否是VMware默认使用的MAC地址。
用字符串哈希函数来搜索进程列表中以字符串vmware开头的进程
Q4.你可以对系统做什么样的变化,从而使你能够永久避免恶意代码所使用的反虚拟机技术?
A4.为了逃避这个恶意代码使用的反虚拟机技术,你可以卸载VMware工具并修改MAC地址。
Q5.为了让反虚拟机技术永久失效,你该如何用OllyDbg对二进制文件进行修补?
A5.在OllyDbg中,你可以采用下面的补丁:
用NOP替换0x40145D处的指令。
修改0x40199F 和0x4019BE处的指令为xor eax,eax。
修改0x40169F 处的指令为jmp θx40184A。
参考:
1.《恶意代码分析实战》
以上是关于恶意代码分析实战17-3的主要内容,如果未能解决你的问题,请参考以下文章