4.根據(jù)特定的文件夾或文件信息
通過查找磁盤中是否存在特定的文件夾或文件,判斷當(dāng)前是否在虛擬機(jī)中。VMware虛擬機(jī)中通常會(huì)有路徑C:\\Program Files\\VMware\\VMware Tools\\;VirtualBox 虛擬機(jī)中通常會(huì)有路徑 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.根據(jù)特定注冊(cè)表信息
通過讀取主機(jī)具有虛擬機(jī)特性的注冊(cè)表位置來判斷是否處于虛擬機(jī)環(huán)境中。針對(duì)VMware可以判斷注冊(cè)表項(xiàng)HKEY_CLASSES_ROOT\\Applications\\VMwareHostOpen.exe;針對(duì)VirtualBox可以判斷注冊(cè)表項(xiàng)HKEY_LOCAL_MACHINE\\SOFTWARE\\Oracle\\VirtualBox Guest Additions。當(dāng)然,注冊(cè)表中能被檢測(cè)出的位置很多,這里只是舉個(gè)例子。
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.根據(jù)特定服務(wù)名
通過獲取主機(jī)當(dāng)前具有VMware特性的服務(wù)信息,判斷當(dāng)前主機(jī)是否為虛擬機(jī)。在VMware中通常會(huì)存在VMware物理磁盤助手服務(wù)和VMware Tools服務(wù)等;在VirtualBox中通常會(huì)存在VirtualBox Guest Additions Service服務(wù)等。
BOOL CheckVMWare()
{
int menu = 0;
//打開系統(tǒng)服務(wù)控制器
SC_HANDLE SCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
if(SCMan == NULL)
{
cout << GetLastError() << endl;
printf("OpenSCManager Eorror/n");
return -1;
}
//保存系統(tǒng)服務(wù)的結(jié)構(gòu)
LPENUM_SERVICE_STATUSA service_status;
DWORD cbBytesNeeded = NULL;
DWORD ServicesReturned = NULL;
DWORD ResumeHandle = NULL;
service_status = (LPENUM_SERVICE_STATUSA)LocalAlloc(LPTR, 1024 * 64);
//獲取系統(tǒng)服務(wù)的簡(jiǎn)單信息
bool ESS = EnumServicesStatusA(SCMan, //系統(tǒng)服務(wù)句柄
SERVICE_WIN32, //服務(wù)的類型
SERVICE_STATE_ALL, //服務(wù)的狀態(tài)
(LPENUM_SERVICE_STATUSA)service_status, //輸出參數(shù),系統(tǒng)服務(wù)的結(jié)構(gòu)
1024 * 64, //結(jié)構(gòu)的大小
&cbBytesNeeded, //輸出參數(shù),接收返回所需的服務(wù)
&ServicesReturned, //輸出參數(shù),接收返回服務(wù)的數(shù)量
&ResumeHandle); //輸入輸出參數(shù),第一次調(diào)用必須為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 物理磁盤助手服務(wù)")!=NULL)
{
return TRUE;
}
}
//關(guān)閉服務(wù)管理器的句柄
CloseServiceHandle(SCMan);
return FALSE;
}
BOOL CheckVirtualPC()
{
int menu = 0;
//打開系統(tǒng)服務(wù)控制器
SC_HANDLE SCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
if(SCMan == NULL)
{
cout << GetLastError() << endl;
printf("OpenSCManager Eorror/n");
return -1;
}
//保存系統(tǒng)服務(wù)的結(jié)構(gòu)
LPENUM_SERVICE_STATUSA service_status;
DWORD cbBytesNeeded = NULL;
DWORD ServicesReturned = NULL;
DWORD ResumeHandle = NULL;
service_status = (LPENUM_SERVICE_STATUSA)LocalAlloc(LPTR, 1024 * 64);
//獲取系統(tǒng)服務(wù)的簡(jiǎn)單信息
bool ESS = EnumServicesStatusA(SCMan, //系統(tǒng)服務(wù)句柄
SERVICE_WIN32, //服務(wù)的類型
SERVICE_STATE_ALL, //服務(wù)的狀態(tài)
(LPENUM_SERVICE_STATUSA)service_status, //輸出參數(shù),系統(tǒng)服務(wù)的結(jié)構(gòu)
1024 * 64, //結(jié)構(gòu)的大小
&cbBytesNeeded, //輸出參數(shù),接收返回所需的服務(wù)
&ServicesReturned, //輸出參數(shù),接收返回服務(wù)的數(shù)量
&ResumeHandle); //輸入輸出參數(shù),第一次調(diào)用必須為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;
}
}
//關(guān)閉服務(wù)管理器的句柄
CloseServiceHandle(SCMan);
return FALSE;
}
BOOL CheckVirtualBox()
{
int menu = 0;
//打開系統(tǒng)服務(wù)控制器
SC_HANDLE SCMan = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE);
if(SCMan == NULL)
{
cout << GetLastError() << endl;
printf("OpenSCManager Eorror/n");
return -1;
}
//保存系統(tǒng)服務(wù)的結(jié)構(gòu)
LPENUM_SERVICE_STATUSA service_status;
DWORD cbBytesNeeded = NULL;
DWORD ServicesReturned = NULL;
DWORD ResumeHandle = NULL;
service_status = (LPENUM_SERVICE_STATUSA)LocalAlloc(LPTR, 1024 * 64);
//獲取系統(tǒng)服務(wù)的簡(jiǎn)單信息
bool ESS = EnumServicesStatusA(SCMan, //系統(tǒng)服務(wù)句柄
SERVICE_WIN32, //服務(wù)的類型
SERVICE_STATE_ALL, //服務(wù)的狀態(tài)
(LPENUM_SERVICE_STATUSA)service_status, //輸出參數(shù),系統(tǒng)服務(wù)的結(jié)構(gòu)
1024 * 64, //結(jié)構(gòu)的大小
&cbBytesNeeded, //輸出參數(shù),接收返回所需的服務(wù)
&ServicesReturned, //輸出參數(shù),接收返回服務(wù)的數(shù)量
&ResumeHandle); //輸入輸出參數(shù),第一次調(diào)用必須為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;
}
}
//關(guān)閉服務(wù)管理器的句柄
CloseServiceHandle(SCMan);
return FALSE;
}
7.根據(jù)時(shí)間差
由于在虛擬機(jī)中,代碼的運(yùn)行速度通常不如真實(shí)主機(jī)。所以惡意代碼通過運(yùn)行一段特定的代碼來比較這段代碼在虛擬機(jī)和真實(shí)主機(jī)之中的相對(duì)運(yùn)行時(shí)間,以此來判斷是否處于虛擬機(jī)之中。
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
+關(guān)注
關(guān)注
0文章
1106瀏覽量
51480 -
惡意代碼
+關(guān)注
關(guān)注
0文章
12瀏覽量
7636 -
虛擬機(jī)
+關(guān)注
關(guān)注
1文章
917瀏覽量
28209
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論