当前位置: 首页 > news >正文

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结构中保留符号表位置
在这里插入图片描述

参考

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

win10关闭驱动数字签名

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

微软签名概述

spectre 漏洞文档

BCDEdit 调试开关

BCDEdit 调试配置

相关文章:

  • F450无人机组装与调试
  • Dubbo:@DubboService和@Service、@DubboReference和@Reference的区别和关系
  • Vue2:使用Vant UI实现网易云评论页上拉和下拉刷新
  • 公众号查题接口系统调用
  • 用servlet写一个hello word
  • myj的补作业计划HrbustOJ新生赛(struct+优先队列)
  • canal的入门与使用
  • 病毒营销增长策略:Facebook和 Airbnb的5个病毒传播方法
  • C++:特殊类设计
  • Spring如何记忆
  • 材料科学基础学习指导-吕宇鹏-名词和术语解释-第二章晶体缺陷
  • 线段树2----简单拓展
  • 【学姐面试宝典】前端基础篇Ⅳ(JavaScript)
  • 本地JAR文件作为Gradle依赖项
  • Linux软件安装的4种方式
  • Angular 响应式表单之下拉框
  • Apache的基本使用
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • java8-模拟hadoop
  • JavaScript创建对象的四种方式
  • Java多态
  • java概述
  • leetcode-27. Remove Element
  • SAP云平台里Global Account和Sub Account的关系
  • Service Worker
  • Terraform入门 - 3. 变更基础设施
  • WePY 在小程序性能调优上做出的探究
  • 阿里云应用高可用服务公测发布
  • 测试开发系类之接口自动化测试
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 如何实现 font-size 的响应式
  • 正则表达式小结
  • 7行Python代码的人脸识别
  • Java性能优化之JVM GC(垃圾回收机制)
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 说说我为什么看好Spring Cloud Alibaba
  • ​secrets --- 生成管理密码的安全随机数​
  • ​马来语翻译中文去哪比较好?
  • #laravel 通过手动安装依赖PHPExcel#
  • #QT(串口助手-界面)
  • (1)(1.13) SiK无线电高级配置(六)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (规划)24届春招和25届暑假实习路线准备规划
  • (全注解开发)学习Spring-MVC的第三天
  • (五)关系数据库标准语言SQL
  • (一)80c52学习之旅-起始篇
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)