我正在尝试分析虚拟机(linux)中的恶意软件,但是它使用丘比特输出来验证它是否在虚拟机/沙箱中,并且拒绝在虚拟环境中运行恶意代码。
是否可以更改/伪造cpuid指令的输出,以便当恶意软件检查cpuid标志时,它会看到非虚拟化机器的cpuid?
我知道我可以通过更改KVM配置来绕过这个问题(比如这教程中的“VM检测对策”部分),但是我想知道是否可以在不改变主机配置的情况下从来宾计算机中这样做?
我想过这个可能的解决方案:
1- $ set cpuid instruction output to X
2- $ run malware
3-当恶意软件调用cpuid时,它将看到非虚拟化环境的标志并执行恶意代码。
是否有执行第1项的命令?或者,在不更改主机的KVM配置的情况下,还有其他方法可以实现这一点吗?
发布于 2019-10-29 13:18:20
在对照已知的虚拟化CPUID值之前,需要将CPUID返回值存储在某个地方。
很难更改您的“硬件”沙箱CPUID值,但是您总是可以通过编辑系统返回的CPUID来欺骗恶意软件。
在反汇编程序中,尝试定位使用cpuid指令的位置。你应该看到这样的东西:
xor eax, eax
mov eax,0x40000000
cpuid
cmp ecx,0x4D566572
jne cpuid syscall描述如下:
根据最初在EAX寄存器中输入的输入值,将处理器标识和特征信息返回给EAX、EBX、ECX和EDX寄存器。
在上面的代码片段中,cpuid指令是用AEX参数= "0x40000000“初始化的,它将要求返回系统的"Hypervisor品牌”。
然后,在cpuid syscall之后,将对照"0x4D566572“检查ECX寄存器的值,这是一个VMware相关的CPUID值。
为了绕过这个验证,在cpuid指令之后设置一个断点,然后根据您的需要编辑寄存器,以模拟“非虚拟”环境。
还可以通过使用一些NOPs替换cpuid代码来修补恶意二进制代码。这将完全删除cpuid检查。
或者,您可以编辑cpuid值比较之后的条件跳转,并使其无用。
发布于 2019-10-29 08:41:32
CPUID值存储在模型特定寄存器(MSR)平台中。
对这些寄存器的读和写分别由rdmsr和wrmsr指令处理。由于这些是privileged指令,它们只能由操作系统执行。使用Linux内核模块可以创建一个伪文件/dev/cpu/xID/msr (每个处理器或处理器内核都有一个唯一的xID )。具有读取和/或写入此文件的权限的用户可以使用文件I/O访问这些寄存器。
替代示例: VC++ __readmsr生成rdmsr指令,该指令读取寄存器指定的特定于模型的寄存器并返回其值,但是函数在内核模式中是可用的<#>only,并且该例程只能作为内部函数使用。
https://security.stackexchange.com/questions/220357
复制相似问题