windows 驱动与内核调试 学习

Posted 不会写代码的丝丽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows 驱动与内核调试 学习相关的知识,希望对你有一定的参考价值。

概述

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

驱动概述

一般驱动需要运行内核权限下运行(因为涉及硬件读取),比如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 相关串口

上述配置完成后你可用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 调试配置

以上是关于windows 驱动与内核调试 学习的主要内容,如果未能解决你的问题,请参考以下文章

windows 驱动与内核调试 学习3

windows 驱动与内核调试 学习3

windows 驱动与内核调试 学习5

windows 驱动与内核调试 学习5

windows 驱动与内核调试 学习5

windows 驱动与内核调试 学习2