大理寺少卿 发表于 2025-1-20 18:50:40

驱动开发与系统原理01-驱动中的HelloWorld

万事万物起源于Hello World,这节讲述如何在驱动中打印Hello World.

实验
----

我们现在开发的是NT驱动,属于一种老驱动,现在和WDM驱动合并了

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211126124231.png)

直接点击创建驱动,首先把Driver Files的inf文件删除,因为我们写NT式驱动没用,可能会产生报错

我们先配置一下

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211126124437.png)

驱动比较严格,对于很多警告会视为错误,就会编译不过去,我们直接关闭就行了

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211126124631.png)

这个选项得看我们开发哪个平台下的驱动,一定不能弄混,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,一定要有返回值
            }
然后生成就行了

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211126130143.png)

sys为驱动程序,pdb为符号文件,cer为证书,现在我们去32位Win7进行安装

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211126165137.png)

安装成功

注意
----

在x64下存在两种安全机制

PG:保护SSDT、GDT、ntos,如果我们对这些进行修改,就会触发PG,从而导致蓝屏

DES:强制签名

    ed nt!kd_fusion_mask 0 //关闭Windbg的日志刷新
如果全程使用API编程,我们不要考虑修改,但是如果我们对一些结构比如SSDT等进行操作,就得自己手动修改

调试
----

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211126170218.png)

DbgBreakPoint其实也是对int 3的封装

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211126170352.png)

我们重新编译,安装,运行驱动,直接断下来了

在Windbg中我们通过一些指令可以进行调试

![](https://raw.githubusercontent.com/Whitebird0/tuchuang/main/QQ%E6%88%AA%E5%9B%BE20211126170447.png)

F9:下断点
F10:单步步过
F11:单步步进
Shift+F11:跳出函数
页: [1]
查看完整版本: 驱动开发与系统原理01-驱动中的HelloWorld