资讯动态

windows 驱动实例分析系列: HidHide 驱动分析 - HidHide 篇(一)

发布时间:2026/9/13 22:08:49 来源:尧图企业网站定制
HidHide 驱动分析 - HidHide 篇一整体架构与驱动入口一、项目概述与内核驱动定位HidHide.sys 是整个 HidHide 解决方案的核心内核组件运行于 Windows 内核态基于KMDFKernel-Mode Driver Framework1.13开发兼容 Windows 10 及以上操作系统。与其他用户态工具Client/CLI/Watchdog不同驱动直接参与 HID 设备栈的 I/O 处理在 IRP 层面拦截并裁决设备访问请求是“设备隐藏”能力的实际执行者。1.1 架构位置Upper Filter Driver驱动通过修改设备类的UpperFilters注册表值附着在 HID 类驱动hidclass.sys之上。这意味着所有发往 HID 设备的IRP_MJ_CREATE请求在到达hidclass.sys前必先经过 HidHide 过滤驱动。驱动不创建物理设备对象FDO而是为每个目标设备创建过滤设备对象Filter DO。驱动利用 WDF 框架的自动 IRP 转发机制无需手动编写复杂的设备栈遍历代码。1.2 整体模块划分源文件模块职责关键接口/函数Driver.c驱动入口、WDF 驱动对象初始化、设备添加回调、卸载回调DriverEntry,EvtDriverDeviceAdd,EvtDriverUnloadDevice.c过滤设备对象创建、文件打开拦截、IRP 完成回调HidHideCreateDevice,OnDeviceFileCreateControlDevice.c控制设备\Device\HidHide创建与 IOCTL 分发HidHideControlDeviceCreate,HidHideControlDeviceEvtIoDeviceControlLogic.c核心过滤决策逻辑、进程与设备名单管理、IOCTL 具体实现OnDriverCreate,Blacklisted,Whitelisted,OnControlDeviceIoSetWhitelist等Config.c进程-镜像名映射树BST、注册表参数读写、多字符串集合管理HidHideProcessIdRegister,BstInsert,HidHideDriverGetBooleanPropertyLogging.cETWWindows 事件跟踪日志与追踪提供者注册、日志写入LogRegisterProviders,LogEvent,TraceEvent1.3 源码结构与依赖关系HidHide/ ├── resource.h // 版本资源定义 ├── stdafx.h // 预编译头包含 WDF、NTDDK、ETW 等 ├── src/ │ ├── Driver.c / Driver.h // 驱动入口层 │ ├── Device.c / Device.h // 过滤设备管理层 │ ├── ControlDevice.c / ControlDevice.h // 控制设备层 │ ├── Logic.c / Logic.h // 业务逻辑层核心 │ ├── Config.c / Config.h // 配置与进程追踪层 │ └── Logging.c / Logging.h // 日志与追踪层 └── HidHideETW.h // 消息编译器生成的 ETW 定义依赖自上而下为Driver.c→Device.c/ControlDevice.c→Logic.c→Config.cLogging.c。Logic.c作为中央枢纽协调设备拦截、控制请求处理和配置管理。二、驱动入口点Driver.c详细分析2.1 DriverEntry初始化核心DriverEntry是驱动的加载入口由 PnP 管理器在驱动加载时调用运行在 PASSIVE_LEVEL IRQL。NTSTATUSDriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING pRegistryPath){ExInitializeDriverRuntime(DrvRtPoolNxOptIn);// 启用 NX 内存池WDF_DRIVER_CONFIG_INIT(wdfDriverConfig,NULL);wdfDriverConfig.EvtDriverDeviceAddHidHideDriverEvtDeviceAdd;wdfDriverConfig.EvtDriverUnloadHidHideDriverEvtUnload;ntstatusWdfDriverCreate(pDriverObject,pRegistryPath,WDF_NO_OBJECT_ATTRIBUTES,wdfDriverConfig,wdfDriver);// 注册 ETW 提供者ntstatusLogRegisterProviders();// 调用逻辑层回调ntstatusOnDriverCreate(wdfDriver);returnntstatus;}关键步骤解析运行时初始化ExInitializeDriverRuntime(DrvRtPoolNxOptIn)启用非执行NX内存池保护增强安全性。WDF 驱动对象创建WdfDriverCreate创建框架驱动对象注册设备添加和卸载回调。由于EvtDriverDeviceAdd不为 NULL驱动有能力响应设备枚举事件。ETW 提供者注册LogRegisterProviders注册Nefarius_Hid_Hide日志和Nefarius_Drivers_HidHide追踪两个提供者为后续诊断输出奠定基础。逻辑层钩子OnDriverCreate(wdfDriver)将控制权移交给Logic.c执行 BST 自检、控制设备创建和进程监控回调注册。2.2 EvtDriverDeviceAdd设备附着回调当 PnP 管理器枚举到 HID 类设备时此回调被触发NTSTATUSHidHideDriverEvtDeviceAdd(WDFDRIVER wdfDriver,PWDFDEVICE_INIT wdfDeviceInit){returnHidHideCreateDevice(wdfDeviceInit);}该函数仅做简单转发真正的工作在Device.c的HidHideCreateDevice中完成。2.3 EvtDriverUnload卸载清理VOIDHidHideDriverEvtUnload(WDFDRIVER wdfDriver){TRACE_ALWAYS(L);LogUnregisterProviders();// 注销 ETW 提供者}此回调在驱动卸载时调用主要职责是清理 ETW 资源。注意进程监控回调PsSetCreateProcessNotifyRoutine的移除在OnSystemShutdown中处理而非在此处体现了分层设计。2.4 预编译头与宏定义stdafx.hstdafx.h包含了驱动必需的 Windows 内核头文件#includentddk.h#includeinitguid.h#includeNtstrsafe.h#includewdf.h#includewdmsec.h#includeDevpkey.h特别地它定义了CREATE_PROCESS_NOTIFY_ROUTINE和LOAD_IMAGE_NOTIFY_ROUTINE的函数原型因为某些 DDK 版本中缺失并引入了 ETW 消息文件。还定义了系统进程 PID 常量SYSTEM_PID 4用于在OnDeviceFileCreate中放行系统进程services.exe 等避免关键系统组件因驱动隐藏而无法访问设备。三、设备对象创建与管理Device.c3.1 HidHideCreateDevice过滤设备创建NTSTATUSHidHideCreateDevice(PWDFDEVICE_INIT wdfDeviceInit){WdfFdoInitSetFilter(wdfDeviceInit);// 声明为过滤驱动WDF_OBJECT_ATTRIBUTES_INIT(wdfObjectAttributes);wdfObjectAttributes.SynchronizationScopeWdfSynchronizationScopeNone;// 文件对象配置WDF_FILEOBJECT_CONFIG_INIT(wdfFileObjectConfig,OnDeviceFileCreate,NULL,OnDeviceFileCleanup);WdfDeviceInitSetFileObjectConfig(wdfDeviceInit,wdfFileObjectConfig,wdfObjectAttributes);// 创建设备WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(wdfObjectAttributes,DEVICE_CONTEXT);wdfObjectAttributes.EvtCleanupCallbackOnDeviceContextCleanup;ntstatusWdfDeviceCreate(wdfDeviceInit,wdfObjectAttributes,wdfDevice);// 创建设备接口GUIDntstatusWdfDeviceCreateDeviceInterface(wdfDevice,HidHideInterfaceGuid,NULL);// 调用逻辑层钩子ntstatusOnDeviceCreate(wdfDevice);returnSTATUS_SUCCESS;}设计亮点WdfSynchronizationScopeNone设备对象不使用框架自动同步所有请求可并发处理。这是因为过滤驱动必须尽可能减少延迟且OnDeviceFileCreate中已使用自旋锁保护关键数据结构。文件对象配置OnDeviceFileCreate是拦截的核心负责裁决每个打开的请求。设备上下文DEVICE_CONTEXT结构存储设备实例路径WDFSTRING deviceInstancePath在OnDeviceCreate中通过HidHideDeviceInstancePath获取并缓存。3.2 OnDeviceFileCreate请求拦截核心这是整个驱动最关键的函数在应用调用CreateFile时触发VOIDOnDeviceFileCreate(WDFDEVICE wdfDevice,WDFREQUEST wdfRequest,WDFFILEOBJECT wdfFileObject){// 获取进程信息processPsGetCurrentProcess();processIdPsGetCurrentProcessId();sessionIdPsGetProcessSessionId(process);// 初始化访问裁决accessDeniedFALSE;if((SYSTEM_PID!processId)(GetActive())(Blacklisted(deviceInstancePath,sessionId))){if(Whitelisted(processId,cacheHit)){// 命中白名单放行}else{accessDeniedTRUE;// 拒绝访问}}if(accessDenied){WdfRequestComplete(wdfRequest,STATUS_ACCESS_DENIED);}else{// 转发 IRP 到下层驱动WdfRequestFormatRequestUsingCurrentType(wdfRequest);WdfRequestSetCompletionRoutine(wdfRequest,OnDeviceFileCreateRequestCompletion,NULL);WdfRequestSend(wdfRequest,WdfDeviceGetIoTarget(wdfDevice),...);}}决策三元组SYSTEM_PID ! processId放行系统进程避免破坏系统关键操作。GetActive()若全局开关关闭直接放行短路优化。Blacklisted(...)设备在黑名单中。Whitelisted(...)进程在白名单中或在反转模式下不在黑名单中。转发机制请求通过WdfRequestFormatRequestUsingCurrentType和WdfRequestSend传递给下层驱动hidclass.sys。完成例程OnDeviceFileCreateRequestCompletion仅调用WdfRequestComplete传递状态。3.3 设备上下文与清理OnDeviceCreate通过HidHideDeviceInstancePath获取设备实例路径并缓存到DEVICE_CONTEXT中。OnDeviceContextCleanup在设备删除时释放该字符串并调用UpdateDataForControlDeviceDeletionAndDeleteControlDeviceWhenNeeded(-1)减少引用计数当计数归零时触发控制设备销毁。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价