4.根據特定的文件夾或文件信息
通過查找磁盤中是否存在特定的文件夾或文件,判斷當前是否在虛擬機中。VMware虛擬機中通常會有路徑C:\\Program Files\\VMware\\VMware Tools\\;VirtualBox 虛擬機中通常會有路徑 C:\\Program Files\\Oracle\\VirtualBox Guest Additions\\。
BOOL CheckVMware()
{
if (PathIsDirectory("C:\\\\Program Files\\\\VMware\\\\VMware Tools\\\\") == 0)
{
return FALSE;
}
else
{
return TRUE;
}
}
BOOL CheckVirtualBox()
{
if (PathIsDirectory("C:\\\\Program Files\\\\Oracle\\\\VirtualBox Guest Additions\\\\") == 0)
{
return FALSE;
}
else
{
return TRUE;
}
}
5.根據特定注冊表信息
通過讀取主機具有虛擬機特性的注冊表位置來判斷是否處于虛擬機環境中。針對VMware可以判斷注冊表項HKEY_CLASSES_ROOT\\Applications\\VMwareHostOpen.exe;針對VirtualBox可以判斷注冊表項HKEY_LOCAL_MACHINE\\SOFTWARE\\Oracle\\VirtualBox Guest Additions。當然,注冊表中能被檢測出的位置很多,這里只是舉個例子。
BOOL CheckVMWare()
{
HKEY hkey;
if (RegOpenKey(HKEY_CLASSES_ROOT, "\\\\Applications\\\\VMwareHostOpen.exe", &hkey) == ERROR_SUCCESS)
{
return TRUE;
}
else
{
return FALSE;
}
}
BOOL CheckVirtualBox()
{
HKEY hkey;
if (RegOpenKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\\\Oracle\\\\VirtualBox Guest Additions", &hkey) == ERROR_SUCCESS)
{
return TRUE;
}
else
{
return FALSE;
}
}
6.根據特定服務名
通過獲取主機當前具有VMware特性的服務信息,判斷當前主機是否為虛擬機。在VMware中通常會存在VMware物理磁盤助手服務和VMware Tools服務等;在VirtualBox中通常會存在VirtualBox Guest Additions Service服務等。
BOOL CheckVMWare()
{
int menu = 0;
//打開系統服務控制器
SC_HANDLE SCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
if(SCMan == NULL)
{
cout << GetLastError() << endl;
printf("OpenSCManager Eorror/n");
return -1;
}
//保存系統服務的結構
LPENUM_SERVICE_STATUSA service_status;
DWORD cbBytesNeeded = NULL;
DWORD ServicesReturned = NULL;
DWORD ResumeHandle = NULL;
service_status = (LPENUM_SERVICE_STATUSA)LocalAlloc(LPTR, 1024 * 64);
//獲取系統服務的簡單信息
bool ESS = EnumServicesStatusA(SCMan, //系統服務句柄
SERVICE_WIN32, //服務的類型
SERVICE_STATE_ALL, //服務的狀態
(LPENUM_SERVICE_STATUSA)service_status, //輸出參數,系統服務的結構
1024 * 64, //結構的大小
&cbBytesNeeded, //輸出參數,接收返回所需的服務
&ServicesReturned, //輸出參數,接收返回服務的數量
&ResumeHandle); //輸入輸出參數,第一次調用必須為0,返回為0代表成功
if(ESS == NULL)
{
printf("EnumServicesStatus Eorror/n");
return -1;
}
for(int i = 0; i < ServicesReturned; i++)
{
if (strstr(service_status[i].lpDisplayName, "VMware Tools")!=NULL || strstr(service_status[i].lpDisplayName, "VMware 物理磁盤助手服務")!=NULL)
{
return TRUE;
}
}
//關閉服務管理器的句柄
CloseServiceHandle(SCMan);
return FALSE;
}
BOOL CheckVirtualPC()
{
int menu = 0;
//打開系統服務控制器
SC_HANDLE SCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
if(SCMan == NULL)
{
cout << GetLastError() << endl;
printf("OpenSCManager Eorror/n");
return -1;
}
//保存系統服務的結構
LPENUM_SERVICE_STATUSA service_status;
DWORD cbBytesNeeded = NULL;
DWORD ServicesReturned = NULL;
DWORD ResumeHandle = NULL;
service_status = (LPENUM_SERVICE_STATUSA)LocalAlloc(LPTR, 1024 * 64);
//獲取系統服務的簡單信息
bool ESS = EnumServicesStatusA(SCMan, //系統服務句柄
SERVICE_WIN32, //服務的類型
SERVICE_STATE_ALL, //服務的狀態
(LPENUM_SERVICE_STATUSA)service_status, //輸出參數,系統服務的結構
1024 * 64, //結構的大小
&cbBytesNeeded, //輸出參數,接收返回所需的服務
&ServicesReturned, //輸出參數,接收返回服務的數量
&ResumeHandle); //輸入輸出參數,第一次調用必須為0,返回為0代表成功
if(ESS == NULL)
{
printf("EnumServicesStatus Eorror/n");
return -1;
}
for(int i = 0; i < ServicesReturned; i++)
{
if (strstr(service_status[i].lpDisplayName, "Virtual Machine")!=NULL)
{
return TRUE;
}
}
//關閉服務管理器的句柄
CloseServiceHandle(SCMan);
return FALSE;
}
BOOL CheckVirtualBox()
{
int menu = 0;
//打開系統服務控制器
SC_HANDLE SCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
if(SCMan == NULL)
{
cout << GetLastError() << endl;
printf("OpenSCManager Eorror/n");
return -1;
}
//保存系統服務的結構
LPENUM_SERVICE_STATUSA service_status;
DWORD cbBytesNeeded = NULL;
DWORD ServicesReturned = NULL;
DWORD ResumeHandle = NULL;
service_status = (LPENUM_SERVICE_STATUSA)LocalAlloc(LPTR, 1024 * 64);
//獲取系統服務的簡單信息
bool ESS = EnumServicesStatusA(SCMan, //系統服務句柄
SERVICE_WIN32, //服務的類型
SERVICE_STATE_ALL, //服務的狀態
(LPENUM_SERVICE_STATUSA)service_status, //輸出參數,系統服務的結構
1024 * 64, //結構的大小
&cbBytesNeeded, //輸出參數,接收返回所需的服務
&ServicesReturned, //輸出參數,接收返回服務的數量
&ResumeHandle); //輸入輸出參數,第一次調用必須為0,返回為0代表成功
if(ESS == NULL)
{
printf("EnumServicesStatus Eorror/n");
return -1;
}
for(int i = 0; i < ServicesReturned; i++)
{
if (strstr(service_status[i].lpDisplayName, "VirtualBox Guest")!=NULL)
{
return TRUE;
}
}
//關閉服務管理器的句柄
CloseServiceHandle(SCMan);
return FALSE;
}
7.根據時間差
由于在虛擬機中,代碼的運行速度通常不如真實主機。所以惡意代碼通過運行一段特定的代碼來比較這段代碼在虛擬機和真實主機之中的相對運行時間,以此來判斷是否處于虛擬機之中。
BOOL CheckVMWare()
{
__asm
{
rdtsc
xchg ebx,eax
rdtsc
sub eax,ebx
cmp eax,0xFF
jg detected
}
return FALSE;
detected:
return TRUE;
}
BOOL CheckVirtualPC()
{
__asm
{
rdtsc
xchg ebx,eax
rdtsc
sub eax,ebx
cmp eax,0xFF
jg detected
}
return FALSE;
detected:
return TRUE;
}
BOOL CheckVirtualBox()
{
__asm
{
rdtsc
xchg ebx,eax
rdtsc
sub eax,ebx
cmp eax,0xFF
jg detected
}
return FALSE;
detected:
return TRUE;
}
-
Mac
+關注
關注
0文章
1117瀏覽量
52659 -
惡意代碼
+關注
關注
0文章
12瀏覽量
7724 -
虛擬機
+關注
關注
1文章
962瀏覽量
29068
發布評論請先 登錄
什么是虛擬機?虛擬機真的那么好用嗎?

KVM虛擬機管理和基本使用
linux虛擬機使用教程
Docker與虛擬機的區別
怎么安裝linux虛擬機
虛擬機ubuntu怎么聯網
虛擬機數據恢復—KVM虛擬機被誤刪除的數據恢復案例

評論