NewBluePill源码学习

NewBluePill的源码也看的差不多了,一直说等有时间了再写学习的一些心得,拖来拖去弄到现在了,时间不是等来的,慢慢开始吧。

0x00     初识硬件虚拟化

硬件虚拟化对大数人来讲还是比较陌生。什么是硬件虚拟化?因为早期的虚拟机都是进程级虚拟机,也就是作为已有操作系统的一个进程,完全通过软件的手段来模拟硬件,软件再翻译内存地址的方法实现物理机器的模拟,这样虚拟效率较低,资源利用率低。之后Intel和AMD相继推出了支持硬件虚拟化的处理器,所谓硬件虚拟化,也就是在硬件抽象层对虚拟技术提供直接支持,提高虚拟效率。我们之前提到过在进程级虚拟机中的客户机访问的物理地址需要经过软件的再次转化成真实机器的物理地址,而且也需要给不同的客户机操作系统编写不同的虚拟设备驱动程序从而可以共享同一真实的硬件资源。而硬件虚拟化则是实现了内存地址甚至与I/O设备的直接映射,无需经过再一次的转换。而硬件虚拟化技术中引出了一个重要的概念——VMM(Virtual Machine Monitor),使硬件虚拟化技术产生的一个新的特权级,用来处理虚拟硬件和真实硬件的通信和一些事件的处理,因此其系统权限在操作系统之上,产生了一个新的特权级“Ring -1”。可以简单理解为利用硬件虚拟化技术可以让我们的代码运行在操作系统之下,监视整个操作系统的运行。

0x01     VT与NewBluePill

VT是Intel的硬件虚拟化技术,已经流行多年,但关于VT的资料并不多。之前有大牛利用VT写出的调试器插件可以直接无视反调试,而学习VT技术,最好的资料莫过于NewBluePill源码http://www.invisiblethingslab.com/itl/Resources.html (以下简称nbp),nbp是2007年由Invisible Things Lab公布,为nbp-0.32-public版本。其中实现了一个基本的VMM,可以在操作系统运行时动态加载和卸载,在操作系统不知情的情况下将操作系统置于虚拟机中运行和内存隐藏技术。虽然nbp支持Intel和AMD虚拟化,但在我们之后分析的重点是Intel的虚拟化,也就是主要学习的是VT技术。

0x02    NewBluePill编译及调试

nbp的源码已经上传到网盘中点击下载,可自行进行下载。关于编译环境,我的是WDK7600,VMWare+Windows 7 X64 Ultimate SP1虚拟机。对于WDK的环境配置与虚拟机的安装就不在此进行赘述了,安装好编译环境之后,在WDK的Win7命令行编译环境中(Check版本)运行nbp-0.32-public\nbp-0.32-public\build_code.cmd。

如图所示则编译成功,在bin目录下生成了nbp-0.32-public\amd64\newbp.sys文件。

在虚拟机的设置中需要将虚拟化选项选中。我使用的是VMWare10。

在nbp-0.32-public\common\newbp.c文件中的DriverEntry的开始部分加上代码,使程序运行时中断到WinDBG调试器:

#ifdef _DEBUG
   CmDebugBreak();   //int 3
#endif // _DEBUG

jpg改rar
时间: 2024-10-24 22:37:44

NewBluePill源码学习的相关文章

FireMonkey 源码学习(5)

(5)UpdateCharRec 该函数的源码分析如下: procedure TTextLayoutNG.UpdateCharRec(const ACanvas: TCanvas; NeedBitmap: Boolean; var NewRec: PCharRec; HasItem: Boolean; const CharDic: TCharDic; const AFont: TFont; const Ch: UCS4Char; const NeedPath: Boolean = False);

jquery源码学习

jQuery 源码学习是对js的能力提升很有帮助的一个方法,废话不说,我们来开始学习啦 我们学习的源码是jquery-2.0.3已经不支持IE6,7,8了,因为可以少学很多hack和兼容的方法. jquery-2.0.3的代码结构如下 首先最外层为一个闭包, 代码执行的最后一句为window.$ = window.jquery = jquery 让闭包中的变量暴露倒全局中. 传参传入window是为了便于压缩 传入undefined是为了undifined被修改,他是window的属性,可以被修

Hadoop源码学习笔记(1) ——第二季开始——找到Main函数及读一读Configure类

Hadoop源码学习笔记(1) ——找到Main函数及读一读Configure类 前面在第一季中,我们简单地研究了下Hadoop是什么,怎么用.在这开源的大牛作品的诱惑下,接下来我们要研究一下它是如何实现的. 提前申明,本人是一直搞.net的,对java略为生疏,所以在学习该作品时,会时不时插入对java的学习,到时也会摆一些上来,包括一下设计模式之类的.欢迎高手指正. 整个学习过程,我们主要通过eclipse来学习,之前已经讲过如何在eclipse中搭建调试环境,这里就不多述了. 在之前源码初

HSQLDB源码学习——数据库安装启动及JDBC连接

HSQLDB 是一个轻量级的纯Java开发的开放源代码的关系数据库系统.因为HSQLDB的轻量(占用空间小),使用简单,支持内存运行方式等特点,HSQLDB被广泛用于开发环境和某些中小型系统中. 在http://sourceforge.net/projects/hsqldb/files/下载了HSQLDB 1.8.0版本.把下载的zip文件解压缩至任意目录例如c:\hsqldb1.8便完成安装. hsqldb有四种运行模式: 一.内存(Memory-Only)模式:所有数据都在内存里操作.应用程

lodash源码学习(10)

_.delay(func, wait, [args]) 延迟wait毫秒之后调用该函数,添加的参数为函数调用时的参数 //delay.js var baseDelay = require('./_baseDelay'),//baseDelay方法 baseRest = require('./_baseRest'),//创建使用rest参数方法 toNumber = require('./toNumber');//转化为数字 /** * * @param {Function} func 需要延迟执

lodash源码学习(2)

继续学习lodash,依然是数组的方法 “Array” Methods _.indexOf(array, value, [fromIndex=0]) 获取value在数组 array所在的索引值 使用 SameValueZero方式比较(第一个全等===的元素). 如果 fromIndex 值是负数, 则从array末尾起算 该方法依赖于strictIndexOf和baseIndexOf方法,先看它们的源码 //_strictIndexOf.js /** * _.indexOf的专业版本,对元素

jQuery源码学习感想

还记得去年(2015)九月份的时候,作为一个大四的学生去参加美团霸面,结果被美团技术总监教育了一番,那次问了我很多jQuery源码的知识点,以前虽然喜欢研究框架,但水平还不足够来研究jQuery源码,那时我不明白他们为何要求那么高,现在才知道,原来没那么高,他问的都是jQuery最基本的框架架构,不过对于不知道的来说,再简单我也是不知道,那时写了一篇博文去吐槽了一下,那时候也是我自己真正激发自己的时候,那时候我说我一定要搞好自己的jQuery基础,没想到那么快就实现了,一个月的源码学习时间就结束

Redis源码学习-Lua脚本

Redis源码学习-Lua脚本 1.Sublime Text配置 我是在Win7下,用Sublime Text + Cygwin开发的,配置方法请参考<Sublime Text 3下C/C++开发环境搭建>. 要注意的是:在Cygwin中安装Lua解析器后,SublimeClang插件就能识别出可饮用的Lua头文件了,因为Build System中我们已经配置过"-I", "D:\\cygwin64\\usr\\include",而新安装的Lua头文件会

tomcat源码学习(2)&#160;&#160;关于apache&#160;digest

好久不写博文,罪过罪过.因为最近公司比较忙加上琐事有点多,所以隔了好久才来更新博文. apache digest本来是struts2框架中来加载xml文件并实例化对象的一个jar包,后来使用的越来越多. 我们都知道tomcat的conf文件夹下有一个server.xml配置文件,我们经常会其中的来进行配置以来运行一个java web项目,也经常修改中的port属性以来实现修改tomcat监听的端口.其实每个标签基本上都对应着一个对象,那tomcat是如何将这些对象实例化到java 虚拟机的运行内