永发信息网

验证PE文件数字签名是否有效

答案:1  悬赏:70  手机版
解决时间 2021-02-18 18:53
验证PE文件数字签名是否有效
最佳答案
真接上源码

//-------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Example of verifying the embedded signature of a PE file by using 
// the WinVerifyTrust function.
#define _UNICODE 1
#define UNICODE 1
#include 
#include 
#include 
#include 
#include 
#include 
#include 
// Link with the Wintrust.lib file.
#pragma comment (lib, "wintrust")
BOOL VerifyEmbeddedSignature(LPCWSTR pwszSourceFile)
{
    LONG lStatus;
    DWORD dwLastError;
    // Initialize the WINTRUST_FILE_INFO structure.
    WINTRUST_FILE_INFO FileData;
    memset(&FileData, 0, sizeof(FileData));
    FileData.cbStruct = sizeof(WINTRUST_FILE_INFO);
    FileData.pcwszFilePath = pwszSourceFile;
    FileData.hFile = NULL;
    FileData.pgKnownSubject = NULL;
    
    GUID WVTPolicyGUID = WINTRUST_ACTION_GENERIC_VERIFY_V2;
    WINTRUST_DATA WinTrustData;
    // Initialize the WinVerifyTrust input data structure.
    // Default all fields to 0.
    memset(&WinTrustData, 0, sizeof(WinTrustData));
    WinTrustData.cbStruct = sizeof(WinTrustData);
    // Use default code signing EKU.
    WinTrustData.pPolicyCallbackData = NULL;
    // No data to pass to SIP.
    WinTrustData.pSIPClientData = NULL;
    // Disable WVT UI.
    WinTrustData.dwUIChoice = WTD_UI_NONE;
    // No revocation checking.
    WinTrustData.fdwRevocationChecks = WTD_REVOKE_NONE; 
    // Verify an embedded signature on a file.
    WinTrustData.dwUnionChoice = WTD_CHOICE_FILE;
    // Default verification.
    WinTrustData.dwStateAction = 0;
    // Not applicable for default verification of embedded signature.
    WinTrustData.hWVTStateData = NULL;
    // Not used.
    WinTrustData.pwszURLReference = NULL;
    // Default.
    WinTrustData.dwProvFlags = WTD_SAFER_FLAG;
    // This is not applicable if there is no UI because it changes 
    // the UI to accommodate running applications instead of 
    // installing applications.
    WinTrustData.dwUIContext = 0;
    // Set pFile.
    WinTrustData.pFile = &FileData;
    // WinVerifyTrust verifies signatures as specified by the GUID 
    // and Wintrust_Data.
    lStatus = WinVerifyTrust(
        NULL,
        &WVTPolicyGUID,
        &WinTrustData);
    switch (lStatus) 
    {
    case ERROR_SUCCESS:
        
        wprintf_s(L"The file "%s" is signed and the signature "
            L"was verified.
",
            pwszSourceFile);
        break;
    case TRUST_E_NOSIGNATURE:
        // The file was not signed or had a signature 
        // that was not valid.
        // Get the reason for no signature.
        dwLastError = GetLastError();
        if (TRUST_E_NOSIGNATURE == dwLastError ||
            TRUST_E_SUBJECT_FORM_UNKNOWN == dwLastError ||
            TRUST_E_PROVIDER_UNKNOWN == dwLastError) 
        {
            // The file was not signed.
            wprintf_s(L"The file "%s" is not signed.
",
                pwszSourceFile);
        } 
        else 
        {
            // The signature was not valid or there was an error 
            // opening the file.
            wprintf_s(L"An unknown error occurred trying to "
                L"verify the signature of the "%s" file.
",
                pwszSourceFile);
        }
        break;
    case TRUST_E_EXPLICIT_DISTRUST:
        // The hash that represents the subject or the publisher 
        // is not allowed by the admin or user.
        wprintf_s(L"The signature is present, but specifically "
            L"disallowed.
");
        break;
    case TRUST_E_SUBJECT_NOT_TRUSTED:
        // The user clicked "No" when asked to install and run.
        wprintf_s(L"The signature is present, but not "
            L"trusted.
");
        break;
    case CRYPT_E_SECURITY_SETTINGS:
        
        wprintf_s(L"CRYPT_E_SECURITY_SETTINGS - The hash "
            L"representing the subject or the publisher wasn't "
            L"explicitly trusted by the admin and admin policy "
            L"has disabled user trust. No signature, publisher "
            L"or timestamp errors.
");
        break;
    default:
        // The UI was disabled in dwUIChoice or the admin policy 
        // has disabled user trust. lStatus contains the 
        // publisher or time stamp chain error.
        wprintf_s(L"Error is: 0x%x.
",
            lStatus);
        break;
    }
    return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
    if(argc > 1)
    {
        VerifyEmbeddedSignature(argv[1]);
    }
    return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
黑貴賓犬可以吃米飯嗎?
万美玻璃装饰在什么地方啊,我要过去处理事情
房间弄隔音贴隔音毡上面用竹木纤维墙板封住可
皮肤不好像蛇皮一样有什么东西可以擦
用鸡肉怎么做养胃药膳?应该加什么药材?
铁路顶进桥涵施工,要根据现场实际情况和设计
回力蒲庙专卖店地址在哪,我要去那里办事
小孩子不戒人奶对妈妈营养有问题吗
半导体元器件无卤要求什么时间执行
怎么提高windows aero的桌面性能
情态动词 系动词 助动词有什么区别?
李大同双炊糕温州哪里有卖?
江华超市这个地址在什么地方,我要处理点事
中铁物流集团在什么地方啊,我要过去处理事情
如图是某人在一次平静呼吸中肺内气压的变化曲
推荐资讯
顺兴宾馆地址在什么地方,想过去办事
行政管理的课程有哪些
迈克尔杰克逊最好听,最经典的5首歌曲
梦见去世的妈妈追着自己跑,最后拉着我的手边
华为mate8支持快充吗?
淘宝推直通车 哪个时间段最好啊
加工一批零件,师傅单独做要12小时,徒弟单独做
男宝宝14个月,身高75cm,偏矮,怎样才能长个
一个小服装厂生产某种风衣,日销售量x(件)
每次跑步,五公里下来体力还很足,但是胃疼的
杭州颐高数码城 营业时间
老前门汤包全国连锁NO.188地址在什么地方,想
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?