|
<火山程序 类型 = "通常" 版本 = 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;
}
|
|