一直都有写blog的想法,但是每次总觉得写东西很浪费时间,还不如利用这些时间多学点东西。不过每次学到东西之后,总是很容易遗忘,学到方法不假,一些零碎细节忘的很快,于是决定还是应该写点东西出来作备忘。
去年末,对Blue Pill有稍微了解一下,但终究是没有完整阅读过源代码,今天花了一天的时间把Blue Pill的源代码看了一下,总算对其中的奥妙之处有所了解。原先对VT技术不是特别了解的地方今天看了代码之后也了解,这下就不用去看IA-32开发手册了(不过有时间还是需要去求证)。
Blue Pill的源代码可以从这里下载http://bluepillproject.org/
在代码目录中dbgclient是调试时使用的客户端驱动,bpknock是演示时使用的命令行程序(主要是对CPUID指令的执行),Blue Pill核心代码在nbp-0.32-public目录下,代码结构如下:
amd64和i386分别用各自的体系内的机器指令实现底层调用界面(客户机与宿主机之间)
svm实现amd64体系内的虚拟机svm
vmx实现i386体系内的虚拟机vmx
common平台无关代码部分
Blue Pill事实上在这里是一个普通的windows内核驱动,我们从入口点开始沿着驱动的执行流分析Blue Pill。DriverEntry的代码如下(去掉调试输出代码):
NTSTATUS DriverEntry (
PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath
)
{
NTSTATUS Status;
Status = MmInitManager (); //建立四