成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

【硬件虛擬化】遠離kernel的理想鄉

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

 簡介

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

[[251619]]

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

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

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

一、(Avalon)阿瓦隆的構成

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

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

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

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

 

二、(Avalon)阿瓦隆的真相

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

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

實現原理如下圖所示:


 

 

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

三、(Avalon)阿瓦隆的應用

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

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

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

這種方式的hook和傳統的一些hook相比有著以下優點:

1、不在傳統的內存監控的范圍,較難檢測。

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

但是同樣有一些缺點:

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

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

第二章 空想具現化

一、純潔的初始化

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

實現代碼如下:

  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.   內核拷貝 
  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來獲得偽內核的信息和內核原始信息。

二、抄來的虛擬化

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

1、檢查vt環境

2、開啟vt功能

3、填充vt,存儲虛擬機狀態

4、設定需要攔截項目

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

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

7、攔截項目被觸發,進入相關項目的處理例程

8、恢復虛擬機繼續運行

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

  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 申請內存空間 
  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 申請內存空間  
  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結構 
  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. // 設置cr4位,為啟用VM模式做準備 
  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指令,所以只能使用其他方法來獲得控制權。

這里有三種方法:

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

2、使用調試寄存器在kifastcallentery下硬件執行中斷,利用中斷進入vm

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

為了不被內存檢測和充分利用調試寄存器,Avalon中我選用了方案3來控制進程執行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地址誤導訪問者(由系統投遞相對穩定)。

第二種是指方案模擬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.  

第三章 理想鄉的黃昏

一、(Avalon)阿瓦隆的檢測

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

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

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

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

二、未來的更新

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

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

2、 和ring3程序交互…

3、其他隱藏功能

總結

Avalon只是硬件虛擬化應用的冰山一角,還有更多的應用等待著我們去探索,小弟的水平有限以后還要向各位高手多多請教繼續努力學習。

該bin測試環境如下:

bochs2.4.5

windows xp sp3

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

責任編輯:武曉燕 來源: 看雪學院
相關推薦

2009-04-15 18:32:33

Vmwareesx虛擬化

2019-02-28 15:50:18

硬件虛擬化內存

2020-03-10 18:30:06

GPU虛擬化FPGA

2020-03-06 15:00:18

CPU硬件虛擬化

2011-07-04 09:53:40

虛擬化服務器虛擬化

2011-11-03 09:42:20

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

2011-06-29 10:59:27

虛擬化服務器硬件

2012-09-27 09:41:31

虛擬化

2010-10-25 10:29:32

虛擬化

2009-01-14 18:15:40

服務器虛擬化VMware

2009-04-16 19:00:45

Vmware虛擬化惠普

2013-07-04 09:48:46

服務器虛擬化服務器硬件虛擬化成本

2013-01-05 15:49:25

數據保護虛擬化

2012-08-07 09:32:59

虛擬化

2012-08-08 09:59:26

虛擬化服務器

2012-02-08 09:35:16

硬件投入服務器虛擬化

2009-05-27 10:34:50

硬件輔助虛擬化

2010-11-17 10:14:13

Windows 8虛擬化

2009-07-17 09:45:13

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

2010-03-19 10:31:11

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

51CTO技術棧公眾號

主站蜘蛛池模板: 国产黄色一级片 | 久久综合久 | 国产免费麻豆视频 | 欧美成人第一页 | 亚洲国产精品人人爽夜夜爽 | 天天插天天搞 | 女人牲交视频一级毛片 | 97成人免费 | 国产精品成人一区二区三区 | 成人在线观 | 日韩视频区 | 亚洲精品v日韩精品 | 日韩午夜影院 | 欧美日韩一区在线观看 | gogo肉体亚洲高清在线视 | 黄色国产大片 | 99精品国产一区二区青青牛奶 | 欧美人妇做爰xxxⅹ性高电影 | 黄免费看 | 欧美群妇大交群中文字幕 | 国产成人av在线 | 国产高清在线精品一区二区三区 | 欧美在线视频一区二区 | 亚洲一区二区三区免费视频 | 日本成人在线免费视频 | 天堂免费看片 | 成人1区2区 | 日韩欧美大片在线观看 | 精品少妇一区二区三区日产乱码 | 国产成人综合网 | 91av视频在线免费观看 | 久久一区二区三区四区五区 | 成人一区二区视频 | 日韩久久成人 | 精品国产欧美一区二区三区成人 | 欧美在线激情 | a黄视频 | 在线观看中文字幕视频 | 日韩精品免费 | 亚洲欧美综合精品久久成人 | 亚洲欧美日韩在线不卡 |