递归火山软件开发平台

标题: 文件_是否数字签名 [打印本页]

作者: 小蜗牛    时间: 2025-9-27 00:12
标题: 文件_是否数字签名
<火山程序 类型 = "通常" 版本 = 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;
}







欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4