说明网
电脑网络 1 个回答

使用C++ Hook CreateFile API时,如何过滤并仅拦截对\\.\PHYSICALDRIVE0设备的访问请求?

树仔 提问者

发布于 2026-10-19

问题补充

在Hook CreateFile或CreateFileW时,通过比较lpFileName参数与设备路径字符串即可实现过滤。需注意ANSI与Unicode版本差异及路径格式规范。

1 个回答

按发布时间排序
拖车文 回答者

回答于 2026-10-19

在Hook CreateFileA 或 CreateFileW 的回调函数中,直接判断传入的文件名参数是否等于目标设备路径,相等则执行拦截逻辑,否则调用原始API。

实现步骤

  1. 安装Hook:使用Inline Hook、IAT Hook或Detours等框架挂钩 CreateFileA 和 CreateFileW。
  2. 编写过滤逻辑:在自定义的Hook函数中,将 lpFileName 参数与 "\\\\.\\PHYSICALDRIVE0"(ANSI)或 L"\\\\.\\PHYSICALDRIVE0"(Unicode)进行比较。
  3. 条件放行:匹配成功时执行自定义处理;不匹配时直接调用保存的原始函数指针,保持正常行为。

代码示例

// 以 Hook CreateFileW 为例
HANDLE WINAPI MyCreateFileW(
    LPCWSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile)
{
    if (lpFileName != nullptr && 
        _wcsicmp(lpFileName, L"\\\\.\\PHYSICALDRIVE0") == 0) {
        // 命中目标设备,执行拦截或记录逻辑
        // 可选择拒绝访问:SetLastError(ERROR_ACCESS_DENIED); return INVALID_HANDLE_VALUE;
    }

    // 非目标路径,调用原始函数
    return OriginalCreateFileW(lpFileName, dwDesiredAccess, dwShareMode,
                               lpSecurityAttributes, dwCreationDisposition,
                               dwFlagsAndAttributes, hTemplateFile);
}

判断依据

  • Windows设备路径以 \\.\ 开头,在C/C++字符串字面量中反斜杠需转义,因此写作 \\\\.\\。
  • 使用 _wcsicmp / _stricmp 进行大小写不敏感比较,避免调用方大小写不一致导致漏判。

适用条件

  • 用户态Hook仅能拦截当前注入进程或通过全局注入覆盖的进程的调用。
  • 若需系统级拦截所有进程对该物理磁盘的访问,应考虑内核态Minifilter驱动或设备对象过滤驱动。

常见误区

  • 忽略A/W版本:只Hook了 CreateFileW 而遗漏 CreateFileA,会导致ANSI调用绕过拦截。
  • 空指针未校验:未检查 lpFileName 是否为 nullptr 就直接比较,可能引发访问违规。
  • 路径变体:部分程序可能使用 \\?\ 前缀或DOS设备名,需根据实际场景扩展匹配规则。
  • 转义错误:字符串中少写反斜杠导致实际比较值不是 \\.\PHYSICALDRIVE0。

内容由网友提供,仅供参考。