本次实验我们将会分析 lab17-02文件。先来看看要求解答的问题
Q1.这个DLL导出了什么?
Q2.尝试使用rundll.32.exe安装后,都发生了什么?
Q3.它创建了哪些文件,这些文件都包含什么内容?
Q4.它使用何种反虚拟机方法?
Q5.在恶意代码运行时,怎么强制安装它。
Q6.怎样可以永久禁用这些反虚拟机技术?
Q7.每个安装的导出函数是如何工作的?
将dll文件载入peview
可以看到大量的导入函数,包括:
RegSetValueEx:操作注册表
ChangeService:操作服务
BitBlt:屏幕抓取
CreateToolhelp32Snapshot:列举进程
CreateRemoteThread:进程注入
WS2_32.dll:网络功能
还有导出函数
这些导出函数基本都是用于恶意代码的安装与卸载
Q1.这个DLL导出了什么?
A1.导出函数是InstallRT、 InstallSA、 InstallSB、 PSLIST、 ServiceMain、 StartEXS、UninstallRT、UninstallSA,以及UninstallSB
上图中ServiceMain说明恶意代码可能作为一个服务运行
接下来我们运行,并用process monitor监控
设置好过滤器
然后使用rundll32.exe运行
此时在我们原先放置lab17-02.dll的目录下,该dll被删除了,多了一个xinstall.log
打开文件,内容如下
说明二进制程序中存在反虚拟机技术
Q2.尝试使用rundll.32.exe安装后,都发生了什么?
A2.DLL被从系统中删除,同时多了一个log文件。
检查process monitor的监控结果
有创建、读写log的行为,同时可以看到创建一个bat文件,推测这是用于删除使用的
接下来我们使用IDA继续分析
打开strings窗口搜索bat关键字符串
双击,然后查看交叉引用
跟入sub_100056667
可以看到这个函数就是用于写入bat文件的自删除脚本代码
Q3.它创建了哪些文件,这些文件都包含什么内容?
A3.创建一个包含自我删除代码的.bat文件,同时还创建一个包含字符串Found Virtual Machine,Install Cancel的xinstall.log文件。
对该函数查看交叉引用
先跟入第一处InstallRT
在调用的上方,看见了我们在xinstall,log中看到字符串,而其前后都调用了sub_10003592
跟入后可知
第一处调用是为了打开xinstall.log
第二处则是为了写入那个字符串
回到上层函数,我们可以看到有两条路径可以走到
绿色的是在调用sub_10006119,红色的多调用了一个sub_10006196
sub_10006119如下所示
这是用于清零eax
来看看sub_10006196
100061c7处,magic数0x564d5868(VMXh)被载入到EAX
100061d1将执行动作0xA载入ECX,0xA表示获取VMware的版本信息
100061D6将虚拟端口0x5658载入到EDX
100061db处代码使用in指令查询I/O通信端口(0x5668)(vmware在虚拟机与宿主操作系统之间使用虚拟I/O端口通信)
100061dc处通过cmp检查magic数的回应
100061e2处比较结果被送入var_1c
在100061fa将var_1c送入AL
可以看到这里在检测虚拟机时,不关心vmware的版本,而只是通过magic值来查看I/O通信端口的回应
在运行时,我们可以用NOP替换in指令,绕过后门I/O通信端口技术,使得程序完成安装
Q4.它使用何种反虚拟机方法?
A4.恶意代码使用x86指令in,用magic值VX和动作0xA查询VMware的后门I/O通信端口。
Q5.在恶意代码运行时,怎么强制安装它。
A5.为了安装恶意代码,在它运行过程中修补0x100061DB处的in指令。
我们继续分析InstallRT
通过atoi将字符串转为数字,要转换的内容中在off_10019034
[This is DVM]5被载入EAX
然后与0xD相加,相当于将字符串指针移到了5的位置
然后通过atoi将字符串5转为数字5
之后通过test指令查看转换后的数字是否为0
如果不为0,则会往左边走,接着就会执行虚拟机的检测操作
所以我们如果将字符串[This is DVM]5修改为[This is DVM]0,这样恶意代码就不会进行虚拟机检测了
Q6.怎样可以永久禁用这些反虚拟机技术?
A6. 为了永久性禁用VM检查,用十六进制编辑器将二进制文件中的静态字符串从[This is DVM]5修改为[This is DVM]0。 另外,使用OllyDbg用NOP替换检查指令,并且将修改写入硬盘。
我们在下图的静态配置选项中
看到了端口80,域名newsnews.practicemalwareanalysis.com
而[This is log]1似乎可以通过LOG选项来确定是否应该创建和使用xinstall.log
我们继续分析InstallRT
跟入sub_1000D3D0
首先将恶意代码复制到windows系统目录
调用strlen计算字符串长度,如果长度为0(即没有参数),则使用iexplore.exe作为默认进程名,它将被作为恶意代码dll注入的目标进程
在1000d53a处调用了sub_10004249
从其调用的函数来看,不难知道该函数是用于查找进程列表中的目标进程
sub_10004249返回值保存在eax,又赋给了esi
如果找到了目标进程,则在调用sub_1000d10d是通过dwProcessId参数使用目标进程的PID,跟入该函数
上图列出的函数都是进程注入时常见的函数调用
那么我们就清楚了,InstallRT是通过dll注入来启动恶意代码的
接下来分析InstallSA
大部分和InstallRT是差不多的,区别在于最后调用了sub_1000d920,跟入该函数
在1000dbc4调用了CreateServieA创建服务
创建服务之后,InstallSA设置ServiceDLL路径为这个恶意代码在windows系统目录中的路径
最后看看InstallSB
这里调用了sub_10005a0a和sub_1000df22,先看sub_10005a0a
从其调用的函数和字符串来看,作用是用于禁用windows的文件保护
再看看sub_1000df22
其带有一个包含服务名的可选参数,默认为NtmsSvc
恶意代码用这个参数覆盖本地系统中的一个服务。
默认情况下,如果NetmsSvc服务正在运行,恶意代码会停止这个服务,用自身覆盖windows系统目录中的ntmssvc.dll。
最后,恶意代码尝试再次启动这个服务,如果恶意代码不能启动这个服务,恶意代码就执行dll注入
Q7.每个安装的导出函数是如何工作的?
A7. InstallRT 通过带有被注入进程可选参数的DLL注入来执行安装。InstallSA 通过服务安装来执行安装。InstallSB 通过服务安装来执行安装,如果覆盖的服务仍在运行,则使用DLL注入来安装。
参考:
1.《恶意代码分析实战》