windows 驱动与内核调试 学习

article/2025/10/5 16:46:04

概述

本文讲述笔者在学习内核和驱动开发的笔记。

驱动概述

一般驱动需要运行内核权限下运行(因为涉及硬件读取),比如Intel下的ring 0 权限下。在windwos大量病毒和杀软为了特殊目的往往都是通过将自身升级为内核驱动方式进行运作。如果病毒程序首先进入ring 0理论上可以杀软将毫无作用。微软为了扼杀此类程序在windwo7 64位系统上会强制校验驱动程序签名,如果签名非微软认可将不会被加载。

在这里插入图片描述

微软官方驱动学习指南

驱动开发环境配置

首先我们根据当前操作系统下载对应的WDKvisual studio。相关下载地址:微软相关下载地址

微软对于IDE配置写的及其详细不想写轮子,开始第一个驱动程序,当你配置完成我们可以通过visual studio模板创建一个工程

在这里插入图片描述

在这里插入图片描述
我们第一个示例程序如下:

#include <Ntddk.h>//这个函数被注册用于驱动卸载调用
VOID myUnload(struct _DRIVER_OBJECT* DriverObject
) {UNREFERENCED_PARAMETER(DriverObject);DbgPrint("hello  drive unloaded");
}//驱动被加载的时候会调用此函数
NTSTATUS
DriverEntry(_In_ struct _DRIVER_OBJECT* DriverObject,_In_ PUNICODE_STRING    RegistryPath
)
{//如果你没有用到参数需要告诉系统。UNREFERENCED_PARAMETER(RegistryPath);//打印信息DbgPrint("hello  drive loaded");//驱动卸载回调注册DriverObject->DriverUnload = myUnload;return STATUS_SUCCESS;
}

点击生成驱动文件
在这里插入图片描述

如果抛出如下错误,可以下载相关库再次编译
在这里插入图片描述
在这里插入图片描述
这里由于是学习目的就不需要启用了,关闭如下图所示:在这里插入图片描述

tip:spectre attack是一个物理级别的漏洞

拷贝编译产物到目标操作系统(系统需要关闭数字签名)
在这里插入图片描述
可以利用一些三分工具加载相关驱动如下图所示

在这里插入图片描述

安全启动点击停止得到相关输出:
在这里插入图片描述

接下来写入一个有趣的蓝屏代码

在这里插入图片描述

我们可以看到如下图错误

在这里插入图片描述

驱动和内核调试

我们假设被调试的内核系统是win10 且运行在vmware中。

被调试的机器按照如下条件配置:
(1) 调试机器和被调试机器能相互ping(如果不能请关闭防火墙等)

(2) 管理员身份运行cmd 键入bcdedit /debug on 开启内核调试

可参阅 BCDEdit 调试开关

(3) 根据情况配置 配置网络或者串口调试设置
距离一个串口的配置命令如下:

bcdedit /dbgsettings serial baudrate:115200 debugport:2

可参阅 BCDEdit 调试配置

(4) 如果开启了串口调试那么配置vmware 相关串口

\\.\\pipe\com_2

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

上述配置完成后你可用windbg进行调内核代码。
在这里插入图片描述

在这里插入图片描述
确定后 ,重启被调试的电脑。

其他快捷链接方式:
在这里插入图片描述

目标后面拼接 -b -k com:pipe,port=\.\pipe\com_2,resets=0 也是可以的。

在这里插入图片描述

挂到断点继续输入g运行即可

当我们驱动断点触发时
在这里插入图片描述
你会差异的发现自动关联的了源码。大致原因时sys驱动文件的debug版本会在PE结构中保留符号表位置
在这里插入图片描述

如果需要windbg查看dbgprint的输出请执行

 ed nt!Kd_Default_Mask 8

参考

编写 Hello World Windows 驱动程序 (KMDF)

win10关闭驱动数字签名

Disabling-Driver-Signature-Verification-on-Windows-8-or-10

微软签名概述

spectre 漏洞文档

BCDEdit 调试开关

BCDEdit 调试配置


http://chatgpt.dhexx.cn/article/CutojilE.shtml

相关文章

Windows内核--CPU和内核(1.7)

Windows内核支援哪些CPU? Intel x86/x86_64 IA64已不再支持. AMD amd64 ARM (Windows On Arm: WOA) ARM具备低功耗优势, 除了高通, 还有Broadcom/NXP等都支援ARM架构. 苹果自研M系列开了头&#xff0c;ARM不仅有低功耗&#xff0c;同样有性能&#xff0c;Windows也想分一杯羹…

windows内核驱动

内核&驱动基础 WDK(Windows Driver Kit) 内核编程需要使用WDK WDK 下载 windows xp wdk 下载地址 WDK 安装 勾选所有的安装项,避免错过一些例子 默认安装目录: C:\WinDDKfirst驱动开发 源码 first.c #include <ntddk.h>#define DEBUG/** 卸载函数*/ VOID Driver…

Windows 内核会换为 Linux 吗?

关注、星标公众号&#xff0c;不错过精彩内容 来源&#xff1a;网络 编辑整理&#xff1a;strongerHuang 如果装个纯linux&#xff0c;则一些windows软件没法用。如果用windows然后装个虚拟机&#xff0c;在虚拟机上安装linux&#xff0c;又感觉麻烦而且占用电脑资源。 现在win…

Windows内核之系统架构

一.架构概述 下图显示了Windows的基本结构。Windows采用双模式来保护操作系统本身&#xff0c;以避免被应用程序的错误所波及。操作系统核心运行在内核模式下&#xff0c;应用程序的代码运行在用户模式下。每当应用程序需要用到系统内核或内核的扩展模块&#xff08;内核驱动程…

Windows内核原理与实现之Windows设备驱动程序

文章摘录自《Windows内核原理与实现》一书。 设备驱动程序是操纵设备的内核模块&#xff0c;I/O 管理器、即插即用管理器和电源管理器都需要与设备的驱动程序打交道。 在Windows I/O 系统中&#xff0c;设备驱动程序不仅为操作系统提供了支持各种 I/O 设备的能力&#xff0c;…

Windows内核的基本概念

Windows内核的基本概念 1 处理器模式 Windows使用 0 和3 两种特权级。0 表示CPU处于内核模式(kernel mode)&#xff1b;3 表示用户模式(user mode)。 1.1 内存管理 Windows 将32位虚拟内存空间按照0~4 GB的线性地址空间看待。其中2~4GB是所有进程共享的&#xff0c;为系…

Windows内核--源代码在哪里?(1.1)

大部分人能看到这篇帖子, 想必已经用过Windows系统多年了... 微软官方并不完全公开源代码 想清楚Windows技术内幕&#xff0c;就需要逆向工具。幸运的是: WRK源代码(Windows Research Kernel) (XP/Server 2003)Windows 2000源代码(Kernel和用户层) 深入解析Windows操作系统(最…

windows内核驱动开发(WDK环境搭建)

去官网下载WDK安装包和Visual Studio 下载 Windows 驱动程序工具包 (WDK) - Windows drivers | Microsoft Docs 首先安装Visual Studio 这个就不用我介绍了怎么安装了。 下面直接下载步骤二和步骤三的SDK和WDK。 SDK下载地址 WDK下载地址 注意下载的SDK和WDK版本需要统…

Windows内核--子系统(3.5)

到底什么是子系统? 子系统是用户层概念。在Windows内核之上&#xff0c;如果想要执行类UNIX应用程序&#xff0c;就是POSIX子系统&#xff0c;如果要类似OS/2环境&#xff0c;就是OS/2子系统。 如何能模拟出不同子系统呢? 一般需要子系统用户态应用程序和相关DLL支援。 对于W…

无法正常进入Windows也能开启Windows内核调试

1 背景 Windows的启动的早期阶段&#xff0c;大致分为3步&#xff1a;bootmgr&#xff0c;winload&#xff0c;nt内核加载。 下图是Winload阶段的一个报错。 如果出现Windowslogo&#xff0c;一般就是进入nt内核加载了。 我们经常开的调试功能是nt内核加载后的调试。无法调试…

windows内核开发学习笔记二十四:windows内核架构

从上图上可以看出&#xff0c;windows内核主要层次划分为三个层次&#xff0c;以及windows子系统、文件系统、网络、设备驱动程序等几个部分。 硬件抽象层&#xff08;Hardware Abstraction Layer&#xff0c;简称HAL&#xff09;&#xff1a;主要是把所有与硬件相关联的代码隔…

Windows内核--内核空间和用户空间(3.6)

内核喜欢抽象出句柄给用户空间 句柄, Handle, 表达处理、控制之意。内核不会直接暴露指针给用户空间&#xff0c;这样会增大内核风险。相反&#xff0c;内核抽象出Handle给用户态&#xff0c;不管是文件、进程、线程等对象&#xff0c;通过Handle可以隐藏内核细节&#xff0c;统…

Windows内核基础之权限级别

权限级别是CPU中的一个概念&#xff0c;CPU中包含4个权限级别&#xff0c;分别是0环&#xff0c;1环&#xff0c;2环&#xff0c;3环&#xff0c;CPU设计制造商最初希望0环用于运行内核&#xff0c;1环和2环运行设备驱动&#xff0c;3环运行应用程序&#xff0c;但是系统设计者…

Windows内核--调试内核源代码(1.5)

Kernel编译和普通应用程序编译有差异吗&#xff1f; 最终Kernel二进制档是给CPU执行的&#xff0c;只要用普通的C编译器能正常编译出给CPU执行的二进制程序即可&#xff0c;从编译角度&#xff0c;内核和应用程序无差别。Windows内核是exe文件。 内核与用户应用程序运行环境有…

Windows内核驱动Hook入门

文章目录 Hook框架选择基于微软规范的框架微软规范以外的框架简单介绍一下InfinityHook 获取内核中的函数地址内核中导出的函数内核未导出的函数获取 SSDT ShadowSSDT 地址获取系统服务号手动获取获取并判断系统版本 代码自动获取 获取GUI相关的函数地址&#xff0c;还需附加GU…

Windows内核编程(二)-第一个内核程序

第一个内核程序 通过 Visual Studio新建工程 注意事项&#xff1a; 大部分widnows驱动程序都是内核驱动(Kernel Driver)&#xff0c;所以本笔记不分"驱动程序"与"内核编程"&#xff0c;也不区分"内核模块"(Kernel Module)、“驱动程序”(Drive…

Windows内核原理与实现之Windows研究内核(WRK)

Windows并非一个开放源码的操作系统&#xff0c;但正如上一章所提&#xff0c;Microsoft开放了一份以Windows XP x64和Windows Server 2003 SP1为基础的内核源代码&#xff0c;它可以编译和运行&#xff0c;作为教育科研机构的教学实践和研究的平台使用&#xff0c;称为WRK&…

Windows内核结构

Windows内核结构 第一篇博客&#xff0c;随便写下练练手:) Windows内核总共分为三层&#xff1a; 与硬件直接打交道的这一层叫做硬件抽象层简称HAL&#xff0c;这一层的用意就是把所有与硬件相关联的代码逻辑隔离到一个专门的模块中&#xff0c;从而做到尽可能的独立于硬件平…

WINDOWS内核对象及其理解

一&#xff0e;前言 Windows中有很多像进程对象、线程对象、文件对象等等这样的对象&#xff0c;我们称之为Windows内核对象。内核对象是系统地址空间中的一个内存块&#xff0c;由系统创建并维护&#xff0c;这个内存对象是一个数据结构&#xff0c;维护着与对象相关的信息&a…

windows内核——基石

友链 内存布局 用户内存空间和内核内存空间之间的gap是为了避免不经意的越界而导致安全问题 CPU的初始化 系统启动期间&#xff0c;会对所有的处理器进行初始化操作 大部分初始化操作我们都不必了解&#xff0c;因为你了不了解都不影响你的逆向&#xff0c;毕竟你又不是开发…