Проверить подпись файла как Process Explorer
От: Аноним  
Дата: 19.10.08 15:20
Оценка: 18 (2)
#Имя: FAQ.winapi.WinVerifyTrust
>Нужен быстрый способ проверки цифровой подписи файла на Win32/64.

>Вот в Process Explorer'е и в Autoruns'е есть кнопка Verify, она как раз и делает то, что мне нужно, удовлетворяет всем 3 пунктам. Вопрос — кто-нибудь знает, как они это делают?


    bool CheckByCat(const wchar_t *pwFileName)
    {
        HANDLE hCat;
        if (!CryptCATAdminAcquireContext(&hCat, NULL, 0))
            return false;
        
        bool out = false;
        
        
        HANDLE f = CreateFile(
            pwFileName, GENERIC_READ, 
            FILE_SHARE_READ | FILE_SHARE_WRITE, 
            NULL, OPEN_EXISTING, 
            FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, 
            NULL);

    
        if (f != INVALID_HANDLE_VALUE)
        {
            BYTE hash[1024];
            DWORD cb = sizeof(hash);
            if (CryptCATAdminCalcHashFromFileHandle(f, &cb, hash, 0))
            {
                if(CryptCATAdminEnumCatalogFromHash(hCat, hash, cb, 0, 0))
                    out = true;
            }    
        }
        
        CryptCATAdminReleaseContext(hCat, 0);
        ::CloseHandle(f);
        
        return out;
    }    

    bool CheckByWinVerifyTrust(const wchar_t *pwFileName)
    {
        WINTRUST_FILE_INFO wfi={sizeof(WINTRUST_FILE_INFO), 0};
        wfi.pcwszFilePath = pwFileName;
        wfi.hFile = NULL;

        WINTRUST_DATA wtd={sizeof(WINTRUST_DATA),0};
        wtd.dwUIChoice = WTD_UI_NONE;
        wtd.fdwRevocationChecks = WTD_REVOKE_NONE;
        wtd.dwUnionChoice = WTD_CHOICE_FILE;
        wtd.pFile = &wfi;

        GUID g = WINTRUST_ACTION_GENERIC_VERIFY_V2;
        LONG r = WinVerifyTrust(NULL, &g, &wtd);
        return (r==ERROR_SUCCESS);
    }

оно?
winverifytrust
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.