万事万物起源于Hello World,这节讲述如何在驱动中打印Hello World.
实验
我们现在开发的是NT驱动,属于一种老驱动,现在和WDM驱动合并了
直接点击创建驱动,首先把Driver Files的inf文件删除,因为我们写NT式驱动没用,可能会产生报错
我们先配置一下
驱动比较严格,对于很多警告会视为错误,就会编译不过去,我们直接关闭就行了
这个选项得看我们开发哪个平台下的驱动,一定不能弄混,Win7下安装Win10驱动会发生蓝屏,我们先以Win7作为实验,所以把OS_Version改为Win7
#include<ntifs.h> //与3环下的include一样,得包头文件
//使用wdm.h ntddk.h一样
//main 三环下主函数入口
//WinMain 三环下窗口入口
//UNICODE_STRING
//ANSI_STRING
// 64位
//PG SSDT GDT ntos
//DES 强制签名
VOID DriverUnload(PDRIVER_OBJECT pDriver) {//正常的驱动程序安装后需要有卸载函数
UNREFERENCED_PARAMETER(pDriver);//对没引用的参数进行处理
DbgPrint("Unload success!\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) {//驱动对象指针,注册表路径 注意DriverEntry不能改成其他名字
UNREFERENCED_PARAMETER(pRegPath);//对没引用的参数进行处理
pDriverObject->DriverUnload = DriverUnload;//对pDriverObject中的DriverUnload进行赋值,否则不知道怎么卸载
DbgPrint("Hello World!\n ");//打印
//KdPrint(())
return STATUS_SUCCESS;//状态成功为0,一定要有返回值
}
然后生成就行了
sys为驱动程序,pdb为符号文件,cer为证书,现在我们去32位Win7进行安装
安装成功
注意
在x64下存在两种安全机制
PG:保护SSDT、GDT、ntos,如果我们对这些进行修改,就会触发PG,从而导致蓝屏
DES:强制签名
ed nt!kd_fusion_mask 0 //关闭Windbg的日志刷新
如果全程使用API编程,我们不要考虑修改,但是如果我们对一些结构比如SSDT等进行操作,就得自己手动修改
调试
DbgBreakPoint其实也是对int 3的封装
我们重新编译,安装,运行驱动,直接断下来了
在Windbg中我们通过一些指令可以进行调试
F9:下断点
F10:单步步过
F11:单步步进
Shift+F11:跳出函数 |