恶意代码分析-第十七章-反虚拟机技术

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37809075/article/details/82585542

目录

笔记

实验

Lab17-1

Lab17-2

Lab17-3


笔记

VMware痕迹:VMware虚拟环境在系统中遗留了很多的痕迹,特别是VMware Tools安装之后。可以通过操作系统的文件系统,注册表和进程列表中的标记痕迹探测VMware的存在。

                       识别进程:VMwareService.exe  VMwareTray.exe VMwareUser.exe Service.exe等都是关于虚拟机的进程

                       识别MAC地址:00:0C:29

                       识别内存痕迹:搜索整个物理内存中VMware的字符串

查找漏洞指令:反虚拟机的X86指令:sidt,sgdt,sldt,smsw,str,in。cupid

    使用Red Pill反虚拟机技术:通过sidt指令获取IDTR寄存器的值。调用sidt指令,将IDTR寄存器的值存储,IDTR由6个字节组成,其中第五个字节的偏移量包含IDT的内存地址,将这个值与0xff比较去判断VMware存在。

    使用NO Pill技术:sgdt与sldt指令探测VMware是否存在。NO Pill依赖于LDT结构,正常情况下Windows不会使用LDT结构,而在虚拟机中是非0值。解决方法:防止sldt探测方法-->VM  Setting  Processors  勾选Disable Acceleration

    查询I/O通信端口:经常在Storm worm和Phatdot蠕虫和僵尸程序中,in指令把源操作数指定的端口复制到目的操作数的内存地址。解决方法:NOP指令替换in指令

var_1C是一个内存地址,用来存放从VMware返回的所有响应。inc指令使用参数EAX(magic参数),ECX操作数,返回值在EBX中。如果magic和VMXh匹配,代码运行在虚拟机中,将值放到EBX中。

       使用str指令:用来从寄存器中检索段选择子,段选择子指向当前运行的任务状态段(TSS)。str指令大返回值在虚拟机和宿主机中是不同的。

        解决:1.IDApython,通过IDApython将这些指令找出来

from idautils import*
from idc import*
heads = Heads(SegStart(ScreenEA()),SegEnd(ScreenEA)))
antiVM = []
for i in heads:
    if(GetMnem(i) == "sidt" or GetMnem(i) == "sgdt" or GetMnem(i) == "sldt" or GetMnem(i) == "smsw" or GetMnem(i) == "str" or GetMnem(i) == "in" or GetMnem(i) == "cupid"):
        antiVM.append(i)
print "Number of potential Anti-VM instructions: %d" % (len(antiVM))
for i in antiVM:
    SetColor(i,CIC_ITEM,0x0000ff)
    Message("Anti-VM: %08x\n" % i)

                    2.ScoopyNG:探测VMware探测工具

调整设置:

directexec指定用户模式下的代码模拟执行,而不是在硬件上运行。

前四条设置被VMware后门命令使用,不能获取宿主系统的信息

总结:一个代码在一个条件跳转处过早终止

实验

Lab17-1

Lab17-2

Lab17-3

猜你喜欢

转载自blog.csdn.net/m0_37809075/article/details/82585542
今日推荐