概述

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

驱动概述

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

  1. windows驱动开发详解学习笔记

    1. windows驱动分两类,NT式驱动和WDM驱动,后者支持即插即用: 2. DriverEntry是入口函数,传入参数:pDriverObject由IO管理器传入: 3. WDM驱动中,AddD ...

  2. Windows驱动开发工具 WDK 学习笔记

    目标:能够把电脑当作一个集成有高性能处理器的开发板用起来,当然,还自带了一个高级的操作系统Windows(必须的).总之,就是在一个带了操作系统的高性能开发板上的驱动程序开发. 性质:纯属业余爱好 1 ...

  3. Windows驱动开发 - 内核模式下的字符串操作

    1 ASCII字符串和宽字符串 char型,记录ansi字符集.每个字符一个字节.以0标志结束.在KdPrint中用%s输出. 宽字符型,wchar_t,描述unicode字符集的字符串,每个字符两个 ...

  4. Windows Server 2008 R2 如何启动内核调试

    相信windbg大家都不陌生,其提供了一个异常强大的功能就是kernel dbg, 在不同版本的windows 系统中启动kernel dbg的方式不禁相同,为了方便大家使用kernel dbg,本文 ...

  5. Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础

    Windows驱动开发学习笔记(二)-- 驱动调试&内核编程基础 基础知识 驱动调试 PDB(Program Debug Database) WinDbg 加载 PDB 实验:调试 .sys ...

  6. Windows驱动开发学习笔记(七)—— 多核同步内核重载

    Windows驱动开发学习笔记(七)-- 多核同步 基础知识 并发与同步 分析 InterlockedIncrement 原子操作相关API 内核文件 多核同步 临界区 示例一:错误的临界区 示例二: ...

  7. Windows驱动开发学习笔记(三)—— 内核空间内核模块

    Windows驱动开发学习笔记(三)-- 内核空间&内核模块 内核空间 实验 第一步:编译如下代码 第二步:将 .sys 文件拷贝到虚拟机中 第三步:部署 .sys 文件并运行 第四步:创建一 ...

  8. Windows内核编程(三)-内核驱动运行与调试

    内核驱动运行与调试 驱动的运行 驱动的运行通过服务来实现. 微软规定,驱动文件必须经过微软的数字签名后,才可以运行在64位系统上,如果把没有经过签名的驱动直接放在64位操作系统中运行,结果是驱动加载失 ...

  9. windows驱动开发学习

    序言]  很多人都对驱动开发有兴趣,但往往找不到正确的学习方式.当然这跟驱动开发的本土化资 料少有关系.大多学的驱动开发资料都以英文为主,这样让很多驱动初学者很头疼.本人从 事驱动开发时间不长也不短, ...

最新文章

  1. 联想输入快捷键_UG软件F8快捷键和笔记本电脑F8快捷键冲突的解决方法
  2. 地址突然就不对了_【装维大课堂】光猫的无线WiFi功能突然无法使用
  3. Java 类的生命周期详解
  4. C语言中巧妙的使用#和##
  5. pytorch如何计算导数_Pytorch的自动求导机制与使用方法(一)
  6. 代理模式中的动态代理
  7. R语言在C#使用DCom中遇到的若干问题
  8. 车道识别与交通标志识别
  9. 二进制和格雷码之间的转换
  10. Kindle4rss中文rss资源推荐~
  11. 二进制加法器原理c语言,加法器电路原理图解_二进制加法器理解
  12. 给笔记本电脑外接显示器增加副屏
  13. 虚幻浏览器插件 加载透明网页
  14. FS4052】12.6v2A三节锂电池充电芯片方案
  15. 微信支付——扫码支付模式二
  16. 可以通过parallel()把顺序流转换成并行流
  17. windows mobile中区分cmwap或cmnet接入点
  18. GTA5实用载具、人物、武器、工具、脚本、地图添加
  19. SitePoint Podcast#98:矩阵发生了变化
  20. vue项目使用rem让页面字体fontsize自适应

热门文章

  1. SVM算法原理以及sklearn实例
  2. 耶鲁计算机科学专业,耶鲁大学(Yale University)计算机科学Computer Science专业排名第29位(2021年THE世界大学商科排名)...
  3. 吉林大学计算机学院课外培养,吉林大学本科课外培养计划实施细则.doc
  4. mysql bdb_MySQL在Red Hat 7.0上的BDB表配置
  5. STM32F4学习笔记(基础介绍篇)
  6. 职业生涯中对我影响最大的两个人
  7. 用java打印分形_Java分形
  8. 9. PKI - 三种密钥交换算法详解(RSA DHE ECDHE)及他们在SSL/TLS协议中的应用
  9. 【原创】通过 ioctl + FIONREAD 判定数据可读
  10. 微信模板消息推送成功 但没有内容