自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

【硬件虛擬化】遠(yuǎn)離kernel的理想鄉(xiāng)

云計算 虛擬化
這個故事描述了如何使用硬件虛擬化(HVM)使得自己的一些hook代碼遠(yuǎn)離內(nèi)核不容易被其他內(nèi)核hook所影響并且較難被檢測。本文的思路來源于某學(xué)校的動態(tài)linux內(nèi)核更新的玩意,代碼大量抄自bluepill。

 簡介

這個故事描述了如何使用硬件虛擬化(HVM)使得自己的一些hook代碼遠(yuǎn)離內(nèi)核不容易被其他內(nèi)核hook所影響并且較難被檢測。本文的思路來源于某學(xué)校的動態(tài)linux內(nèi)核更新的玩意,代碼大量抄自bluepill。

[[251619]]

第一章 (Avalon) 阿瓦隆的黎明

由于驅(qū)動牛人越來越多系統(tǒng)控制權(quán)的爭奪愈演愈烈,內(nèi)核之中幾乎無一塊凈土。inline hook、ssdt hook等等各種hook充斥著我們幼小的內(nèi)核。他們有些結(jié)構(gòu)復(fù)雜,有些相互關(guān)聯(lián),有些檢測監(jiān)視,想要重新獲得那些控制點的控制權(quán)必須花些力氣研究那些hook,使得原來很簡單的hook變得牽一發(fā)而動全身。

現(xiàn)在有硬件虛擬化技術(shù),我們可以換個思路來解決那些問題了…

一、(Avalon)阿瓦隆的構(gòu)成

(Avalon) 阿瓦隆的本體為以下幾個部分:

1、Avlboot.sys(用于保存剛初始化后還沒被hook污染的系統(tǒng)內(nèi)核方便之后使用)

2、Avalon.sys(用于讀取偽內(nèi)核信息,開啟硬件虛擬化加載偽內(nèi)核)

3、XXX.sys(用戶利用Avlboot.sys中所提供的信息進行具體hook操作的程序)

 

二、(Avalon)阿瓦隆的真相

本文所介紹的(Avalon) 阿瓦隆是一個基于虛擬化的內(nèi)核加載框架。其利用硬件虛擬化(HVM)和一塊沒有被hook污染的內(nèi)核內(nèi)存,使得PC中同時運行著兩個內(nèi)核。并且Avalon通過控制sysenter_eip和idt中指向偽內(nèi)核的相應(yīng)地址來獲得控制權(quán)。

簡而言之,(Avalon)阿瓦隆就是利用硬件虛擬化(HVM)加載自己的內(nèi)核架空原內(nèi)核,使得自己能在不被檢測的環(huán)境下獲得內(nèi)核的控制權(quán)。

實現(xiàn)原理如下圖所示:


 

 

自己的hook程序在獲得偽內(nèi)核的基地址后,可以通過hookport來處理ssdt,shadow ssdt(strongod需要備份其所hook的ssdt稍微麻煩點,agp什么的只要把地址偏移一下就能用了)。

三、(Avalon)阿瓦隆的應(yīng)用

其實我們可以把(Avalon)阿瓦隆看成是一種變相的sysenter hook+idt hook。

由于(Avalon)阿瓦隆基于硬件虛擬化(HVM)使得我們可以架空整個內(nèi)核,使得內(nèi)核可以在運行時可以實時的替換。

因為偽內(nèi)核的所在內(nèi)存范圍不受內(nèi)存監(jiān)控,別的程序也無法直接訪問,使得我們的偽內(nèi)核就成了不用考慮其他干擾問題,可以隨意hook的安全的理想鄉(xiāng)。

這種方式的hook和傳統(tǒng)的一些hook相比有著以下優(yōu)點:

1、不在傳統(tǒng)的內(nèi)存監(jiān)控的范圍,較難檢測。

2、不干擾系統(tǒng)中原有的hook代碼,兼容性較高。

但是同樣有一些缺點:

1、無法直接干涉object hook,irp hook等不依賴于內(nèi)核內(nèi)存的hook代碼

2、整個系統(tǒng)依賴于硬件虛擬化(HVM),對硬件設(shè)備有一定要求。

第二章 空想具現(xiàn)化

一、純潔的初始化

首先我們來實現(xiàn)(Avalon)阿瓦隆的初始化,初始化由4個部分組成:內(nèi)核信息獲取、偽內(nèi)核構(gòu)造、IDT信息保存、原始SYSENTER_EIP獲取。

實現(xiàn)代碼如下:

  1. NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)  
  2. {  
  3.  
  4. ... 
  5.  
  6. KrnlCopy(); 
  7. IDTCopy(); 
  8. ReadMsrSysenter(); 
  9.  
  10. ... 
  11.  
  12.  
  13. /* 
  14.  
  15.   內(nèi)核拷貝 
  16.  
  17. */ 
  18.  
  19. VOID KrnlCopy() 
  20. PVOID Buffer; 
  21. ULONG Size
  22. ULONG RetSize; 
  23. PSYSTEM_MODULE_INFORMATION InfoBuffer; 
  24. NTSTATUS Status; 
  25. PVOID ModuleBase; 
  26. ULONG ModuleSize; 
  27.  
  28. Size=0x1000; 
  29.  
  30.  
  31. do { 
  32.  Buffer=ExAllocatePool(NonPagedPool,Size); 
  33.  Status=ZwQuerySystemInformation(SystemModuleInformation,Buffer,Size,&RetSize); 
  34.  if (Status == STATUS_INFO_LENGTH_MISMATCH) 
  35.        { 
  36.            ExFreePool(Buffer); 
  37.            Size = RetSize; 
  38.        }   
  39. }while(Status == STATUS_INFO_LENGTH_MISMATCH); 
  40.  
  41. InfoBuffer = (PSYSTEM_MODULE_INFORMATION)Buffer; 
  42.  
  43.  
  44. ModuleBase=(PVOID)(InfoBuffer->ModuleInfo[0].Base); 
  45. Orig_krnl=(ULONG)ModuleBase; 
  46.  
  47. DbgPrint("AvlBoot:Orig_krnl Base=%x\n",ModuleBase); 
  48. ModuleSize=InfoBuffer->ModuleInfo[0].Size
  49. makeKernelCopy((ULONG)ModuleBase,ModuleSize); 
  50. DbgPrint("AvlBoot:Avl_krnl Base=%x\n",Avl_krnl); 
  51. ExFreePool(Buffer); 

等初始化之后,其他部件就可以通過訪問Avlboot.sys來獲得偽內(nèi)核的信息和內(nèi)核原始信息。

二、抄來的虛擬化

這里先簡單的向大家介紹下,Intel vt硬件虛擬化的步驟:

1、檢查vt環(huán)境

2、開啟vt功能

3、填充vt,存儲虛擬機狀態(tài)

4、設(shè)定需要攔截項目

5、設(shè)定從虛擬機中退出時返回的地址

6、啟動虛擬機,等待攔截項目觸發(fā)

7、攔截項目被觸發(fā),進入相關(guān)項目的處理例程

8、恢復(fù)虛擬機繼續(xù)運行

接下來是一些坑爹的代碼:

  1. /* 
  2.   Vmx初始化 
  3. */ 
  4. NTSTATUS NTAPI VmxInitialize ( 
  5.    PCPU Cpu, 
  6.    PVOID GuestEip, 
  7.    PVOID GuestEsp 
  8.    PHYSICAL_ADDRESS AlignedVmcsPA; 
  9.    ULONG VaDelta; 
  10.    NTSTATUS Status; 
  11.  
  12.  
  13.    // 為 VMXON region 申請內(nèi)存空間 
  14.    Cpu->Vmx.OriginaVmxonR = MmAllocateContiguousPages( 
  15.        VMX_VMXONR_SIZE_IN_PAGES,  
  16.        &Cpu->Vmx.OriginalVmxonRPA); 
  17.    if (!Cpu->Vmx.OriginaVmxonR)  
  18.    { 
  19.  DbgPrint("VmxInitialize(): Failed to allocate memory for original VMCS\n"); 
  20.        return STATUS_INSUFFICIENT_RESOURCES; 
  21.    } 
  22.  
  23.    DbgPrint("VmxInitialize(): OriginaVmxonR VA: 0x%x\n", Cpu->Vmx.OriginaVmxonR); 
  24.    DbgPrint("VmxInitialize(): OriginaVmxonR PA: 0x%llx\n", Cpu->Vmx.OriginalVmxonRPA.QuadPart); 
  25.  
  26.    // 為 VMCS 申請內(nèi)存空間  
  27.    Cpu->Vmx.OriginalVmcs = MmAllocateContiguousPages( 
  28.        VMX_VMCS_SIZE_IN_PAGES,  
  29.        &Cpu->Vmx.OriginalVmcsPA); 
  30.    if (!Cpu->Vmx.OriginalVmcs)  
  31.    { 
  32.  DbgPrint("VmxInitialize(): Failed to allocate memory for original VMCS\n"); 
  33.        return STATUS_INSUFFICIENT_RESOURCES; 
  34.    } 
  35.  
  36.    DbgPrint("VmxInitialize(): Vmcs VA: 0x%x\n", Cpu->Vmx.OriginalVmcs); 
  37.    DbgPrint("VmxInitialize(): Vmcs PA: 0x%llx\n", Cpu->Vmx.OriginalVmcsPA.QuadPart); 
  38.  
  39.    // 開啟vmx 
  40.    if (!NT_SUCCESS (VmxEnable (Cpu->Vmx.OriginaVmxonR))) 
  41.    { 
  42.        DbgPrint("VmxInitialize(): Failed to enable Vmx\n"); 
  43.        return STATUS_UNSUCCESSFUL; 
  44.    } 
  45.  
  46.    *((ULONG64 *)(Cpu->Vmx.OriginalVmcs)) =  
  47.        (MsrRead (MSR_IA32_VMX_BASIC) & 0xffffffff); //set up vmcs_revision_id       
  48.  
  49.    // 填充VMCS結(jié)構(gòu) 
  50. Status = VmxSetupVMCS (Cpu, GuestEip, GuestEsp); 
  51.    if (!NT_SUCCESS (Status))  
  52.    { 
  53.        DbgPrint("VmxSetupVMCS() failed with status 0x%08hX\n", Status); 
  54.        VmxDisable(); 
  55.        return Status; 
  56.    } 
  57.  
  58.    DbgPrint("VmxInitialize(): Vmx enabled\n"); 
  59.  
  60.   // 保存EFER 
  61.    Cpu->Vmx.GuestEFER = MsrRead (MSR_EFER); 
  62.    DbgPrint("Guest MSR_EFER Read 0x%llx \n", Cpu->Vmx.GuestEFER); 
  63.  
  64.   // 保存控制寄存器 
  65.    Cpu->Vmx.GuestCR0 = RegGetCr0 (); 
  66.    Cpu->Vmx.GuestCR3 = RegGetCr3 (); 
  67.    Cpu->Vmx.GuestCR4 = RegGetCr4 (); 
  68.  
  69.    CmCli (); 
  70.    return STATUS_SUCCESS; 
  71.  
  72.  
  73.  
  74. /* 
  75.   開啟vmx 
  76. */ 
  77. NTSTATUS NTAPI VmxEnable ( 
  78.    PVOID VmxonVA 
  79.    ULONG cr4; 
  80.    ULONG64 vmxmsr; 
  81.    ULONG flags; 
  82.    PHYSICAL_ADDRESS VmxonPA; 
  83.  
  84. // 設(shè)置cr4位,為啟用VM模式做準(zhǔn)備 
  85.    set_in_cr4 (X86_CR4_VMXE); 
  86.    cr4 = get_cr4 (); 
  87.    DbgPrint("VmxEnable(): CR4 after VmxEnable: 0x%llx\n", cr4); 
  88.    if (!(cr4 & X86_CR4_VMXE)) 
  89.        return STATUS_NOT_SUPPORTED; 
  90.  
  91. // 檢測是否支持vmx 
  92.    vmxmsr = MsrRead (MSR_IA32_FEATURE_CONTROL); 
  93.    if (!(vmxmsr & 4))  
  94.    { 
  95.        DbgPrint("VmxEnable(): VMX is not supported: IA32_FEATURE_CONTROL is 0x%llx\n", vmxmsr); 
  96.        return STATUS_NOT_SUPPORTED; 
  97.    } 
  98.  
  99. //bochs的bug,要改IA32_FEATURE_CONTROL的Lock為1 
  100. #if bochsdebug 
  101. MsrWrite(MSR_IA32_FEATURE_CONTROL,5); 
  102.    #endif 
  103.  
  104.    vmxmsr = MsrRead (MSR_IA32_VMX_BASIC); 
  105.    *((ULONG64 *) VmxonVA) = (vmxmsr & 0xffffffff);       //set up vmcs_revision_id 
  106.    VmxonPA = MmGetPhysicalAddress (VmxonVA); 
  107.  
  108.    DbgPrint("VmxEnable(): VmxonPA:  0x%llx\n", VmxonPA.QuadPart); 
  109.  
  110. //開啟VMX 
  111. VmxTurnOn(VmxonPA); 
  112.    flags = RegGetEflags (); 
  113.    DbgPrint("VmxEnable(): vmcs_revision_id: 0x%x  Eflags: 0x%x \n", vmxmsr, flags); 
  114.  
  115.    return STATUS_SUCCESS; 
  116.  
  117.  
  118.  
  119. /* 
  120.   進入虛擬機 
  121. */ 
  122. NTSTATUS NTAPI VmxVirtualize ( 
  123.  PCPU Cpu 
  124.  
  125.    ULONG esp; 
  126.    if (!Cpu) 
  127.        return STATUS_INVALID_PARAMETER; 
  128.  
  129. *((PULONG) (g_HostStackBaseAddress + 0x0C00)) = (ULONG) Cpu; 
  130.            
  131.    VmxLaunch (); 
  132.  
  133.    // never returns 
  134.  
  135.    return STATUS_UNSUCCESSFUL; 

三、蛋疼的攔截處理

sysenter的處理方法:

由于硬件虛擬化(HVM)無法直接攔截sysenter指令,所以只能使用其他方法來獲得控制權(quán)。

這里有三種方法:

1、在kifastcallentery的頭部寫入cpuid,int3等利用中斷或特權(quán)指令進入vm。

2、使用調(diào)試寄存器在kifastcallentery下硬件執(zhí)行中斷,利用中斷進入vm

3、進入VMM后直接修改guest的sysenter_eip地址,通過控制msr的讀寫來欺騙其他訪問msr的程序。

為了不被內(nèi)存檢測和充分利用調(diào)試寄存器,Avalon中我選用了方案3來控制進程執(zhí)行sysenter后的運行流向。

部分代碼:

  1. static BOOLEAN NTAPI VmxDispatchMsrRead ( 
  2.  PCPU Cpu, 
  3.  PGUEST_REGS GuestRegs, 
  4.  PNBP_TRAP Trap, 
  5.  BOOLEAN WillBeAlsoHandledByGuestHv 
  6.  
  7. ... 
  8.  
  9. switch (ecx) { 
  10.  case MSR_IA32_SYSENTER_CS: 
  11.    MsrValue.QuadPart = VmxRead (GUEST_SYSENTER_CS); 
  12.    break; 
  13.  
  14.  case MSR_IA32_SYSENTER_ESP: 
  15.    MsrValue.QuadPart = VmxRead (GUEST_SYSENTER_ESP); 
  16.    break; 
  17.  case MSR_IA32_SYSENTER_EIP: 
  18.    MsrValue.QuadPart = Avlkrnlinfo->SysenterAddr; 
  19.  
  20. ... 
  21.  

idt重定向處理方法:

1、idt地址欺騙

2、idt模擬投遞

第一種是指方案攔截sidt,lidt指令填充一份偽造的idt地址誤導(dǎo)訪問者(由系統(tǒng)投遞相對穩(wěn)定)。

第二種是指方案模擬idt的處理過程自己寫程序投遞idt。

因為方案一需要使用反匯編引擎分析具體的保存地址體積過大,所以本版的Avalon使用第二種方案即idt模擬投遞。

部分代碼:

  1. static BOOLEAN NTAPI VmxDispatchException ( 
  2.  PCPU Cpu, 
  3.  PGUEST_REGS GuestRegs, 
  4.  PNBP_TRAP Trap, 
  5.  BOOLEAN WillBeAlsoHandledByGuestHv 
  6.  
  7.  
  8. ... 
  9.  
  10.  //SETP 7. SET EIP 
  11.  
  12.  if((uIntrInfo & 0xff) == 1){ 
  13.   ComPrint("VmxDispatchException():#BD hit  /n"); 
  14.   VmxWrite(GUEST_RIP,Avlkrnlinfo->Fake_IDTMap[0]); 
  15.  } 
  16.  else if ((uIntrInfo & 0xff) == 3){ 
  17.   ComPrint("VmxDispatchException():#BP hit /n"); 
  18.   VmxWrite(GUEST_RIP,Avlkrnlinfo->Fake_IDTMap[1]);} 
  19.  
  20. ... 
  21.  

第三章 理想鄉(xiāng)的黃昏

一、(Avalon)阿瓦隆的檢測

對于基于硬件虛擬化(HVM)的程序,首先想到的方法必然就是直接檢測和對抗硬件虛擬化。

對硬件虛擬化的檢測主要有:efer的檢測,vme的檢測。

對于處理了中斷的vmm還能通過計算中斷前后的時間差來判斷自身是否在虛擬機中。

當(dāng)然針對Avalon還有其他的檢測方法(此處省略xx字)

二、未來的更新

Avalon才剛剛開始功能并不完善,還有好多功能想加進去:

1、將內(nèi)核移入EPT(NPT)讓你完全看不到

2、 和ring3程序交互…

3、其他隱藏功能

總結(jié)

Avalon只是硬件虛擬化應(yīng)用的冰山一角,還有更多的應(yīng)用等待著我們?nèi)ヌ剿?,小弟的水平有限以后還要向各位高手多多請教繼續(xù)努力學(xué)習(xí)。

該bin測試環(huán)境如下:

bochs2.4.5

windows xp sp3

注意:這個bin只是個簡單的樣品,真機上運行必藍(lán),且只針對ring0的中斷,ring3有3處bug未修復(fù)。

責(zé)任編輯:武曉燕 來源: 看雪學(xué)院
相關(guān)推薦

2009-04-15 18:32:33

Vmwareesx虛擬化

2019-02-28 15:50:18

硬件虛擬化內(nèi)存

2020-03-10 18:30:06

GPU虛擬化FPGA

2020-03-06 15:00:18

CPU硬件虛擬化

2011-07-04 09:53:40

虛擬化服務(wù)器虛擬化

2011-11-03 09:42:20

虛擬化硬件虛擬化輔助虛擬化

2011-06-29 10:59:27

虛擬化服務(wù)器硬件

2012-09-27 09:41:31

虛擬化

2010-10-25 10:29:32

虛擬化

2013-07-04 09:48:46

服務(wù)器虛擬化服務(wù)器硬件虛擬化成本

2009-04-16 19:00:45

Vmware虛擬化惠普

2009-01-14 18:15:40

服務(wù)器虛擬化VMware

2012-02-08 09:35:16

硬件投入服務(wù)器虛擬化

2012-08-07 09:32:59

虛擬化

2012-08-08 09:59:26

虛擬化服務(wù)器

2013-01-05 15:49:25

數(shù)據(jù)保護虛擬化

2010-11-17 10:14:13

Windows 8虛擬化

2009-05-27 10:34:50

硬件輔助虛擬化

2009-07-17 09:45:13

云計算硬件成本虛擬化硬件成本

2010-03-19 10:31:11

虛擬化XP Mode虛擬化
點贊
收藏

51CTO技術(shù)棧公眾號