总体概述
最近在研究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驱动入口函数是
#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零基础开发驱动之自制驱动管理器(上)#