使用ioctlbf打开Windows设备句柄时错误码5(拒绝访问)的排查方向
问题排查:ioctlbf打开设备句柄提示“拒绝访问(错误码5)”
ioctlbf是一款Windows平台的IOCTL模糊测试工具,它通过如下代码打开目标设备句柄:
deviceHandle = CreateFile((HANDLE) deviceName, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if (deviceHandle == INVALID_HANDLE_VALUE) { printf("FAILED, error code: %d\n%s\n", GetLastError(), errorCode2String(GetLastError())); exit(1); }
目标设备的创建代码如下:
drvObj->MajorFunction[IRP_MJ_CREATE] = ...; drvObj->MajorFunction[IRP_MJ_CLOSE] = ...; drvObj->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = ...; drvObj->DriverExtension->AddDevice = ...; drvObj->DriverUnload = NULL; IoCreateDevice(drvObj, 0, &dName, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, TRUE, &devObj);
问题描述
即使在管理员控制台运行该工具,仍出现“拒绝访问,错误码5”的提示。本人不熟悉Windows驱动开发,请问应从哪些方向排查?是否与受保护进程、ACL、IoCreateDevice中的独占位有关?
已执行操作
- 以管理员控制台运行ioctlbf,初步排除普通权限问题
- 设备标记为“独占”,但通过DeviceTree确认当前句柄数为0,排除句柄占用导致的独占冲突
- 尝试过ioctlpus等其他工具,问题依旧
排查方向
- ACL权限配置:IoCreateDevice中指定了
FILE_DEVICE_SECURE_OPEN,这会让设备应用默认安全描述符,或驱动可能显式设置了严格ACL。用winobj工具查看设备的安全属性,确认当前管理员账号是否拥有打开设备的权限。 - IoCreateDevice独占参数与驱动内部校验:虽然DeviceTree显示句柄数为0,但驱动的
IRP_MJ_CREATE回调可能有自定义独占校验逻辑(比如限制特定进程打开)。可以尝试修改工具的CreateFile调用,将共享模式参数从0改为FILE_SHARE_READ | FILE_SHARE_WRITE,测试是否能正常打开;同时可以调试驱动的IRP_MJ_CREATE函数,查看返回的NTSTATUS码,确认是否是驱动主动拒绝。 - IRP_MJ_CREATE的自定义权限检查:驱动的创建回调可能做了额外校验,比如验证进程签名、是否持有特定特权(如SeLoadDriverPrivilege)、进程ID是否在白名单等,即使管理员进程也可能被拦截。通过调试器断点跟踪该回调的执行流程,查看拒绝原因。
- 受保护进程/驱动隔离:如果目标驱动是受保护内核驱动(如启用HVCI),或运行在受保护进程上下文,普通管理员进程无法打开设备句柄。可以检查驱动是否属于Windows内置受保护组件,或系统是否启用了虚拟化代码完整性。
- 设备路径正确性:确认工具传入的
deviceName格式是否正确(如\\.\DeviceName),错误路径可能导致意外的权限错误提示。 - 进程完整性级别:部分管理员控制台可能未彻底提升权限,处于中等完整性级别。尝试用
runas /user:Administrator cmd打开高权限控制台后再运行工具测试。
内容的提问来源于stack exchange,提问作者Tracy McDowell
相关产品推荐
相关产品推荐

