searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Windows驱动开发入门

2024-04-30 02:34:45
28
0

总体概述

最近在研究ARP欺骗在终端测的检测防御,大体是首先捕获ARP协议并做深度解析,然后可以根据检测结果决策ARP包的丢弃与放行。联想到的方案是驱动编程,在内核驱动挂钩函数,对每包返回动作通知内核执行。由于未开发过驱动,也没在windows下工程化编码过业务项目,需要从0到1完成驱动的编码实践。下面是记录入门过程。

备注:后期了解到WFP支持应用层编码过滤网络数据,目前了解中。

环境准备

编译型语言开发,至少需要准备编译工具和SDK,windows下驱动开发对应是Visual studio,Windows SDK,Windows WDK。

备注:开发和运行环境为  Windows 10, X64

当前Visual studio最新免费版是 #Visual Studio Community 2022#,搜索引擎直接关键字查询,跳转微软官网下载即可。

安装 Visual Studio 2022 时,选择“ 使用 C++ 的桌面开发 ”工作负载,然后在“单个组件”下添加:

  • MSVC v143 - VS 2022 C++ x64/x86 Spectre 缓解库(最新版本)
  • 适用于具有 Spectre 缓解功能的最新 v143 生成工具的 C++ ATL (x86 & x64)
  • 适用于具有 Spectre 缓解措施的最新 v143 生成工具的 C++ MFC (x86 & x64)

备注:如未勾选,编译驱动时告警#找不到缓解库#,由于只需要支持X64,所以未勾选ARM下的库,减少空间占用和加快安装速度。该库主要是缓解CPU硬件漏洞用。当然该告警可以通过配置编译器忽略绕过,虽然不建议这么做。

Visual Studio Community 2022对应SDK版本是#Windows SDK 10.0.22621#,同理搜索引擎直接关键字查询,跳转微软官网下载。

备注:Visual Studio Community 2022自带SDK,安装时默认勾选。也可在安装时通过选择“ 使用 C++ 的桌面开发 ”工作负载,查看右侧选项栏是否已勾选,未勾选手动勾选上即可。

驱动开发额外需要安装WDK,参考SDK的手动下载安装方式。

备注:Visual Studio Community 2022自带WDK,另外需要注意的是,手动安装时,WDK版本和SDK版本要一致。

开发编译

语言入门开发,三步走:(1)入口函数  (2)依赖包含 (3)信息输出

Windows驱动入口函数是

NTSTATUS DriverEntry(PDRIVER_OBJECT driverobj, PUNICODE_STRING unistr),信息输出可使用 
DbgPrint 和 TraceEvent,而依赖包含,基本样例里只需要 
#include <ntddk.h>即可
以下是简单代码示例
#include<ntddk.h>

void unloaddrv(PDRIVER_OBJECT driverobj)
{
    if (driverobj != NULL)
    { 
        DbgPrint("drvtest: driver unload function.");
    }
}

NTSTATUS DriverEntry(PDRIVER_OBJECT driverobj, PUNICODE_STRING unistr)
{
    if(unistr != NULL)
    {
        DbgPrint("drvtest: driver entry function.");
    }
    if(driverobj != NULL)
    {
        driverobj->DriverUnload = unloaddrv;
    }
    return STATUS_SUCCESS;
}

备注:新建项目->创建源文件->生成解决方案 即可出来驱动文件 xx.sys

功能测试

驱动测试,自己找到两种加载验证方式 : 方式1,创建服务-启动服务-停止服务-卸载服务,查看日志确认 ;方式2,第三方工具加载驱动,启动驱动-停止驱动-卸载驱动,查看日志确认。两种方式都需要通过日志工具查日志看驱动的运行状态。

工具及下载:

日志查看工具,debugview,微软官网下载,找不到路径可借助搜索引擎。驱动管理三方工具,driverMonitor,我是通过github个人项目下载,通过搜索#github  windows_kernel_driver_learn_note#得到。由于第三方工具的潜在风险性,测试用的是方式1。

测试步骤:

(1) 打开日志工具,debugview, 设置勾选 Caprure->Capture Kernel && Enabel Verbose Kernel Output

(2) 管理员权限打开cmd->sc create drvtest  binPath= "path\xx.sys" type= kernel->sc start drvtest->sc stop drvtest->sc delete drvtest

备注:windows只加载有效签名的驱动,测试环境可通过配置禁用windows驱动签名验证绕过(设置->更新和安全->恢复->立即重新启动->疑难解答->高级选项->启动设置->F7)

参考文献

[] 微软#下载 Windows 驱动程序工具包#

[] bilibili #4 2023零基础开发驱动之自制驱动管理器(上)#

0条评论
0 / 1000
刘****成
15文章数
0粉丝数
刘****成
15 文章 | 0 粉丝
原创

Windows驱动开发入门

2024-04-30 02:34:45
28
0

总体概述

最近在研究ARP欺骗在终端测的检测防御,大体是首先捕获ARP协议并做深度解析,然后可以根据检测结果决策ARP包的丢弃与放行。联想到的方案是驱动编程,在内核驱动挂钩函数,对每包返回动作通知内核执行。由于未开发过驱动,也没在windows下工程化编码过业务项目,需要从0到1完成驱动的编码实践。下面是记录入门过程。

备注:后期了解到WFP支持应用层编码过滤网络数据,目前了解中。

环境准备

编译型语言开发,至少需要准备编译工具和SDK,windows下驱动开发对应是Visual studio,Windows SDK,Windows WDK。

备注:开发和运行环境为  Windows 10, X64

当前Visual studio最新免费版是 #Visual Studio Community 2022#,搜索引擎直接关键字查询,跳转微软官网下载即可。

安装 Visual Studio 2022 时,选择“ 使用 C++ 的桌面开发 ”工作负载,然后在“单个组件”下添加:

  • MSVC v143 - VS 2022 C++ x64/x86 Spectre 缓解库(最新版本)
  • 适用于具有 Spectre 缓解功能的最新 v143 生成工具的 C++ ATL (x86 & x64)
  • 适用于具有 Spectre 缓解措施的最新 v143 生成工具的 C++ MFC (x86 & x64)

备注:如未勾选,编译驱动时告警#找不到缓解库#,由于只需要支持X64,所以未勾选ARM下的库,减少空间占用和加快安装速度。该库主要是缓解CPU硬件漏洞用。当然该告警可以通过配置编译器忽略绕过,虽然不建议这么做。

Visual Studio Community 2022对应SDK版本是#Windows SDK 10.0.22621#,同理搜索引擎直接关键字查询,跳转微软官网下载。

备注:Visual Studio Community 2022自带SDK,安装时默认勾选。也可在安装时通过选择“ 使用 C++ 的桌面开发 ”工作负载,查看右侧选项栏是否已勾选,未勾选手动勾选上即可。

驱动开发额外需要安装WDK,参考SDK的手动下载安装方式。

备注:Visual Studio Community 2022自带WDK,另外需要注意的是,手动安装时,WDK版本和SDK版本要一致。

开发编译

语言入门开发,三步走:(1)入口函数  (2)依赖包含 (3)信息输出

Windows驱动入口函数是

NTSTATUS DriverEntry(PDRIVER_OBJECT driverobj, PUNICODE_STRING unistr),信息输出可使用 
DbgPrint 和 TraceEvent,而依赖包含,基本样例里只需要 
#include <ntddk.h>即可
以下是简单代码示例
#include<ntddk.h>

void unloaddrv(PDRIVER_OBJECT driverobj)
{
    if (driverobj != NULL)
    { 
        DbgPrint("drvtest: driver unload function.");
    }
}

NTSTATUS DriverEntry(PDRIVER_OBJECT driverobj, PUNICODE_STRING unistr)
{
    if(unistr != NULL)
    {
        DbgPrint("drvtest: driver entry function.");
    }
    if(driverobj != NULL)
    {
        driverobj->DriverUnload = unloaddrv;
    }
    return STATUS_SUCCESS;
}

备注:新建项目->创建源文件->生成解决方案 即可出来驱动文件 xx.sys

功能测试

驱动测试,自己找到两种加载验证方式 : 方式1,创建服务-启动服务-停止服务-卸载服务,查看日志确认 ;方式2,第三方工具加载驱动,启动驱动-停止驱动-卸载驱动,查看日志确认。两种方式都需要通过日志工具查日志看驱动的运行状态。

工具及下载:

日志查看工具,debugview,微软官网下载,找不到路径可借助搜索引擎。驱动管理三方工具,driverMonitor,我是通过github个人项目下载,通过搜索#github  windows_kernel_driver_learn_note#得到。由于第三方工具的潜在风险性,测试用的是方式1。

测试步骤:

(1) 打开日志工具,debugview, 设置勾选 Caprure->Capture Kernel && Enabel Verbose Kernel Output

(2) 管理员权限打开cmd->sc create drvtest  binPath= "path\xx.sys" type= kernel->sc start drvtest->sc stop drvtest->sc delete drvtest

备注:windows只加载有效签名的驱动,测试环境可通过配置禁用windows驱动签名验证绕过(设置->更新和安全->恢复->立即重新启动->疑难解答->高级选项->启动设置->F7)

参考文献

[] 微软#下载 Windows 驱动程序工具包#

[] bilibili #4 2023零基础开发驱动之自制驱动管理器(上)#

文章来自个人专栏
信息安全
15 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
1
0