拖车文
回答者
回答于 2026-10-19
在Hook CreateFileA 或 CreateFileW 的回调函数中,直接判断传入的文件名参数是否等于目标设备路径,相等则执行拦截逻辑,否则调用原始API。
实现步骤
- 安装Hook:使用Inline Hook、IAT Hook或Detours等框架挂钩
CreateFileA和CreateFileW。 - 编写过滤逻辑:在自定义的Hook函数中,将
lpFileName参数与"\\\\.\\PHYSICALDRIVE0"(ANSI)或L"\\\\.\\PHYSICALDRIVE0"(Unicode)进行比较。 - 条件放行:匹配成功时执行自定义处理;不匹配时直接调用保存的原始函数指针,保持正常行为。
代码示例
// 以 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。