精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

反虛擬機技術合集3

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

二、查找漏洞指令

虛擬機監視器監視虛擬機的運行,它運行在宿主操作系統,并為客戶機操作系統提供一個完整的虛擬平臺。與此同時,虛擬機監視器也存在一些可以被惡意代碼探測到虛擬化的安全缺陷。

在內核模式下,VMware使用二進制翻譯技術進行指令的模擬。運行于內核態的某些特權指令被解釋和模擬,所以它們不在物理處理器上運行。

相反,在用戶模式下,代碼直接在處理器上運行,幾乎所有與硬件交互的指令,要么是特權指令,要么會產生內核態陷阱指令或中斷指令。

VMware截獲所有中斷并處理它們,以便虛擬機仍然認為這是一個正常機器。然而在x86體系結構中,一些指令在獲取硬件相關的信息時并不產生異常,如sidt、sgdt、sldt、cpuid等等。為了正確虛擬這些指令,VMware需要在所有指令上進行二進制翻譯,因此造成巨大的性能損失。

為了避免執行全指令模擬造成的巨大性能損失,VMware允許一些特定指令在沒有正確虛擬化的前提下運行。最終,這意味著某些指令序列在VMware虛擬機而不是在物理機中運行時返回不同的結果。處理器使用某些關鍵的結構與表,它們會被加載與真實系統不同的偏移量,而這正是未進行全虛擬化的副作用。

中斷描述表(IDT)是CPU內部的一個數據結構,操作系統使用它來確保正確響應中斷和異常。在x86體系結構下,所有的內存獲取,或是通過全局描述表(GDT)獲得,或是通過本地描述表(LDT)獲得。這些表中包含段描述符,它們提供每一個段的詳細存取信息,其中包含段基地址類型、長度,以及存取權限等等。

IDT、GDT和LDT是CPU內部的寄存器,它們分別存放著各自表的基地址和大小。有三條敏感指令(sidt、sgdt和sldt)可以讀取這些表的位置,并且將相應的寄存器存入內存地址。因為這些指令可以隨時被用戶態代碼調用,且不會產生陷阱,也未被VMware正確虛擬化,所以這些異常都可能被用來探測VMware的存在。

1.使用Red Pill反虛擬機技術

Red Pill通過運行sidt指令獲取IDTR寄存器的值。虛擬機監視器必須重新定位Guest系統的IDTR,來避免與Host系統的IDTR沖突。因為在虛擬機中運行sidt指令時,虛擬機監視器不會得到通知,所以會返回虛擬機的IDTR。

Red Pill通過測試這種差異來探測Vmware的使用。這種方法存在一個缺陷,由于IDT的值只針對處于正在運行的處理器而言,在單CPU中它是個常量,但當它處于多CPU時就可能會受到影響了,因為每個CPU都有其自己的IDT,這樣問題就自然而然的產生了。

針對此問題,Offensive Computing組織成員提出了兩種應對方法:

其中一種方法就是利用Red Pill反復地在系統上循環執行任務,以此構造出一張當前系統的IDT值變化統計圖,但這會增加CPU負擔;

另一種方法就是windows API函數SetThreadAffinityMask()將線程限制在單處理器上執行,當執行此測試時只能準確地將線程執行環境限制在本地處理器,而對于將線程限制在VM處理器上就可能行不通了,因為VM是計劃在各處理器上運行的,VM線程在不同的處理器上執行時,IDT值將會發生變化,因此此方法也很少被使用。

2.使用No Pill反虛擬機技術

sgdt和sldt指令探測VMware的技術通常被稱為No Pill。

BOOL CheckVMWare()  
{  
   ULONG xdt = 0 ;  
   ULONG InVM = 0;  
   __asm  
   {  
       push edx  
       sidt [esp-2]  
       pop edx  
       nop  
       mov xdt , edx  
   }  
   if (xdt > 0xd0000000)  
   {  
   
       InVM = 1;  
   }  
   else  
   {  
       InVM = 0;  
   }  
   __asm  
   {  
       push edx  
       sgdt [esp-2]  
       pop edx  
       nop  
       mov xdt , edx  
   }  
   if (xdt > 0xd0000000)  
   {  
       InVM += 1;  
   }  
   if (InVM == 0)  
   {  
       return FALSE;  
   }  
   else  
   {  
       return TRUE;  
   }  
}

通過禁用VMware加速可以防止No Pill技術的探測。

3.查詢I/O端口

VMware使用虛擬化的I/O端口完成宿主系統與虛擬機之間的通信,以便支持諸如復制和粘貼功能。這個端口可以被查詢,然后與一個magic數比較,以確定VMware的使用。

這種技術成功的關鍵在于x86體系結構中的in指令,它從一個源操作數指定的端口復制數據到目的操作數指定的內存地址。VMware會監視in指令的執行,并捕獲目的通信端口為0x5668(VX)的I/O。

VMware會檢查第二個操作數是否是VX,在這種情況發生時,EAX寄存器載入的值是0x564D5868(VMXh),ECX寄存器必須被載入你希望在端口上執行相應操作的值,值0xA表示 get VMware version type,0x14代表 get the memory size。

它們都可以被用來探測VMware,但0xA更受歡迎,因為它能確定VMware的版本。如代碼所示setz指令在magic數與VMXh匹配時設置返回值rc為1,如果在真實的機器上運行會觸發EXCEPTION_EXECUTE_HANDLER 異常,在異常處理中設置返回值rc為0。

BOOL CheckVMWare()  
{  
   bool rc = 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   [rc]  
           pop    ebx  
           pop    ecx  
           pop    edx  
       }  
   }  
   __except(EXCEPTION_EXECUTE_HANDLER)    
   {  
       rc = false;  
   }  
   return rc;  
}

對付這種反虛擬化技術的最簡單方法是使用NOP指令替換in指令,或修補條件跳轉,使得它不論比較結果如何,都執行到未探測到虛擬機的程序分支。

4.使用str指令

在保護模式下運行的所有程序在切換任務時,對于當前任務中指向TSS的段選擇器將會被存儲在任務寄存器中,TSS中包含有當前任務的可執行環境狀態,包括通用寄存器狀態、段寄存器狀態、標志寄存器狀態、EIP寄存器狀態等等,當此項任務再次被執行時,處理器就會其原先保存的任務狀態。

每項任務均有其自己的TSS,而我們可以通過STR指令來獲取指向當前任務中TSS的段選擇器。這里STR指令是用于將任務寄存器(TR)中的段選擇器存儲到目標操作數,目標操作數可以是通用寄存器或內存位置,使用此指令存儲的段選擇器指向當前正在運行的任務的任務狀態段(TSS)。

在虛擬機和真實主機之中,通過STR讀取的地址是不同的,當地址等于0x0040xxxx時,說明處于虛擬機中,否則為真實主機。

BOOL CheckVMWare()  
{  
   unsigned char mem[4] = {0};  
   __asm str mem;  
   if ((mem[0] == 0x00) && (mem[1] == 0x40))  
   {  
       return TRUE;  
   }  
   else  
   {  
       return FALSE;  
   }  
}

在IDA PRO中,可以使用下面的腳本查找我們前面提到的指令。

from idautils import *  
from idc import *  
 
heads = Heads(SegStart(ScreenEA()), SegEnd(ScreenEA()))  
antiVM = []  
for i in heads:  
   if (GetMnem(i) == "sidt" or GetMnem(i) == "sgdt" or GetMnem(i) == "sldt" or GetMnem(i) == "smsw" or GetMnem(i) == "str" or GetMnem(i) == "in" or GetMnem(i) == "cpuid"):  
       antiVM.append(i)  
 
print "Number of potential Anti-VM instructions: %d" % (len(antiVM))  
 
for i in antiVM:  
   SetColor(i, CIC_ITEM, 0x0000ff)  
   Message("Anti-VM: %08x\\n" % i)

要在IDA PRO中運行腳本,選擇File->Script File,可以看到下面的輸出。

圖片

這個輸出表明腳本檢測到了三條漏洞指令類型。滾動到IDA PRO的反匯編窗口,我們看到三條紅色高亮顯示的指令sidt、str和sldt。

5.使用無效的操作碼

每臺機器都有一組定義的指令,通常稱為指令集架構(Instruction Set Architecture)。

當遇到無效指令(不存在于ISA中)時,機器引發無效操作碼異常。軟件可以處理異常(使用通常的try/catch機制),也可以讓操作系統處理異常,或者在最壞的情況下崩潰機器。

VirtualPC使用一堆無效指令來允許虛擬機和VirtualPC之間連接。當VirtualPC的虛擬機想要與VirtualPC通信時,程序設置異常處理程序(try/catch塊),在調用VM軟件之前設置所需的參數,發出特殊的無效操作碼指令。

VM軟件將識別此無效操作碼并相應地操作,如果VirtualPC存在則不引起異常,并且如果VirtualPC不存在則產生異常。

最后,程序的catch塊將處理異常并檢查返回的VM軟件的參數。總之,VirtualPC使用無效的操作碼機制作為后門。

DWORD IslnsideVPC_exceptionFilter(LPEXCEPTION_POINTERS ep)  
{  
   PCONTEXT ctx=ep->ContextRecord;  
   ctx->Ebx = -1; //未運行在VPC中  
   ctx->Eip += 4; //跳過”call VPC”操作  
   return EXCEPTION_CONTINUE_EXECUTION;  
}
BOOL CheckVirtualPC()  
{  
   bool rc = TRUE;  
   __try  
   {  
       __asm  
       {  
           push ebx  
           mov ebx, 0  
           mov eax, 1  
           __emit 0fh  
           __emit 3fh  
           __emit 07h  
           __emit 0bh  
           test ebx, ebx  
           setz[rc]  
           pop ebx  
       }  
   }  
   __except(IslnsideVPC_exceptionFilter(GetExceptionInformation()))  
   {  
       rc = FALSE;  
   }  
   return rc;  
}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Mac
    Mac
    +關注

    關注

    0

    文章

    1083

    瀏覽量

    51143
  • 惡意代碼
    +關注

    關注

    0

    文章

    10

    瀏覽量

    7622
  • 虛擬機
    +關注

    關注

    1

    文章

    888

    瀏覽量

    27815
收藏 人收藏

    評論

    相關推薦

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

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

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

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

    虛擬機虛擬技術

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

    基于虛擬機技術的DSC仿真系統設計

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

    基于虛擬機技術的DCS仿真系統設計與實現

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

    虛擬機:QEMU虛擬機和主機無線網絡通訊設置

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

    KVM虛擬機管理和基本使用

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

    虛擬機技術合集1

    惡意代碼編寫者經常使用虛擬機技術逃避分析,這種技術可以檢測自己是否運行在虛擬機中。如果惡意代碼探測到自己在
    的頭像 發表于 02-14 13:45 ?1160次閱讀

    虛擬機技術合集2

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

    虛擬機技術合集4

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

    linux虛擬機使用教程

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

    Docker與虛擬機的區別

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

    怎么安裝linux虛擬機

    在計算機領域,虛擬機是一種軟件程序,它允許在主操作系統上運行多個虛擬操作系統。Linux虛擬機在開發、測試和學習等環境中得到廣泛應用。本文將詳細介紹如何安裝Linux虛擬機,并提供一個
    的頭像 發表于 11-23 10:50 ?928次閱讀

    虛擬機ubuntu怎么聯網

    虛擬機ubuntu怎么聯網? 虛擬機(Virtual Machine)是運行在物理(Host Machine)上的虛擬操作系統環境。在虛擬機
    的頭像 發表于 12-27 16:51 ?794次閱讀

    虛擬機數據恢復—KVM虛擬機被誤刪除的數據恢復案例

    :EXT4 主要數據:MySQL數據庫 虛擬機2:備份數據庫服務器 虛擬磁盤:系統盤(qcow2)+數據盤(raw) 文件系統:EXT4 主要數據:MySQL數據庫 虛擬機
    的頭像 發表于 08-07 13:33 ?212次閱讀
    <b class='flag-5'>虛擬機</b>數據恢復—KVM<b class='flag-5'>虛擬機</b>被誤刪除的數據恢復案例