#1 楼
该列表可能是无止境的,所以我将其简短:虚拟化环境工件:注册表项,硬盘名称,网卡地址,特定驱动程序,...
环境差异:没有鼠标,互联网连接,声卡,...
执行差异:检测块翻译(创建另一个线程并在IP上应用统计信息),不同的系统寄存器值,...
缺少用户交互(特定于自动化环境):没有鼠标移动,没有文件操作,...
特定环境差异:VmWare后门,VirtualPC异常错误,...
(有关更多信息,请参见anti-debug标签Wiki)
#2 楼
有多种检测虚拟机/仿真器的方法,主要遵循在仿真中识别缺陷然后进行测试的模式。最简单的一端,通用虚拟化工具包将其名称贴在各种系统驱动程序和设备。仅查看网络连接的名称或它们的MAC地址就可能足以识别VMware(如果未专门配置掩盖该名称的话)。同样,VM的内存可能包含许多字符串,这些字符串使虚拟化软件的存在显而易见。
其他一些VM工件来自主机和来宾都必须具有处理器可以访问的,不能重叠的数据结构,例如返回中断描述符表寄存器的SIDT汇编指令。 (IDT)虚拟机通常将IDT存储在比物理主机更高的寄存器中。
测量通常需要与虚拟化系统交互的某些功能或指令的时间是间接推断您的一种方法在虚拟机中执行。
有两种方法可以用作反虚拟机方法:首先,一种方法可以修改虚拟环境以删除所有可能的虚拟化痕迹,从而可以很好地解决简单问题检查“ vmware”或类似的字符串,从而导致已知技术与狡猾的vm配置之间的某种军备竞赛。
第二种方法是在很大程度上依赖于静态分析来识别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技术的演示文稿。
评论
关于IDT,您是依靠Joanna Rutkowska的研究还是您自己的研究?似乎不太可靠。同样在Jason Geffner的博客上。
– 0xC0000022L♦
13年4月11日在12:45
#3 楼
以下是检测VM的一些技巧:VirtualBox
http://pastebin.com/RU6A2UuB(9种不同的方法,注册表,已删除的VBOX dll,管道名称等)
http://pastebin.com/xhFABpPL(机器提供商名称)
http://pastebin.com/v8LnMiZs(Innotek技巧)
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/wh4NAP26(VBoxSharedFolderFS技巧)
http://pastebin.com / Nsv5B1yk(恢复标记技巧)
VirtualPc
http://pastebin.com/wuqcUaiE
http://pastebin.com/VDDRcmdL
http://pastebin.com/exAK5XQx(重置技巧)
http://pastebin.com/HVActZMC(CPUID技巧)
管理程序检测
http://pastebin.com/2gv72r7d
即使我尝试使代码易于说明,您也可以参考相应的博客文章以获取更多详细信息。
#4 楼
我写了一段测试程序(在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;
以下功能检查通过供应商品牌字符串(在VMware上返回“ VMwareVMware”)访问Hyper-V:
function IsRunningUnderHyperV: BOOL; stdcall;
var
VMBranding: array[0..12] of AnsiChar;
begin
asm
mov eax, 000000;
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;
相关链接:
VMware KB检测并使用应用程序中的CPU功能
Codeproject,检测程序是否在虚拟机中运行
#5 楼
在之前的答案文章的附加内容中,cuckoosandbox为虚拟机检测实现了一些yara规则:评论
请添加有关链接和/或相关事项的简短描述。仅链接的答案不视为答案。
–asheeshr
13年5月7日14:36
#6 楼
您可以在布谷鸟沙箱存储库中找到常见的技巧。评论
请添加有关链接和/或相关事项的简短描述。仅链接的答案不视为答案。
–asheeshr
13年5月7日14:36
#7 楼
就像一种相关的注释,但回避了实际问题。去年(2013年)在柏林举行的VB会议上,有一个关于基于KVM的修改型管理程序的演示。它叫做CXPInspector,他们给出的演示文稿(技术流中的第一个)可以在这里找到。这是相应的论文/论文(237页),而这是一篇简短的相关论文(尽管而不是直接与CXPInspector有关。)
该方法利用了较新的处理器功能。该演示文稿提供了很好的概述。基本上,除了基于CPU和管理程序实现缺陷的攻击之外,唯一可以想到的攻击就是定时攻击。尽管如今许多机器运行很快,但这也不是一种非常可靠的方法。过去曾经是,但现在充其量是赌博。
#8 楼
这是在开源程序中实现的反沙箱/ vm /调试器技术的集合,它将使您清楚地知道如何检测虚拟化:https://github.com/LordNoteworthy/al-khaser。这里是受支持的技术的列表:
反调试攻击
IsDebuggerPresent
CheckRemoteDebuggerPresent
进程环境块(正在调试) )
进程环境块(NtGlobalFlag)
ProcessHeap(标志)
ProcessHeap(ForceFlags)
NtQueryInformationProcess(ProcessDebugPort)
NtQueryInformationProcess(ProcessDebugFlags)
NtQueryInformationProcess(ProcessDebugObject )
NtSetInformationThread(HideThreadFromDebugger)
NtQueryObject(ObjectTypeInformation)
NtQueryObject(ObjectAllTypesInformation)
CloseHanlde(NtClose)无效句柄
SetHandleInformation(受保护的句柄)
UnFilteredHandledException br /> OutputDebugString(GetLastError())
硬件断点(SEH / Get ThreadContext)
软件断点(INT3 / 0xCC)
内存断点(PAGE_GUARD)
中断0x2d
中断1
父进程(Explorer.exe)
SeDebugPrivilege (Csrss.exe)
NtYieldExecution / SwitchToThread
TLS回调
反倾销
从内存中删除PE标头
SizeOfImage
定时攻击[Anti-Sandbox]
RDTSC(具有CPUID强制VM退出)
RDTSC(具有GetProcessHeap和CloseHandle的锁定版本) )
睡眠-> SleepEx-> NtDelayExecution
睡眠(循环一小段延迟)
睡眠并检查时间是否已加速(GetTickCount)
SetTimer(标准Windows计时器)
timeSetEvent(多媒体计时器)
WaitForSingleObject-> WaitForSingleObjectEx-> NtWaitForSingleObject
WaitForMultipleObjects-> WaitForMultipleObjectsEx->
人机交互/通用[反沙盒]
鼠标移动
总物理内存(GlobalMemoryStatusEx)
使用DeviceIoControl的磁盘大小(IOCTL_DISK_GET_LENGTH_INFO)
使用GetDiskFreeSpaceEx的磁盘大小(TotalNumberOfBytes)
处理器数量(Win32 / Tinba-Win32 / Dyre)
反虚拟化/全系统仿真
注册表键值工件
硬件\ DEVICEMAP \ Scsi \ Scsi端口0 \ Scsi总线0 \目标ID 0 \逻辑单元ID 0(标识符)(VBOX)
硬件\ DEVICEMAP \ Scsi \ Scsi端口0 \ Scsi总线0 \目标ID 0 \逻辑单元ID 0(标识符)( QEMU)
硬件\描述\系统(SystemBiosVersion)(VBOX)
硬件\描述\系统(SystemBiosVersion)(QEMU)
硬件\描述\系统(VideoBiosVersion)(VIRTUALBOX)
硬件\描述\系统(SystemBiosDate)(06/23/99)
硬件\ DEVICEMAP \ Scsi \ Scsi端口0 \ Scsi总线0 \目标ID 0 \逻辑单元ID 0(标识符)(VMWARE)
硬件\ DEVICEMAP \ Scsi \ Scsi端口1 \ Scsi总线0 \目标ID 0 \逻辑单元ID 0(标识符)(VMWARE)
硬件\ DEVICEMAP \ Scsi \ Scsi端口2 \ Scsi总线0 \目标ID 0 \逻辑单元ID 0(标识符)(VMWARE)
注册表项文物
“硬件\ ACPI \ DSDT \ VBOX__”
“硬件\ ACPI \ FADT \ VBOX__”
“硬件\ ACPI \ RSDT \ VBOX__”
/>“软件\ Oracle \ VirtualBox来宾添加”
“ SYSTEM \ ControlSet001 \ Services \ VBoxGuest”
“ SYSTEM \ ControlSet001 \ Services \ VBoxMouse”
“ SYSTEM \ ControlSet001 \ Services \ VBoxService”
“ SYSTEM \ ControlSet001 \ Services \ VBoxSF”
“ SYSTEM \ ControlSet001 \ Services \ VBoxVideo”
软件\ VMware,Inc. \ VMware工具
软件\葡萄酒
文件系统工件
“ system32 \ drivers \ VBoxMouse.sys”
“ system32 \ drivers \ VBoxGuest.sys”
"system32\drivers\VBoxSF.sys“
” system32 \ drivers \ VBoxVideo.sys“
” system32 \ vboxdisp.dll“
” system32 \ vboxhook.dll“
“ system32 \ vboxmrxnp.dll”
“ system32 \ vboxogl.dll”
“ system32 \ vboxoglarrayspu.dll”
“ system32 \ vboxoglcrutil.dll”
“ system32 \ vboxoglerrorspu.dll”
“ system32 \ vboxoglfeedbackspu.dll”
“ system32 \ vboxoglpackspu.dll”
“ system32 \ vboxoglpassthroughspu.dll “
” system32 \ vboxservice.exe“
” system32 \ vboxtray.exe“
” system32 \ VBoxControl.exe“
” system32 \ drivers \ vmmouse.sys“
“ system32 \ drivers \ vmhgfs.sys”
目录工件
“%PROGRAMFILES%\ oracle \ virtualbox来宾添加\“
”%PROGRAMFILES%\ VMWare \“
存储器工件
Interupt描述符表(IDT) location
本地描述符表(LDT)位置
Global Descriptor Table(GDT)位置
使用STR的任务状态段技巧
MAC地址
“ \ x08 \ x00 \ x27”(VBOX)
“ \ x00 \ x05 \ x69”(VMWARE)
“ \ x00 \ x0C \ x29 “(VMWARE)
” \ x00 \ x1C \ x14“(VMWARE)
” \ x00 \ x50 \ x56“(VMWARE)
虚拟设备
“ \\。\ VBoxMiniRdrDN”
“ \\。\ VBoxGuest”
"\\.\pipe\VBoxMiniRdDN“
” \\。\ VBoxTrayIPC“
” \\。\ pipe \ VBoxTrayIPC“)
” \\。\ HGFS“
"\\.\vmci“
硬件设备信息
SetupAPI SetupDiEnumDeviceInfo(GUID_DEVCLASS_DISKDRIVE)
QEMU
VMWare
VBOX
虚拟高清
适配器名称
VMWare
Windows类
VBoxTrayToolWndClass
VBoxTrayToolWnd
网络共享
VirtualBox共享文件夹
进程
vboxservice.exe(VBOX)
vboxtray.exe(VBOX)
vmwaretray.exe(VMWARE)
vmwareuser(VMWARE)
vmsrvc.exe(VirtualPC)
vmusrvc.exe(VirtualPC)
prl_cc.exe(Parallels)
prl_tools.exe(Parallels)
xenservice .exe(Citrix Xen)
WMI
SELECT * FROM Win32_Bios(SerialNumber)(VMWARE)
SELECT * FROM Win32_PnPEntity(DeviceId)(VBOX)
SELECT * FROM Win32_NetworkAdapterConfiguration(MACAddress)(VBOX)
SELECT * FROM Win32_NTEventlogFile(VBOX)
SELECT *从Win32_Processor(NumberOfCores)(GENERIC)
SELECT *从Win32_LogicalDisk(大小)(GENERIC)
DLL导出和加载的DLL
kernel32.dll!wine_get_unix_file_name葡萄酒(Wine)
sbiedll.dll(Sandboxie)
api_log.dll(iDefense实验室)
dir_watch.dll(iDefense实验室)
pstorec.dll(SunBelt沙箱)
vmcheck.dll(虚拟PC)
wpespy.dll(WPE Pro)
CPU *
使用(EAX = 0x1)的系统管理程序存在
使用(EAX = 0x40000000)的系统管理程序供应商
“ KVMKVMKVM \ 0 \ 0 \ 0”(KVM)
“ Microsoft Hv”(Microsoft Hyper-V或Windows Virtual PC)
“ VMwareVMware”(VMware)
“ XenVMMXenVMM”(Xen)
“ prl hyperv “(平行)
-” VBoxVBoxVBox“(VirtualBox)
反分析
进程
OllyDBG / ImmunityDebugger / WinDbg / IDA Pro
SysInternals套件工具(进程浏览器/进程监视器/ Regmon / Filemon,TCPView,自动运行)
Wireshark / Dumpcap
ProcessHacker / SysAnalyzer / HookExplorer / SysInspector
ImportREC / PETools / LordPE
JoeBox沙箱
评论
您是在试图欺骗试图检测它是否在虚拟环境中运行的程序,以为不是吗?我认为我的问题范围太广了。我将对其进行编辑,使其仅专注于检测虚拟化环境(之后可能会采取对策)。
请注意,某些工具(imvirt)或存在一些其他类似的简单技术。但是,这些技术基于以下事实,即虚拟程序不会尝试隐藏自身。
我张贴了一些链接[阻止虚拟机检测A](handlers.sans.org/tliston/ThwartingVMDetection_Liston_Skoudis.pdf).. [此未检测到](操作系统可以判断它们是否在虚拟机中运行吗?)..VMD最初由研究目的RED-Pill和Blue-Pil编写,用于攻击目的的两种新病毒MyDoom和stuXmet都无法正确分解!