程序检测它在虚拟化环境中执行的不同方式有哪些?并且,是否有可能检测到使用了哪种虚拟化?
如何检测虚拟化环境?
这个列表可能是无止境的,所以我会保持简短:
- 虚拟化环境工件:注册表项、硬盘名称、网卡地址、特定驱动程序、...
- 环境差异:没有鼠标,互联网连接,声卡,...
- 执行差异:检测块转换(创建另一个线程并在 IP 上应用统计信息),不同的系统寄存器值,...
- 缺乏用户交互(特定于自动化环境):没有鼠标移动,没有文件操作,...
- 具体环境差异:VmWare 后门、VirtualPC 异常错误、...
(查看反调试标签wiki了解更多)
有多种检测虚拟机/模拟器的方法,主要遵循识别模拟中的缺陷然后对其进行测试的模式。
在最简单的一端,常见的虚拟化工具包将它们的名字贴在各种系统驱动程序和设备上。如果没有专门配置为屏蔽这些,只需查看网络连接的名称或其 MAC 地址可能就足以识别 VMware。同样,VM 的内存可能有很多字符串,使虚拟化软件的存在显而易见。
其他一些 VM 工件来自主机和来宾都必须具有处理器可访问的不能重叠的数据结构,例如用于返回中断描述符表寄存器的 SIDT 汇编指令。(IDT) 虚拟机通常将 IDT 存储在比物理主机更高的寄存器中。
测量通常需要与虚拟化系统交互的某些功能或指令的时间是一种间接推断您正在 VM 中执行的方法。
想到两种方法作为反反 VM 方法:第一,可以修改虚拟环境以消除所有可能的虚拟化痕迹,这可以很好地对抗对“vmware”或类似字符串的简单检查,从而导致各种军备竞赛在已知技术和狡猾的虚拟机配置之间。
第二种方法是严重依赖静态分析来识别 VM 检测技术,并在这样做后修补它们以抵消它们的影响,以产生非 VM 感知的可执行文件,然后可以对其进行动态分析。
一些具有良好信息的来源,如果是几岁的话:
- http://www.symantec.com/avcenter/reference/Virtual_Machine_Threats.pdf - Peter Ferrie 对虚拟机模拟器的攻击
- http://handlers.sans.org/tliston/ThwartingVMDetection_Liston_Skoudis.pdf - 2006 年关于不同反 Vm 和反反 VM 技术的演示。
以下是检测 VM 的一些技巧:
虚拟盒子
http://pastebin.com/RU6A2UuB(9种不同的方法、注册表、删除的 VBOX dll、管道名称等)
http://pastebin.com/xhFABpPL (机器供应商名称)
http://pastebin.com/fPY4MiYq(Bios品牌和 Bios 版本)
http://pastebin.com/Geggzp4G(Bios品牌和 Bios 版本)
http://pastebin.com/T0s5gVGW(解析 SMBiosData 搜索新引入或奇异类型)
http://pastebin.com/AjHWApes(Cadmus Mac 地址技巧)
http://pastebin.com/Nsv5B1yk(恢复标记技巧)
虚拟电脑
管理程序检测
尽管如此,我试图使代码自我解释,您也可以参考相应的博客文章以获取更详细的信息。
我写了一个测试程序(在 Delphi 中)。
下面两个函数检测VMware和HyperV
// VMware detection as described by Elias Bachaalany
function IsInsideVMware: Boolean;
begin
Result := True;
try
asm
push edx;
push ecx;
push ebx;
mov eax, 'VMXh';
mov ebx, 0;
mov ecx, 10;
mov edx, 'VX';
in eax, dx;
cmp ebx, 'VMXh';
setz [Result];
pop ebx;
pop ecx;
pop edx;
end;
except
Result := False;
end;
end;
function IsHyperV: Boolean;
asm
cpuid;
test ecx, ecx;
sets [Result];
end;
以下函数通过供应商品牌字符串检查 Hyper-V(在 VMware 上返回“VMwareVMware”:
function IsRunningUnderHyperV: BOOL; stdcall;
var
VMBranding: array[0..12] of AnsiChar;
begin
asm
mov eax, $40000000;
cpuid;
mov dword ptr [VMBranding+0], ebx; // Get the VM branding string
mov dword ptr [VMBranding+4], ecx;
mov dword ptr [VMBranding+8], edx;
end;
VMBranding[12] := #0;
Result := CompareText(String(VMBranding), 'Microsoft Hv') = 0;
end;
相关链接: