恶意代码分析实战——反虚拟机技术对抗

在这里插入图片描述


QQ 1274510382
Wechat JNZ_aming
商业联盟 QQ群538250800
技术搞事 QQ群599020441
解决方案 QQ群152889761
加入我们 QQ群649347320
共享学习 QQ群674240731
纪年科技aming
网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。

叮叮叮:产品已上线 —>关注 官方-微信公众号——济南纪年信息科技有限公司
民生项目:商城加盟/娱乐交友/创业商圈/外包兼职开发-项目发布/
安全项目:态势感知防御系统/内网巡查系统
云服项目:动态扩容云主机/域名/弹性存储-数据库-云盘/API-AIeverthing
产品咨询/服务售后(同)

纸上得来终觉浅,绝知此事要躬行 !!!
寻找志同道合伙伴创业中。。。抱团滴滴aming联系方式!!


#本文为广告系统自动投放广告
# 如有侵权 删改 请速速联系我们



本科/专科信息安全专业

计算机网络、操作系统




实验目的

本章的实验我们着重关注恶意代码的反虚拟机技术及相应的对抗方法。

在本实验中,我们将会学习恶意代码采用的4种不同的反虚拟机技术,
分别是
查询通信I/O端口、mac地址、注册表键值、以vmware开头的进程等,

并学会如何使这些技术失效,更进一步地,

我们会学到如何使用ollydbg对其进行patch。




预备知识
1.IDA Pro
IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,
交叉Windows或Linux WinCE MacOS平台主机来分析程序,
被公认为最好的花钱可以买到的逆向工程利器。

IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。
它支持数十种CPU指令集其中

包括Intelx86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。

2.ProcessMonitorProcess Monitor(进程监视器)

是一个Windows下的高级监视工具,可以实时显示文件系统、注册表和进程/线程的活动。
它将Sysinternals以前的两个实用程序Filemon(文件监视器)和Regmon(注册表监视器)结合在一起,
并且添加了大量的改进功能,
包括丰富的非破坏性的过滤器,
全面的事件属性——如会话ID和用户名,可靠的进程信息,
对每个操作带有集成的调试符号支持的完整线程堆栈,
同步记录日志文件等等。

Process Monitor独特的强大功能将使它成为你在系统故障排除和恶意软件查杀中使用的核心实用程序。




实验环境
服务器:Windows xp
在这里插入图片描述

辅助工具:Process Monitor,IDA Pro




Q1.与lab12-02.exe比较,当你在虚拟机中运行这个恶意代码时会发生什么?

Q2.怎么让这个恶意代码运行,并且关闭它的键盘记录呢?

Q3.这个恶意代码使用了何种反虚拟机技术?

Q4.你可以对系统做什么样的变化,从而使你能够永久避免恶意代码所使用的反虚拟机技术?

Q5.为了让反虚拟机技术永久失效,你该如何用OllyDbg对二进制文件进行修补?

在运行文件之前,打开process monitor设置过滤条件进行监控
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接着双击运行试验文件
在这里插入图片描述

此时在process monitor就可以捕获很多信息了
在这里插入图片描述

这个程序除了添加了相应的反虚拟机技术以外,其他方面是和Lab12-02.exe完全相同的,
也就是说,它使用了进程的替换技术,替换了正常的svchost.exe进程。
运行之后,发现程序很快终止了,从而隐藏了真正的行为。

Q1.与Lab12-02.exe比较,当你在虚拟机中运行这个恶意代码时会发生什么?

A1.与Lab12-02不同的是,当这个恶意代码在虚拟机中运行时,它会立即终止。
另外,这个恶意代码在svchost.exe上执行了进程替换。




IDA载入
在这里插入图片描述

使用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种不同的反虚拟机技术:

1)使用后门I/O通信端口。

2)搜索在注册表键SYSTEM\CurrentControlSet\Control \DeviceClasses下的vmware字符串。

3)检查MAC地址,查看它是否是VMware默认使用的MAC地址。

4)用字符串哈希函数来搜索进程列表中以字符串vmware开头的进程。




Q4.你可以对系统做什么样的变化,从而使你能够永久避免恶意代码所使用的反虚拟机技术?

A4.为了逃避这个恶意代码使用的反虚拟机技术,你可以卸载VMware工具并修改MAC地址。




Q5.为了让反虚拟机技术永久失效,你该如何用OllyDbg对二进制文件进行修补?

A5.在OllyDbg中,你可以采用下面的补丁:

用NOP替换0x40145D处的指令。

修改0x40199F 和0x4019BE处的指令为xor eax,eax。 test—>异或

修改0x40169F 处的指令为jmp 0x40184A。

配套学习资源
1.《恶意代码分析实战》

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值