小蜗牛 发表于 2025-9-27 00:12:03

文件_是否数字签名

<火山程序 类型 = "通常" 版本 = 1 />

方法 文件_是否数字签名 <公开 静态 类型 = 逻辑型 @禁止流程检查 = 真 @视窗.外部头文件 = "<windows.h>" @视窗.外部头文件 = "<softpub.h>"
      @视窗.外部头文件 = "<wincrypt.h>" @视窗.外部头文件 = "<wintrust.h>" @视窗.外部头文件 = "<iostream>"
      @视窗.外部库 = "Crypt32.lib" @视窗.外部库 = "WinTrust.lib" "">
参数 文件路径 <类型 = 文本型 注释 = "dll || exe" 注释 = "如果为空,则检查自身~" @默认值 = "">
参数 是否验证证书链 <类型 = 逻辑型 @默认值 = 假>
参数 是否检查吊销 <类型 = 逻辑型 @默认值 = 假>
{
    常量 WTD_ALLOW_PEOPLE_CERT <类型 = 长整数 值 = 0x00000040>
    变量 文件 <类型 = 文本型>
    文件 = 选择 (文本是否为空 (文件路径), 取运行目录 () + 取执行文件名 (), 文件路径)
    @   GUID policyGUID = WINTRUST_ACTION_GENERIC_VERIFY_V2;
    @
    @   WINTRUST_FILE_INFO fileInfo = { sizeof(fileInfo) };
    @   fileInfo.pcwszFilePath = @<文件>;
    @
    @   WINTRUST_DATA trustData = { sizeof(trustData) };
    @   trustData.dwUIChoice          = WTD_UI_NONE;
    @   trustData.dwUnionChoice       = WTD_CHOICE_FILE;
    @   trustData.pFile               = &fileInfo;
    @   trustData.dwStateAction       = WTD_STATEACTION_VERIFY;
    @
    @   // 关键:根据参数决定吊销检查强度
    @   if (@<是否检查吊销>)
    @         trustData.fdwRevocationChecks = WTD_REVOKE_WHOLECHAIN;// 链+吊销
    @   else
    @         trustData.fdwRevocationChecks = WTD_REVOKE_NONE;      // 不查吊销
    @
    @   // 如果需要"只看有没有签名",可以把下面整句注释掉;若想强制完整链验证,则保持默认即可.
    @   if (!@<是否验证证书链>)
    @   {
    @         // 允许自签/不受信任根也能返回 SUCCESS,只要哈希对
    @         trustData.dwProvFlags |= @<WTD_ALLOW_PEOPLE_CERT>;
    @   }
    @
    @   LONG status = WinVerifyTrust(static_cast<HWND>(INVALID_HANDLE_VALUE),&policyGUID,&trustData);
    @
    @   // 清理
    @   trustData.dwStateAction = WTD_STATEACTION_CLOSE;
    @   WinVerifyTrust(static_cast<HWND>(INVALID_HANDLE_VALUE), &policyGUID, &trustData);
    @
    @   return status == ERROR_SUCCESS;
}


页: [1]
查看完整版本: 文件_是否数字签名