吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5589|回复: 0
收起左侧

[其他转载] 【转载】微软数字签名验证的代码

[复制链接]
Hmily 发表于 2009-12-28 17:57
BOOL CheckFileTrust( LPCWSTR lpFileName )    
{    
    BOOL bRet = FALSE;    
    WINTRUST_DATA wd = { 0 };    
    WINTRUST_FILE_INFO wfi = { 0 };    
    WINTRUST_CATALOG_INFO wci = { 0 };    
    CATALOG_INFO ci = { 0 };    
   
    HCATADMIN hCatAdmin = NULL;    
    if ( !CryptCATAdminAcquireContext( &hCatAdmin, NULL, 0 ) )    
    {    
        return FALSE;    
    }    
   
    HANDLE hFile = CreateFileW( lpFileName, GENERIC_READ, FILE_SHARE_READ,    
        NULL, OPEN_EXISTING, 0, NULL );    
    if ( INVALID_HANDLE_VALUE == hFile )    
    {    
        CryptCATAdminReleaseContext( hCatAdmin, 0 );    
        return FALSE;    
    }    
   
    DWORD dwCnt = 100;    
    BYTE byHash[100];    
    CryptCATAdminCalcHashFromFileHandle( hFile, &dwCnt, byHash, 0 );    
    CloseHandle( hFile );    
   
    LPWSTR pszMemberTag = new WCHAR[dwCnt * 2 + 1];    
    for ( DWORD dw = 0; dw < dwCnt; ++dw )    
    {    
        wsprintfW( &pszMemberTag[dw * 2], L"%02X", byHash[dw] );    
    }    
   
    HCATINFO hCatInfo = CryptCATAdminEnumCatalogFromHash( hCatAdmin,    
        byHash, dwCnt, 0, NULL );    
    if ( NULL == hCatInfo )    
    {    
        wfi.cbStruct       = sizeof( WINTRUST_FILE_INFO );    
        wfi.pcwszFilePath = lpFileName;    
        wfi.hFile          = NULL;    
        wfi.pgKnownSubject = NULL;    
   
        wd.cbStruct            = sizeof( WINTRUST_DATA );    
        wd.dwUnionChoice       = WTD_CHOICE_FILE;    
        wd.pFile               = &wfi;    
        wd.dwUIChoice          = WTD_UI_NONE;    
        wd.fdwRevocationChecks = WTD_REVOKE_NONE;    
        wd.dwStateAction       = WTD_STATEACTION_IGNORE;    
        wd.dwProvFlags         = WTD_SAFER_FLAG;    
        wd.hWVTStateData       = NULL;    
        wd.pwszURLReference    = NULL;    
    }    
    else   
    {    
        CryptCATCatalogInfoFromContext( hCatInfo, &ci, 0 );    
        wci.cbStruct             = sizeof( WINTRUST_CATALOG_INFO );    
        wci.pcwszCatalogFilePath = ci.wszCatalogFile;    
        wci.pcwszMemberFilePath = lpFileName;    
        wci.pcwszMemberTag       = pszMemberTag;    
   
        wd.cbStruct            = sizeof( WINTRUST_DATA );    
        wd.dwUnionChoice       = WTD_CHOICE_CATALOG;    
        wd.pCatalog            = &wci;    
        wd.dwUIChoice          = WTD_UI_NONE;    
        wd.fdwRevocationChecks = WTD_STATEACTION_VERIFY;    
        wd.dwProvFlags         = 0;    
        wd.hWVTStateData       = NULL;    
        wd.pwszURLReference    = NULL;    
    }    
    GUID action = WINTRUST_ACTION_GENERIC_VERIFY_V2;    
    HRESULT hr = WinVerifyTrust( NULL, &action, &wd );    
    bRet        = SUCCEEDED( hr );    
   
    if ( NULL != hCatInfo )    
    {    
        CryptCATAdminReleaseCatalogContext( hCatAdmin, hCatInfo, 0 );    
    }    
    CryptCATAdminReleaseContext( hCatAdmin, 0 ); 
    delete[] pszMemberTag;    
    return bRet;    
}  
这段代码是在一个老外的论坛上不经意搜索到的,一个貌似德国人(因为他的注释不是英文写的,德国亦仅猜测尔,西班牙、葡萄牙、法兰西、俄罗斯亦都有可能)写的Delphi代码,其中使用了WinTrust.dll中的导出函数。使用VS2005的朋友们可以包含WinTrust.h、SoftPub.h和Mscat.h,并添加导入库WinTrust.lib;使用VC6的朋友们可以参考MSDN上的函数及结构体声明,并用函数指针进行调用。

免费评分

参与人数 1热心值 +1 收起 理由
学霸 + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-17 04:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表