恶意代码分析实战17-1
Posted Neil-Yale
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了恶意代码分析实战17-1相关的知识,希望对你有一定的参考价值。
本次实验我们将会分析Lab17-01.exe文件。先来看看要求解答的问题
Q1.这个恶意代码使用了什么反虚拟机技术?
Q2.使用IDAPro,运行IDAPython脚本(提供的findAntiVM.py),看它发现了什么?
Q3.每种反虚拟机技术成功执行后会发生什么?
Q4.针对你的虚拟机,这些反虚拟机技术中哪些技术会生效?
Q5.为什么每个反虚拟机的技术,会生效或失败?
Q6.怎么使这些反虚拟机技术无效,从而让恶意代码运行?
IDA载入文件,运行findAntiVM.py来自动查找存在漏洞的x86指令
File->script file,选择该脚本
输出窗口的结果如下所示
由上图可知检测到了三条漏洞指令的类型
Q2.使用IDAPro,运行IDAPython脚本(提供的findAntiVM.py),看它发现了什么?
A2.这个脚本发现了三个可能的反虚拟机指令sidt、str和sldt,用红色对它们进行了高亮显示。
双击00401121,在IDA view-a可以看到红色高亮显示的sldt指令
另外的也是同样可以看到
sidt指令
str指令
我们依次分析
先来看sldt
sldt指令也称为no pill,是一种反虚拟机技术
可以看到var_8被eax赋值,而eax来自dword_406048
dword_406048是一个初始化常量
sldt指令的结果被存入var_8,通过一些列mov最后赋给了eax
我们看看sldt所在的函数sun_401100的交叉引用
跟入
可以看到sub_401100的返回值在eax,会与0xddcc0000比较,其实就是用于检查初始常量的第序比特位是否被设置为0
如果不是0,则执行跳转,跳到loc_40132b
之后就退出了
这样就不会走另外一个创建线程的分支
在od中,在4012d6下断点,然后执行
在右边可以看到此时EAX为ddcc0000,说明虚拟机检测失败
接下来看下第二条
可以看到会将sidt结果中最重要的四个字节存入var_420
在004011e3处,sidt的四个字节被移位。
移位之后,就是sidt的第五个字节与0xff(vmware的特征)比较。
如果比较成功,那么恶意代码检测到了虚拟环境,则会实现跳转
而跳转的目的地40132d是调用了sub_401000
可以看到该函数是用于删除自身并终止进程
我们可以在od中测试下
在4011e6下断的地方查看ecx
此时ecx并不是0xff,说明在我的环境中这种检测是失败的,这是因为我是在多核的虚拟机上进行实验
那么理所当然的,单步之后,跳转也是无法实现的
如下图所示
再来分析第三处
str指令将任务状态段TSS载入到一个四字节的本地变量var_418中
在调用GetModuleFileName后,该变量才会被使用
如果匹配VMware特征码,则00401235的结果为0,00401244的结果为0x40
如果str指令成功执行,则下图所示,恶意代码不会创建MalServive服务
我们在od中40122f下断点,执行
此时edx值为0x28,而不是0x400(vmware的特征码)
说明在我的环境中这个检查还是失败的
Q1.这个恶意代码使用了什么反虚拟机技术?
A1.恶意代码用存在漏洞的x86指令来确定自己是否运行在虚拟机中。
Q3.每种反虚拟机技术成功执行后会发生什么?
A3.如果sidt指令或者str指令探测到虚拟机,恶意代码将会删除自己。如果sldt指令探测到恶意代码,恶意代码将不创建主线程就退出,但是它将会创建恶意服务MalService。
Q4.针对你的虚拟机,这些反虚拟机技术中哪些技术会生效?
A4.针对我们的机器而言,所有的反虚拟机技术都未成功。技术是否会生效会随着使用软硬件的不同而不同。(在实验室的环境里是不会生效的)
Q5.为什么每个反虚拟机的技术,会生效或失败?
A5.在分析过程中已经给大家解释了,不再重复。
Q6.怎么使这些反虚拟机技术无效,从而让恶意代码运行?
A6.可以用NOP替换sidt和str指令,或者在调试恶意代码时,实时改变跳转标志。
参考:
1.《恶意代码分析实战》
以上是关于恶意代码分析实战17-1的主要内容,如果未能解决你的问题,请参考以下文章