亚洲日本免费-啊轻点灬太粗太长了三男一女-麻豆av电影在线观看-日韩一级片毛片|www.grbbt.com

如何利用Pafish偵測虛擬環(huán)境

本文介紹Pafish。Pafish是一個(gè)用來偵 測虛擬環(huán)境的開源工具,除了虛擬環(huán)境以外,Pafish還能偵測主流的沙箱和debug環(huán)境。由于Pafish是開源的,病毒作者們可以很容易的重用其代 碼。Pafish的github主頁在https://github.com/a0rtega/pafish。 目前是V05.3版。

運(yùn)行Pafish以后,Pafish會對各項(xiàng)特征進(jìn)行檢查,如果沒有發(fā)現(xiàn)匹配特征,就顯示一個(gè)綠色的OK, 如果發(fā)現(xiàn)了,就顯示一個(gè)紅色的traced! 如圖所示,Pafish檢測到當(dāng)前運(yùn)行環(huán)境匹配virtualbox的各項(xiàng)特征。

virtualbox

看一下pafish的github目錄,包含以下文件

github

基本上,Pafish用一個(gè)c文件來對應(yīng)一個(gè)偵測模塊。Pafish包含如下模塊:

·基于cpu的偵測: cpu.c

·偵測 調(diào)試環(huán)境: debuggers.c

·基本偵測: gensandbox.c

·偵測主流商業(yè)虛擬環(huán)境:比如vitualbox,VMware等

3 模塊介紹

3.1 基于cpu的偵測

由于架構(gòu)差異,同樣的代碼在虛擬機(jī)的運(yùn)行速度往往慢于實(shí)體機(jī)。Pafish用RDTSC指令來計(jì)算執(zhí)行一段代碼所花費(fèi)的平均CPU運(yùn)行周期數(shù)。RDTSC 指令可以以極小的代價(jià)獲得高精度的 CPU 時(shí)鐘周期數(shù)(Time Stamp Counter)。用法是,先后執(zhí)行兩次RDTSC,記下兩個(gè) 64-bit 整數(shù) ret 和 ret2,那么 ret2-ret1 代表了這期間 所花費(fèi)的CPU 時(shí)鐘周期數(shù)。

static?inline?unsigned?long?long?rdtsc_diff()?{
?????????????????????????????unsigned?long?long?ret,?ret2;
?????????????????????????????unsigned?eax,?edx;
?????????????????????????????__asm__?volatile("rdtsc"?:?"=a"?(eax),?"=d"?(edx));
?????????????????????????????ret??=?((unsigned?long?long)eax)?|?(((unsigned?long?long)edx)?<<?32);
?????????????????????????????__asm__?volatile("rdtsc"?:?"=a"?(eax),?"=d"?(edx));
?????????????????????????????ret2??=?((unsigned?long?long)eax)?|?(((unsigned?long?long)edx)?<<?32);
?????????????????????????????return?ret2?-?ret;
}

然后這個(gè)取差值的過程重復(fù)10次,得到平均值。如果這個(gè)平均周期差小于750的話,就認(rèn)為是實(shí)體機(jī)環(huán)境,否則則認(rèn)為是虛擬機(jī)環(huán)境。筆者估計(jì)Pafish選擇750作為平均周期差的是根據(jù)實(shí)踐經(jīng)驗(yàn)。

int?cpu_rdtsc()?{
?????????????????????????????int?i;
?????????????????????????????unsigned?long?long?avg?=?0;
?????????????????????????????for?(i?=?0;?i?<?10;?i++)?{
??????????????????????????????????????????????????????????avg?=?avg?+?rdtsc_diff();
??????????????????????????????????????????????????????????Sleep(500);
?????????????????????????????}
?????????????????????????????avg?=?avg?/?10;
?????????????????????????????return?(avg?<?750?&&?avg?>?0)???FALSE?:?TRUE;
}

另一種方法是用cpuid指令得到cpu的名稱和型號。如果名稱中包含一些特殊的字符串,比如KVM, VMware等,則確定在虛擬環(huán)境中。

static?inline?void?cpuid_vendor_00(char?*?vendor)?{
?????????????????????????????int?ebx,?ecx,?edx;
?
?????????????????????????????__asm__?volatile("cpuid"?\
???????????????????????????????????????????????????????????????????????????????????????:?"=b"(ebx),?\
?????????????????????????????????????????????????????????????????????????????????????????"=c"(ecx),?\
?????????????????????????????????????????????????????????????????????????????????????????"=d"(edx)?\
???????????????????????????????????????????????????????????????????????????????????????:?"a"(0x00));
?????????????????????????????sprintf(vendor??,?"%c%c%c%c",?ebx,?(ebx?>>?8),?(ebx?>>?16),?(ebx?>>?24));
?????????????????????????????sprintf(vendor+4,?"%c%c%c%c",?edx,?(edx?>>?8),?(edx?>>?16),?(edx?>>?24));
?????????????????????????????sprintf(vendor+8,?"%c%c%c%c",?ecx,?(ecx?>>?8),?(ecx?>>?16),?(ecx?>>?24));
?????????????????????????????vendor[12]?=?0x00;
}
?
int?cpu_known_vm_vendors(char?*?vendor)?{
?????????????????????????????const?int?count?=?4;
?????????????????????????????int?i;
?????????????????????????????string?strs[count];
?????????????????????????????strs[0]?=?"KVMKVMKVMKVM";
?????????????????????????????strs[1]?=?"Microsoft?Hv";
?????????????????????????????strs[2]?=?"VMwareVMware";
?????????????????????????????strs[3]?=?"XenVMMXenVMM";
?????????????????????????????for?(i?=?0;?i?<?count;?i++)?{
??????????????????????????????????????????????????????????if?(!memcmp(vendor,?strs[i],?12))?return?TRUE;
?????????????????????????????}
?????????????????????????????return?FALSE;
}

3.2 偵測 調(diào)試環(huán)境:

第一種方法很簡單,只需要看一下IsDebuggerPresent的返回值。IsDebuggerPresent是一個(gè)kernel32.dll中的函數(shù),通過它可以檢測當(dāng)前進(jìn)程是否正在被調(diào)試(用戶模式)。

int?debug_isdebuggerpresent()?{
?????????????????????????????if?(IsDebuggerPresent())
?????????????????????????????return?TRUE;
?????????????????????????????else
?????????????????????????????return?FALSE;
}

第二種方法用到OutputDebugString。OutputDebugString用來把調(diào)試信息輸出到調(diào)試器的輸出窗口。但 是OutputDebugString只能在調(diào)試環(huán)境下執(zhí)行。而在非調(diào)試環(huán)境下,OutputDebugString會產(chǎn)生一個(gè)錯(cuò)誤。Pafish先設(shè)置 一個(gè)錯(cuò)誤代碼(99)作為基準(zhǔn)值,然后調(diào)用OutputDebugString,再取出錯(cuò)誤代碼與99比較。如果運(yùn)行在一個(gè)調(diào)試環(huán)境中,那么應(yīng)該沒有新錯(cuò) 誤產(chǎn)生,所以取出的錯(cuò)誤代碼還是99。

int?debug_outputdebugstring()?{
?????????????????????????????DWORD?err?=?99;?/*?Random?error?*/
?????????????????????????????SetLastError(err);
?????????????????????????????/*?If?we're?been?debugging,?this?shouldn't
?????????????????????????????drop?an?error.?*/
?????????????????????????????OutputDebugString("useless");
?????????????????????????????if?(GetLastError()?==?err){
??????????????????????????????????????????????????????????return?TRUE;
?????????????????????????????}
?????????????????????????????else?{
??????????????????????????????????????????????????????????return?FALSE;
?????????????????????????????}
}

3.3 基本偵測:

由于硬件的限制,很多人在創(chuàng)建虛擬機(jī)的時(shí)候往往只選擇夠用的配置,而不是高配置。(至少配置不會高于實(shí)體機(jī))基本偵測是基于鼠標(biāo)的移動,CPU的數(shù) 量,硬盤和內(nèi)存的大小等等。比如用戶在一段時(shí)間內(nèi)沒有移動鼠標(biāo),系統(tǒng)只有一個(gè)CPU,硬盤小于60G,內(nèi)存小于1G,這些都可能說明是一個(gè)虛擬環(huán)境。這種 偵測方法不會非常準(zhǔn)確,比如一個(gè)服務(wù)器可能沒有配備鼠標(biāo),或者一個(gè)配置很差的舊電腦都會被誤認(rèn)為是虛擬環(huán)境。但是從統(tǒng)計(jì)上看來,還是有一定意義的。

int?gensandbox_one_cpu_GetSystemInfo()?{
?????????????????????????????SYSTEM_INFO?siSysInfo;
?????????????????????????????GetSystemInfo(&siSysInfo);
?????????????????????????????return?siSysInfo.dwNumberOfProcessors?<?2???TRUE?:?FALSE;
}

第二種方法是如果當(dāng)前系統(tǒng)的用戶名包含sandbox,virus,malware等關(guān)鍵字,則認(rèn)為是在虛擬機(jī)中,當(dāng)然這個(gè)檢測方法可以很容易的繞過。

int?gensandbox_username()?{
?????????????????????????????char?username[200];
?????????????????????????????size_t?i;
?????????????????????????????DWORD?usersize?=?sizeof(username);
?????????????????????????????GetUserName(username,?&usersize);
?????????????????????????????for?(i?=?0;?i?<?strlen(username);?i++)?{?/*?case-insensitive?*/
??????????????????????????????????????????????????????????username[i]?=?toupper(username[i]);
?????????????????????????????}
?????????????????????????????if?(strstr(username,?"SANDBOX")?!=?NULL)?{
??????????????????????????????????????????????????????????return?TRUE;
?????????????????????????????}
?????????????????????????????if?(strstr(username,?"VIRUS")?!=?NULL)?{
??????????????????????????????????????????????????????????return?TRUE;
?????????????????????????????}
?????????????????????????????if?(strstr(username,?"MALWARE")?!=?NULL)?{
??????????????????????????????????????????????????????????return?TRUE;
?????????????????????????????}
?????????????????????????????return?FALSE;
}

3.4 偵測商業(yè)虛擬環(huán)境

除了基本的虛擬環(huán)境以外,Pafish還可以根據(jù)指紋偵測幾種主流的虛擬機(jī),包括sandboxie,Qemu,Virtualbox, Vmware and wine.偵測方法大同小異,這里只介紹針對virtualbox的偵測方法。

在原有的基礎(chǔ)上,Virtualbox提供了一些增強(qiáng)功能,比如virtualbox guest Additions 和共享文件夾。virtualbox guest Additions可以自動調(diào)節(jié)窗口的分辨率,把實(shí)體機(jī)的字符串復(fù)制到虛擬機(jī)里面。而 共享文件夾解決了虛擬機(jī)和實(shí)體機(jī)共享文件的問題。這些增強(qiáng)功能極大的提高了virtualbox的易用性。然而,福兮禍所伏。若想使用 virtualbox guest Additions,用戶需要在虛擬機(jī)上安裝一些特殊的驅(qū)動和應(yīng)用程序。而這些驅(qū)動和應(yīng)用基本不可能出現(xiàn)在實(shí)體機(jī)上。所以Pafish可以查找這些驅(qū)動和 應(yīng)用來判斷當(dāng)前運(yùn)行環(huán)境是否是virtualbox。

查找注冊表,看看有沒有VirtualBox Guest Additions的字符串。

int?vbox_reg_key3()?{
?????????????????????????????return?pafish_exists_regkey(HKEY_LOCAL_MACHINE,?"SOFTWARE\\Oracle\\VirtualBox?Guest?Additions");
}

查找有沒有VirtualBox Guest Additions的相關(guān)進(jìn)程 (vboxservice.exe 和vboxtray.exe)

查找右下角有沒有關(guān)于VboxTrayTool的任務(wù)欄托盤窗口.

int?vbox_traywindow()?{
?????????????????????????????HWND?h1,?h2;
?????????????????????????????h1?=?FindWindow("VBoxTrayToolWndClass",?NULL);
?????????????????????????????h2?=?FindWindow(NULL,?"VBoxTrayToolWnd");
?????????????????????????????if?(h1?||?h2)?return?TRUE;
?????????????????????????????else?return?FALSE;
}

查找是否存在以下文件

"C:\\WINDOWS\\system32\\vboxdisp.dll";
"C:\\WINDOWS\\system32\\vboxhook.dll";
"C:\\WINDOWS\\system32\\vboxmrxnp.dll";
"C:\\WINDOWS\\system32\\vboxogl.dll";
"C:\\WINDOWS\\system32\\vboxoglarrayspu.dll";
"C:\\WINDOWS\\system32\\vboxoglcrutil.dll";
"C:\\WINDOWS\\system32\\vboxoglerrorspu.dll";
"C:\\WINDOWS\\system32\\vboxoglfeedbackspu.dll";
"C:\\WINDOWS\\system32\\vboxoglpackspu.dll";
"C:\\WINDOWS\\system32\\vboxoglpassthroughspu.dll";
"C:\\WINDOWS\\system32\\vboxservice.exe";
"C:\\WINDOWS\\system32\\vboxtray.exe";
"C:\\WINDOWS\\system32\\VBoxControl.exe";
"C:\\program?files\\oracle\\virtualbox?guest?additions\\";
"C:\\WINDOWS\\system32\\drivers\\VBoxMouse.sys";
"C:\\WINDOWS\\system32\\drivers\\VBoxGuest.sys";
"C:\\WINDOWS\\system32\\drivers\\VBoxSF.sys";
"C:\\WINDOWS\\system32\\drivers\\VBoxVideo.sys";

用WNetGetProviderName檢查共享文件夾的網(wǎng)絡(luò)類型名稱,如果是”VirtualBox Shared Folders”,則檢查到virtualbox的共享文件夾

int?vbox_network_share()?{
?????????????????????????????unsigned?long?pnsize?=?0x1000;
?????????????????????????????char?provider[pnsize];
?????????????????????????????int?retv?=?WNetGetProviderName(WNNC_NET_RDR2SAMPLE,?provider,?&pnsize);
?????????????????????????????if?(retv?==?NO_ERROR)?{
??????????????????????????????????????????????????????????if?(lstrcmpi(provider,?"VirtualBox?Shared?Folders")?==?0)?{
???????????????????????????????????????????????????????????????????????????????????????return?TRUE;
??????????????????????????????????????????????????????????}
??????????????????????????????????????????????????????????else?{
???????????????????????????????????????????????????????????????????????????????????????return?FALSE;
??????????????????????????????????????????????????????????}
?????????????????????????????}
?????????????????????????????return?FALSE;
}

以上,我們可以看到如果在虛擬機(jī)上安裝了virtualbox guest Additions 和共享文件夾,該虛擬機(jī)的其他進(jìn)程可以很容易的發(fā)現(xiàn)其相關(guān)的窗口,文件,驅(qū)動,服務(wù)信息。這就相當(dāng)于李鬼在臉上寫著“我不是李逵,我是李鬼”。那么,是不 是不安裝virtualbox guest Additions 和共享文件夾就安全了吶?答案是未必。一些默認(rèn)的硬件信息仍然可以被作為指紋用于檢測virtualbox的存在。比如virtualbox默認(rèn)的網(wǎng)卡 MAC地址前綴為08:00:27,這前3字節(jié)是virtualbox分配的唯一標(biāo)識符OUI,以供其虛擬網(wǎng)卡使用。

int?vbox_mac()?{
?????????????????????????????/*?VirtualBox?mac?starts?with?08:00:27?*/
?????????????????????????????return?pafish_check_mac_vendor("\x08\x00\x27");
}

另外,還可以讀取注冊表信息,通過檢測特定的硬件信息,比如SCSI, systembiosversion, videobiosversion, ACPI,如果這些信息 包含VBOX關(guān)鍵字,那么可以斷定是virtualbox虛擬環(huán)境。

int?vbox_reg_key1()?{
?????????????????????????????return?pafish_exists_regkey_value_str(HKEY_LOCAL_MACHINE,?"HARDWARE\\DEVICEMAP\\Scsi\\Scsi?Port?0\\Scsi?Bus?0\\Target?Id?0\\Logical?Unit?Id?0",?"Identifier",?"VBOX");
}

還可以檢測其系統(tǒng)bios生成日期,如果是1999年6月23號,那么很可能是virtualbox

int?vbox_reg_key10()?{
?????????????????????????????return?pafish_exists_regkey_value_str(HKEY_LOCAL_MACHINE,?"HARDWARE\\DESCRIPTION\\System",?"SystemBiosDate",?"06/23/99");
}

4. 總結(jié)

綜上,Pafish給出了一些很實(shí)用的檢測虛擬機(jī) 的方法。虛擬的畢竟就是虛擬的,總歸會留下蛛絲螞跡。不過很多人認(rèn)為我們也可以利用虛擬機(jī)檢測來免疫病毒,比如在實(shí)體機(jī)上設(shè)置一些虛假信息讓病毒誤認(rèn)為這 個(gè)實(shí)體機(jī)是一個(gè)虛擬機(jī),從而跳過“做壞事”的階段。對于這個(gè)觀點(diǎn),有人認(rèn)為靠譜,有人認(rèn)為不靠譜,大家怎么看?

上一篇:Kali Linux NetHunter :Nexus設(shè)備上的滲透測試平臺

下一篇:如何攻擊光纖網(wǎng)絡(luò)并竊取敏感數(shù)據(jù)