0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

反虛擬機技術合集1

jf_78858299 ? 來源:看雪學苑 ? 作者:houjingyi ? 2023-02-14 13:45 ? 次閱讀

惡意代碼編寫者經(jīng)常使用反虛擬機技術逃避分析,這種技術可以檢測自己是否運行在虛擬機中。如果惡意代碼探測到自己在虛擬機中運行,它會執(zhí)行與其本身行為不同的行為,其中最簡單的行為是停止自身運行。

近年來,隨著虛擬化技術的使用不斷增加,采用反虛擬機技術的惡意代碼數(shù)量逐漸下降。惡意代碼編寫者已經(jīng)開始意識到,目標主機是虛擬機,也并不意味著它就沒有攻擊價值。

隨著虛擬化技術的不斷發(fā)展和普通應用,反虛擬機技術可能變得更加少見。這里研究最常見的反虛擬機技術(包括VMware、virtualbox和virtualpc,重點是最常用的VMware),并且介紹一些如何防御它們的辦法。

一、檢測虛擬機痕跡

1.根據(jù)MAC地址

通常,MAC地址的前三個字節(jié)標識一個提供商。以00:05:69、00:0c:29和00:50:56開始的MAC地址與VMware相對應;以00:03:ff開始的MAC地址與virtualpc對應;以08:00:27開始的MAC地址與virtualbox對應。

BOOL CheckVMWare()  
{  
   string mac;  
   get_3part_mac(mac);  
   if (mac=="00-05-69" || mac=="00-0c-29" || mac=="00-50-56")  
   {  
       return TRUE;  
   }  
   else  
   {  
       return FALSE;  
   }  
}
BOOL CheckVirtualPC()  
{  
   string mac;  
   get_3part_mac(mac);  
   if (mac=="00-03-ff")  
   {  
       return TRUE;  
   }  
   else  
   {  
       return FALSE;  
   }  
}
BOOL CheckVirtualBox()  
{  
   string mac;  
   get_3part_mac(mac);  
   if (mac=="08-00-27")  
   {  
       return TRUE;  
   }  
   else  
   {  
       return FALSE;  
   }  
}
typedef struct _ASTAT_  
{  
   ADAPTER_STATUS adapt;  
   NAME_BUFFER NameBuff[30];  
} ASTAT, *PASTAT;
void get_3part_mac(string &mac)  
{  
   NCB Ncb;  
   ASTAT Adapter;  
   UCHAR uRetCode;  
   LANA_ENUM lenum;  
   memset(&Ncb, 0, sizeof(Ncb));  
   Ncb.ncb_command = NCBENUM;  
   Ncb.ncb_buffer = (UCHAR *)&lenum;  
   Ncb.ncb_length = sizeof(lenum);  
   uRetCode = Netbios(&Ncb);  
   for (int i = 0; i < lenum.length; i++)  
   {  
       memset(&Ncb, 0, sizeof(Ncb));  
       Ncb.ncb_command = NCBRESET;  
       Ncb.ncb_lana_num = lenum.lana[i];  
       uRetCode = Netbios(&Ncb);  
       memset(&Ncb, 0, sizeof(Ncb));  
       Ncb.ncb_command = NCBASTAT;  
       Ncb.ncb_lana_num = lenum.lana[i];  
       strcpy((char *)Ncb.ncb_callname, "*");  
       Ncb.ncb_buffer = (unsigned char *)&Adapter;  
       Ncb.ncb_length = sizeof(Adapter);  
       uRetCode = Netbios(&Ncb);  
       if (uRetCode == 0)  
       {  
           char tmp[128];  
           sprintf(tmp, "%02x-%02x-%02x",  
               Adapter.adapt.adapter_address[0],  
               Adapter.adapt.adapter_address[1],  
               Adapter.adapt.adapter_address[2]  
           );  
           mac = tmp;  
       }  
   }  
}

2.基于主板序列號、主機型號、系統(tǒng)盤所在磁盤名稱等其他硬件信息

//通過WMI獲取主機信息  
BOOL ManageWMIInfo(string &result, string table, wstring wcol)  
{    
   HRESULT hres;  
   char bord[1024];  
   //初始化COM  
   hres = CoInitialize(0);  
   //獲得WMI連接COM接口    
   IWbemLocator *pLoc = NULL;  
   hres = CoCreateInstance(  
       CLSID_WbemLocator,  
       0,  
       CLSCTX_INPROC_SERVER,  
       IID_IWbemLocator, (LPVOID *) &pLoc);  
   if (FAILED(hres))  
   {  
       cout << "Failed to create IWbemLocator object."  
           << "Err code = 0x"  
           << hex << hres << endl;  
       CoUninitialize();  
       return false;  
   }  
   //通過連接接口連接WMI的內核對象名ROOT//CIMV2    
   IWbemServices *pSvc = NULL;  
   hres = pLoc->ConnectServer(  
       _bstr_t(L"ROOT\\\\CIMV2"), // Object path of WMI namespace  
       NULL, // User name. NULL = current user  
       NULL, // User password. NULL = current  
       0, // Locale. NULL indicates current  
       NULL, // Security flags.  
       0, // Authority (e.g. Kerberos)  
       0, // Context object  
       &pSvc // pointer to IWbemServices proxy  
       );  
   if (FAILED(hres))  
   {  
       cout << "Could not connect. Error code = 0x"  
           << hex << hres << endl;  
       pLoc->Release();  
       CoUninitialize();  
       return false;  
   }  
   //設置請求代理的安全級別    
   hres = CoSetProxyBlanket(  
       pSvc, // Indicates the proxy to set  
       RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx  
       RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx  
       NULL, // Server principal name  
       RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx  
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx  
       NULL, // client identity  
       EOAC_NONE // proxy capabilities  
       );  
   if (FAILED(hres))  
   {  
       cout << "Could not set proxy blanket. Error code = 0x"  
           << hex << hres << endl;  
       pSvc->Release();  
       pLoc->Release();  
       CoUninitialize();  
       return false;  
   }  
   //通過請求代理來向WMI發(fā)送請求  
   IEnumWbemClassObject* pEnumerator = NULL;  
   string select = "SELECT * FROM "+ table;  
   hres = pSvc->ExecQuery(  
       bstr_t("WQL"),    
       bstr_t(select.c_str()),  
       WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,  
       NULL,  
       &pEnumerator);  
   if (FAILED(hres))  
   {  
       cout << "Query for Network Adapter Configuration failed."  
           << " Error code = 0x”"  
           << hex << hres << endl;  
       pSvc->Release();  
       pLoc->Release();  
       CoUninitialize();  
       return false;  
   }  
   //循環(huán)枚舉所有的結果對象  
   ULONG uReturn = 0;  
   IWbemClassObject *pclsObj;  
   while (pEnumerator)  
   {  
       HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,  
           &pclsObj, &uReturn);  
       if(0 == uReturn)  
       {  
           break;  
       }  
       VARIANT vtProp;  
       VariantInit(&vtProp);  
       hr = pclsObj->Get(wcol.c_str(), 0, &vtProp, 0, 0);  
       if(!FAILED(hr))  
       {  
           CW2A tmpstr1(vtProp.bstrVal);  
           strcpy_s(bord,200,tmpstr1);  
           result = bord;  
       }  
       VariantClear(&vtProp);  
   }  
   //釋放資源    
   pSvc->Release();  
   pLoc->Release();  
   pEnumerator->Release();  
   pclsObj->Release();  
   CoUninitialize();  
   return true;  
}
BOOL CheckVMWare()  
{  
   string table = "Win32_BaseBoard";  
   wstring wcol = L"SerialNumber";  
   string ret;  
   ManageWMIInfo(ret, table, wcol);  
   if (ret == "None")  
   {  
       return TRUE;  
   }  
   else  
   {  
       return FALSE;  
   }  
}
BOOL CheckVMWare()  
{  
   string table = "Win32_DiskDrive";  
   wstring wcol = L"Caption";  
   string ret;  
   ManageWMIInfo(ret, table, wcol);  
   if (ret.find("VMware") != string::npos)  
   {  
       return TRUE;  
   }  
   else  
   {  
       return FALSE;  
   }  
}
BOOL CheckVMWare()  
{  
   string table = "Win32_computersystem";  
   wstring wcol = L"Model";  
   string ret;  
   ManageWMIInfo(ret, table, wcol);  
   if (ret.find("VMware") != string::npos)  
   {  
       return TRUE;  
   }  
   else  
   {  
       return FALSE;  
   }  
}
BOOL CheckVirtualBox()  
{    
   string table = "Win32_computersystem";  
   wstring wcol = L"Model";  
   string ret;  
   ManageWMIInfo(ret, table, wcol);  
   if (ret.find("VirtualBox") != string::npos)  
   {  
       return TRUE;  
   }  
   else  
   {  
       return FALSE;  
   }  
}
BOOL CheckVirtualBox()  
{  
   string table = "Win32_DiskDrive";  
   wstring wcol = L"Caption";  
   string ret;  
   ManageWMIInfo(ret, table, wcol);  
   if (ret.find("VBOX") != string::npos)  
   {  
       return TRUE;  
   }  
   else  
   {  
       return FALSE;  
   }  
}
BOOL CheckVirtualPC()  
{  
   string table = "Win32_DiskDrive";  
   wstring wcol = L"Caption";  
   string ret;  
   ManageWMIInfo(ret, table, wcol);  
   if (ret.find("Virtual HD") != string::npos)  
   {  
       return TRUE;  
   }  
   else  
   {  
       return FALSE;  
   }  
}
BOOL CheckVirtualPC()  
{  
   string table = "Win32_computersystem";  
   wstring wcol = L"Model";  
   string ret;  
   ManageWMIInfo(ret, table, wcol);  
   if (ret.find("Virtual Machine") != string::npos)  
   {  
       return TRUE;  
   }  
   else  
   {  
       return FALSE;  
   }  
}

3.根據(jù)當前進程信息

通過進程快照讀取當前進程信息,查找是否存在虛擬機中特有的進程,如VMware中的vmware.exe和VirtualBox中的VBoxService.exe。

BOOL CheckVMWare()  
{  
   DWORD ret = 0;  
   PROCESSENTRY32 pe32;  
   pe32.dwSize = sizeof(pe32);  
   HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  
   if(hProcessSnap == INVALID_HANDLE_VALUE)  
   {  
       return FALSE;  
   }  
   BOOL bMore = Process32First(hProcessSnap, &pe32);  
   while(bMore)  
   {  
       if (strcmp(pe32.szExeFile, "vmware.exe")==0)  
       {  
           return TRUE;  
       }  
       bMore = Process32Next(hProcessSnap, &pe32);  
   }  
   CloseHandle(hProcessSnap);  
   return FALSE;  
}
BOOL CheckVirtualBox()  
{  
   DWORD ret = 0;  
   PROCESSENTRY32 pe32;  
   pe32.dwSize = sizeof(pe32);  
   HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  
   if(hProcessSnap == INVALID_HANDLE_VALUE)  
   {  
       return FALSE;  
   }  
   BOOL bMore = Process32First(hProcessSnap, &pe32);  
   while(bMore)  
   {  
       if (strcmp(pe32.szExeFile, "VBoxService.exe")==0)  
       {  
           return TRUE;  
       }  
       bMore = Process32Next(hProcessSnap, &pe32);  
   }  
   CloseHandle(hProcessSnap);  
   return FALSE;  
}
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Mac
    Mac
    +關注

    關注

    0

    文章

    1095

    瀏覽量

    51341
  • 惡意代碼
    +關注

    關注

    0

    文章

    10

    瀏覽量

    7626
  • 虛擬機
    +關注

    關注

    1

    文章

    905

    瀏覽量

    28022
收藏 人收藏

    評論

    相關推薦

    虛擬機下載與安裝的步驟有哪些

    本文章會詳細介紹虛擬機下載與安裝的步驟,有很多讀者都會遇到這樣的情況,軟件裝不上,自己的電腦中軟件很多,又不想換電腦系統(tǒng),那么虛擬機可以幫你解決這個煩惱。?? ? 0 1 什么是虛擬機
    的頭像 發(fā)表于 09-04 10:16 ?1373次閱讀
    <b class='flag-5'>虛擬機</b>下載與安裝的步驟有哪些

    什么是虛擬機?虛擬機真的那么好用嗎?

    在日新月異的科技世界中,虛擬技術如同一座橋梁,連接著現(xiàn)實與數(shù)字的鴻溝,為我們打開了全新的計算維度。虛擬機,這一概念,自其誕生以來,就以其獨特的魅力和強大的功能,深深地影響了軟件開發(fā)、系統(tǒng)測試和云
    的頭像 發(fā)表于 07-06 08:05 ?463次閱讀
    什么是<b class='flag-5'>虛擬機</b>?<b class='flag-5'>虛擬機</b>真的那么好用嗎?

    有關虛擬機虛擬技術的幾點詮注

    虛擬機虛擬技術給計算機應用注入了新的研究與開發(fā)點,同時也存在諸多不利因素。本文綜述了虛擬機虛擬
    發(fā)表于 06-22 18:04 ?36次下載

    虛擬機虛擬技術

    虛擬機虛擬技術給計算機應用注入了新的研究與開發(fā)點,同時也存在諸多不利因素。本文綜述了虛擬機虛擬
    發(fā)表于 09-07 10:15 ?13次下載

    基于虛擬機技術的DSC仿真系統(tǒng)設計

    提出了基于虛擬機技術的DCS仿真系統(tǒng)的實現(xiàn)方式,描述了虛擬控制器的具體實現(xiàn)方法及虛擬機技術的其他應用。
    發(fā)表于 12-03 17:26 ?26次下載
    基于<b class='flag-5'>虛擬機</b><b class='flag-5'>技術</b>的DSC仿真系統(tǒng)設計

    基于虛擬機技術的DCS仿真系統(tǒng)設計與實現(xiàn)

    提出了基于虛擬機技術的DCS仿真系統(tǒng)的實現(xiàn)方式,描述了虛擬控制器的具體實現(xiàn)方法及虛擬機技術的其他應用。
    發(fā)表于 01-16 15:04 ?2121次閱讀
    基于<b class='flag-5'>虛擬機</b><b class='flag-5'>技術</b>的DCS仿真系統(tǒng)設計與實現(xiàn)

    虛擬機:QEMU虛擬機和主機無線網(wǎng)絡通訊設置

    虛擬機:QEMU虛擬機和主機無線網(wǎng)絡通訊設置
    的頭像 發(fā)表于 06-22 10:19 ?5373次閱讀
    <b class='flag-5'>虛擬機</b>:QEMU<b class='flag-5'>虛擬機</b>和主機無線網(wǎng)絡通訊設置

    KVM虛擬機管理和基本使用

    KVM — 全稱是基于內核的虛擬機(Kernel-based Virtual Machine)是一個開源軟件,基于內核的虛擬技術,實際是嵌入系統(tǒng)的一個虛擬化模塊,通過優(yōu)化內核來使用
    的頭像 發(fā)表于 02-07 09:20 ?1230次閱讀

    虛擬機技術合集2

    惡意代碼編寫者經(jīng)常使用虛擬機技術逃避分析,這種技術可以檢測自己是否運行在虛擬機中。如果惡意代碼探測到自己在
    的頭像 發(fā)表于 02-14 13:45 ?649次閱讀
    <b class='flag-5'>反</b><b class='flag-5'>虛擬機</b><b class='flag-5'>技術</b><b class='flag-5'>合集</b>2

    虛擬機技術合集3

    惡意代碼編寫者經(jīng)常使用虛擬機技術逃避分析,這種技術可以檢測自己是否運行在虛擬機中。如果惡意代碼探測到自己在
    的頭像 發(fā)表于 02-14 13:45 ?618次閱讀
    <b class='flag-5'>反</b><b class='flag-5'>虛擬機</b><b class='flag-5'>技術</b><b class='flag-5'>合集</b>3

    虛擬機技術合集4

    惡意代碼編寫者經(jīng)常使用虛擬機技術逃避分析,這種技術可以檢測自己是否運行在虛擬機中。如果惡意代碼探測到自己在
    的頭像 發(fā)表于 02-14 13:46 ?987次閱讀
    <b class='flag-5'>反</b><b class='flag-5'>虛擬機</b><b class='flag-5'>技術</b><b class='flag-5'>合集</b>4

    linux虛擬機使用教程

    引言:Linux虛擬機是一種方便且常用的技術,它允許用戶在現(xiàn)有操作系統(tǒng)的基礎上創(chuàng)建和運行另一個獨立的操作系統(tǒng)。在本篇文章中,我們將提供一份詳盡的教程,幫助你了解如何安裝、配置和使用Linux虛擬機
    的頭像 發(fā)表于 11-17 10:06 ?1200次閱讀

    Docker與虛擬機的區(qū)別

    Docker和虛擬機是兩種不同的虛擬技術,它們在實現(xiàn)方式、資源消耗、運行性能等方面存在許多差異。本文將會詳細介紹它們的區(qū)別。 一、實現(xiàn)方式 1.1 虛擬機
    的頭像 發(fā)表于 11-23 09:37 ?9091次閱讀

    虛擬機ubuntu怎么聯(lián)網(wǎng)

    虛擬機ubuntu怎么聯(lián)網(wǎng)? 虛擬機(Virtual Machine)是運行在物理(Host Machine)上的虛擬操作系統(tǒng)環(huán)境。在虛擬機
    的頭像 發(fā)表于 12-27 16:51 ?910次閱讀

    虛擬機數(shù)據(jù)恢復—KVM虛擬機被誤刪除的數(shù)據(jù)恢復案例

    虛擬機數(shù)據(jù)恢復環(huán)境: Linux操作系統(tǒng)服務器,EXT4文件系統(tǒng)。服務器中有數(shù)臺KVM虛擬機。 虛擬機1:主數(shù)據(jù)庫服務器 虛擬磁盤
    的頭像 發(fā)表于 08-07 13:33 ?348次閱讀
    <b class='flag-5'>虛擬機</b>數(shù)據(jù)恢復—KVM<b class='flag-5'>虛擬機</b>被誤刪除的數(shù)據(jù)恢復案例