You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinVerifyTrust校验部分系统DLL时挂起或崩溃问题求助

修复WinVerifyTrust校验系统DLL时的挂起与崩溃问题

问题背景

调用WinVerifyTrust校验部分系统DLL时出现无限挂起,甚至触发read access violation at 0x0000000000E600E2崩溃,涉及DLL包括:

  • C:\WINDOWS\System32\clbcatq.dll
  • C:\WINDOWS\SYSTEM32\CoreUIComponents.dll
  • C:\WINDOWS\system32\schannel.DLL
  • C:\WINDOWS\system32\wbem\fastprox.dll
  • C:\WINDOWS\SYSTEM32\ncrypt.dll
  • C:\WINDOWS\SYSTEM32\DEVOBJ.dll

环境为Windows 11 24H2,基于C++11开发,Visual Studio 2022社区版编译Debug/Release版本均复现,有无调试器、管理员/普通用户权限不影响问题出现。调用代码如下:

#include <tchar.h>
#include <windows.h>
#include <Softpub.h>
#include <wincrypt.h>
#include <wintrust.h>
#include <mscat.h>

#pragma comment (lib, "wintrust")
#pragma comment (lib, "Crypt32")

#define ENCODING (X509_ASN_ENCODING | PKCS_7_ASN_ENCODING)

BOOL Authenticode::VerifyEmbeddedSignature(LPCWSTR filePath)
{
    WINTRUST_FILE_INFO fileData;
    WINTRUST_DATA winTrustData;
    GUID actionGUID = WINTRUST_ACTION_GENERIC_VERIFY_V2;

    memset(&fileData, 0, sizeof(fileData));
    fileData.cbStruct = sizeof(WINTRUST_FILE_INFO);
    fileData.pcwszFilePath = filePath;

    memset(&winTrustData, 0, sizeof(winTrustData));
    winTrustData.cbStruct = sizeof(WINTRUST_DATA);
    winTrustData.dwUIChoice = WTD_UI_NONE;
    winTrustData.fdwRevocationChecks = WTD_REVOKE_NONE;
    winTrustData.dwUnionChoice = WTD_CHOICE_FILE;
    winTrustData.pFile = &fileData;
    winTrustData.dwStateAction = WTD_STATEACTION_VERIFY;

    LONG status = 0;

    status = WinVerifyTrust(NULL, &actionGUID, &winTrustData);
    // crashes/hang here
}

修复与规避方案

1. 补充WINTRUST_DATA必要参数与清理逻辑

现有代码缺少关键参数设置和校验后的状态清理,可能引发资源泄漏或内部状态异常。修改代码如下:

BOOL Authenticode::VerifyEmbeddedSignature(LPCWSTR filePath)
{
    WINTRUST_FILE_INFO fileData;
    WINTRUST_DATA winTrustData;
    GUID actionGUID = WINTRUST_ACTION_GENERIC_VERIFY_V2;

    memset(&fileData, 0, sizeof(fileData));
    fileData.cbStruct = sizeof(WINTRUST_FILE_INFO);
    fileData.pcwszFilePath = filePath;

    memset(&winTrustData, 0, sizeof(winTrustData));
    winTrustData.cbStruct = sizeof(WINTRUST_DATA);
    winTrustData.dwUIChoice = WTD_UI_NONE;
    winTrustData.fdwRevocationChecks = WTD_REVOKE_NONE;
    winTrustData.dwUnionChoice = WTD_CHOICE_FILE;
    winTrustData.pFile = &fileData;
    winTrustData.dwStateAction = WTD_STATEACTION_VERIFY;
    // 添加关键标记:禁用网络吊销检查,避免因网络请求挂起
    winTrustData.dwFlags = WTD_REVOCATION_CHECK_NONE | WTD_CACHE_ONLY_URL_RETRIEVAL;
    winTrustData.hWVTStateData = NULL;
    winTrustData.pwszURLReference = NULL;

    LONG status = WinVerifyTrust(NULL, &actionGUID, &winTrustData);

    // 必须执行状态清理,避免资源泄漏
    winTrustData.dwStateAction = WTD_STATEACTION_CLOSE;
    WinVerifyTrust(NULL, &actionGUID, &winTrustData);

    return status == ERROR_SUCCESS;
}

2. 已知问题DLL黑名单

针对Windows 11 24H2,以下系统DLL在调用WinVerifyTrust时易触发异常,可直接加入黑名单跳过校验:

  • clbcatq.dll:组件类别库,签名校验易触发内部死锁
  • CoreUIComponents.dll:UI组件库,存在签名校验兼容性问题
  • fastprox.dll:WMI快速代理,校验时易引发资源访问冲突
  • DEVOBJ.dll:设备对象管理库,部分版本签名结构特殊导致崩溃

3. 执行上下文优化

  • 避免在DLL加载阶段调用WinVerifyTrust:部分系统DLL自身依赖未完全初始化,校验时会触发递归加载死锁
  • 用独立线程+超时机制:给每个校验任务分配单独线程,设置5-10秒超时,超时则终止任务并标记为可疑

替代方案

1. 使用SignTool命令行工具校验

通过调用系统自带的signtool工具执行校验,避免直接调用WinVerifyTrust的兼容性问题:

BOOL VerifyWithSignTool(LPCWSTR filePath)
{
    WCHAR cmdLine[MAX_PATH * 2] = {0};
    swprintf_s(cmdLine, L"signtool verify /pa /q \"%ls\"", filePath);
    
    STARTUPINFO si = {sizeof(si)};
    PROCESS_INFORMATION pi = {0};
    if (!CreateProcess(NULL, cmdLine, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi))
        return FALSE;
    
    WaitForSingleObject(pi.hProcess, 5000); // 5秒超时
    DWORD exitCode;
    GetExitCodeProcess(pi.hProcess, &exitCode);
    
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    
    return exitCode == 0;
}

注:需确保系统目录下存在signtool.exe(Windows SDK自带)。

2. 哈希对比校验

预先获取系统DLL的官方哈希值(可通过Windows Update或微软官方文档获取),直接计算文件哈希进行对比,完全绕过签名校验接口。


内容的提问来源于stack exchange,提问作者tux lu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 06:57:33