加入收藏 | 设为首页 | 会员中心 | 我要投稿 文山站长网 (https://www.0876zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 资源网站 > 空间 > 正文

【硬件虚拟化】远离kernel的理想乡

发布时间:2018-12-08 18:36:42 所属栏目:空间 来源:三寸法师
导读:简介 这个故事描述了如何使用硬件虚拟化(HVM)使得自己的一些hook代码远离内核不容易被其他内核hook所影响并且较难被检测。本文的思路来源于某学校的动态linux内核更新的玩意,代码大量抄自bluepill。 第一章 (Avalon) 阿瓦隆的黎明 由于驱动牛人越来越多系
副标题[/!--empirenews.page--]

 简介

这个故事描述了如何使用硬件虚拟化(HVM)使得自己的一些hook代码远离内核不容易被其他内核hook所影响并且较难被检测。本文的思路来源于某学校的动态linux内核更新的玩意,代码大量抄自bluepill。

【硬件虚拟化】远离kernel的理想乡

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

由于驱动牛人越来越多系统控制权的争夺愈演愈烈,内核之中几乎无一块净土。inline hook、ssdt hook等等各种hook充斥着我们幼小的内核。他们有些结构复杂,有些相互关联,有些检测监视,想要重新获得那些控制点的控制权必须花些力气研究那些hook,使得原来很简单的hook变得牵一发而动全身。

现在有硬件虚拟化技术,我们可以换个思路来解决那些问题了…

一、(Avalon)阿瓦隆的构成

(Avalon) 阿瓦隆的本体为以下几个部分:

1、Avlboot.sys(用于保存刚初始化后还没被hook污染的系统内核方便之后使用)

2、Avalon.sys(用于读取伪内核信息,开启硬件虚拟化加载伪内核)

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

【硬件虚拟化】远离kernel的理想乡

二、(Avalon)阿瓦隆的真相

本文所介绍的(Avalon) 阿瓦隆是一个基于虚拟化的内核加载框架。其利用硬件虚拟化(HVM)和一块没有被hook污染的内核内存,使得PC中同时运行着两个内核。并且Avalon通过控制sysenter_eip和idt中指向伪内核的相应地址来获得控制权。

简而言之,(Avalon)阿瓦隆就是利用硬件虚拟化(HVM)加载自己的内核架空原内核,使得自己能在不被检测的环境下获得内核的控制权。

实现原理如下图所示:


【硬件虚拟化】远离kernel的理想乡

自己的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.  
  20. VOID KrnlCopy() 
  21. { 
  22. PVOID Buffer; 
  23. ULONG Size; 
  24. ULONG RetSize; 
  25. PSYSTEM_MODULE_INFORMATION InfoBuffer; 
  26. NTSTATUS Status; 
  27. PVOID ModuleBase; 
  28. ULONG ModuleSize; 
  29.  
  30. Size=0x1000; 
  31.  
  32.  
  33. do { 
  34.  Buffer=ExAllocatePool(NonPagedPool,Size); 
  35.  Status=ZwQuerySystemInformation(SystemModuleInformation,Buffer,Size,&RetSize); 
  36.  if (Status == STATUS_INFO_LENGTH_MISMATCH) 
  37.        { 
  38.            ExFreePool(Buffer); 
  39.            Size = RetSize; 
  40.        }   
  41. }while(Status == STATUS_INFO_LENGTH_MISMATCH); 
  42.  
  43. InfoBuffer = (PSYSTEM_MODULE_INFORMATION)Buffer; 
  44.  
  45.  
  46. ModuleBase=(PVOID)(InfoBuffer->ModuleInfo[0].Base); 
  47. Orig_krnl=(ULONG)ModuleBase; 
  48.  
  49. DbgPrint("AvlBoot:Orig_krnl Base=%xn",ModuleBase); 
  50. ModuleSize=InfoBuffer->ModuleInfo[0].Size; 
  51. makeKernelCopy((ULONG)ModuleBase,ModuleSize); 
  52. DbgPrint("AvlBoot:Avl_krnl Base=%xn",Avl_krnl); 
  53. ExFreePool(Buffer); 
  54. } 

等初始化之后,其他部件就可以通过访问Avlboot.sys来获得伪内核的信息和内核原始信息。

二、抄来的虚拟化

这里先简单的向大家介绍下,Intel vt硬件虚拟化的步骤:

1、检查vt环境

2、开启vt功能

3、填充vt,存储虚拟机状态

4、设定需要拦截项目

5、设定从虚拟机中退出时返回的地址

6、启动虚拟机,,等待拦截项目触发

7、拦截项目被触发,进入相关项目的处理例程

8、恢复虚拟机继续运行

(编辑:文山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读