目标: 用户一键使用: 驱动加载(将驱动的安装、启动、停止、卸载的服务放到R3程序中来实现,作为可发布程序使用) 通过驱动的control回调函数和控制码来实现通讯 0x01 项目管理 环境整理: 创建一个空白项目,主要是为了用空白项目的解决方案 把Ring3和驱动加入到解决方案,环境里删掉刚创建的空白项目即可,就不用频繁的切换环境 把Ring3和驱动的输出都放到bin目录下(两个都需要设置),便于实验 整理后的效果 0x02 实验验证: 创建服务 2.1 验证过程 Ring3.cpp #include <stdio.h> #include <windows.h> /* 如果没有R3得程序怎么加载呢? 微软有个inf文件,这个东西可以安装,在微软的官方文档中有说明inf内容怎么写; OS会解析inf这个配置文件,帮助动态加载驱动 例: 如果硬件需要开机启动加载,微软再开机时会自动加载inf文件 驱动加载的方式: 1. inf文件来加载 2. 动态加载(服务) 创建服务就是安装驱动(很多软件都可以使用打印机,那么就可调用打印机的驱动,驱动的角色是服务),也就是需要4个api就可以完成这些工作; 创建服务 启动服务 停止服务 卸载服务 */ void showErr(const char *name) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastE…
验证环境/使用工具: visual studio 2019、Windows XP、winobj、Dbjview 验证目标: 让R3和R0能通过读写交换数据,也就是驱动和R3做交互过程(NT框架包含了这个交互) 内核API(极简进化史): 系统 => 抽象驱动 => 硬件 抽象驱动是什么? 1). 简明:驱动框架 => 读、写操作 => 硬件 2).详细(进一步思考:文件的抽象,操作文件):驱动框架 => 文件(打开、读取、写入、控制、查询信息、关闭) 下发配置: 应用程序 => ReadFile => 系统 => 驱动::读取 => 厂家驱动 => 硬件 获取信息: 应用程序 <= ReadFile <= 系统 <= 驱动::读取 <= 厂家驱动 <= 硬件 糟糕,出师不利,出现了一点点点的问题: 整理代码之后,不知道为什么,vs2019中driverentry 的结构体死活打不开,要看里面的成员啊。 解决方案: 经过一番设置之后,还是不行,重新创建个项目试下,果然还得是重新创建项目,项目正常了。果然还得是老话:“重装系统能够解决99.9%的问题” 两步走计划: 注册派遣函数 驱动绑定到 "设备",来调用驱动 完成R3和R0的数据交互 0x01 注册派遣函数 sample.h #pragma once #include <ntddk.h> VOID Unload(__in struct _DRIVER_OBJECT* DriverObject); extern "C" NTSTATUS …
win7、win8、win9、win11 配置双机调试环境 1、管理员运行cmd 2、拷贝一份 再修改 3、bcdedit命令 查看就多了一个开机启动项 4、给创建的启动项配置打开debug模式 5、 bcdedit 命令查看,debug打开了 6、配置波特率和串口 敲命令行 bcdedit /dbgsettings /? 在提示信息里直接拷贝 7、配置串口 同时删除打印机(这个会影响调试) windbg也要配置相同的串口和波特率 8、重启虚拟机,选择第二个 debug 9、连接成功 参考: [1]. 科锐逆向机构 [2]. win7双机调试环境搭建