Программная проверка подписи файлов Майкрософта

Тема в разделе "WASM.CRYPTO", создана пользователем billi12, 18 окт 2011.

  1. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    Как сделать? Предполагаю, что без CSP не обойтись, но что делать, хз. Надо срочно, подскажите плз. Короче чет типа sigverif

    Решается все WINTRUST.dll. Он эспортирует нужные функции. Но при верификации используйте проверку не файла, а каталога...там понадобится хеш и пр.
     
  2. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
  3. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    А вот пример в своих архивах нашел:
    Код (Text):
    1. //------------------------------------------------------------------------------
    2. // Link with the Wintrust.lib file.
    3. //#pragma comment (lib, "wintrust")
    4. typedef LONG (WINAPI *TpWinVerifyTrust)(HWND hwnd,
    5.                            GUID *pgActionID,
    6.                            LPVOID pWintrustData);
    7.  
    8. TpWinVerifyTrust pWinVerifyTrust = NULL;
    9.  
    10. BOOL InitWinTrustAPI()
    11. {
    12.     HINSTANCE hLib=::LoadLibrary(L"wintrust.dll");
    13.     if(!hLib)
    14.         return FALSE;
    15.     //
    16.     pWinVerifyTrust = (TpWinVerifyTrust)GetProcAddress((HMODULE)hLib, "WinVerifyTrust");
    17.     //
    18.     if(!pWinVerifyTrust)
    19.         return FALSE;
    20.     //
    21.     return TRUE;
    22.  
    23. }
    24. //------------------------------------------------------------------------------
    25. // Helper function to display an error message
    26. LPCTSTR GetErrorStrMessage(DWORD dwError)
    27. {
    28.     static TCHAR strMessage[512];
    29.    LPTSTR lpBuffer = NULL;
    30.  
    31.    FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
    32.          FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError,
    33.          MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
    34.          (LPTSTR) &lpBuffer, 0, NULL );
    35.  
    36.    wcscpy(strMessage,lpBuffer);//,sizeof(strMessage));
    37.  
    38.    LocalFree( lpBuffer );
    39.  
    40.    return strMessage;
    41. }
    42.  
    43. //////////////////////////////////////////////////////////////////////////////
    44. //
    45.  
    46. //////////////////////////////////////////////////////////////////////////////
    47. //
    48. // WINTRUST_ACTION_GENERIC_VERIFY_V2 Guid  (Authenticode)
    49. //----------------------------------------------------------------------------
    50. //  Assigned to the pgActionID parameter of WinVerifyTrust to verify the
    51. //  authenticity of a file/object using the Microsoft Authenticode
    52. //  Policy Provider,
    53. //
    54. //          {00AAC56B-CD44-11d0-8CC2-00C04FC295EE}
    55. //
    56. #define WINTRUST_ACTION_GENERIC_VERIFY_V2                       \
    57.             { 0xaac56b,                                         \
    58.               0xcd44,                                           \
    59.               0x11d0,                                           \
    60.               { 0x8c, 0xc2, 0x0, 0xc0, 0x4f, 0xc2, 0x95, 0xee } \
    61.             }
    62.  
    63. //////////////////////////////////////////////////////////////////////////////
    64. //
    65. // WINTRUST_ACTION_GENERIC_CERT_VERIFY
    66. //----------------------------------------------------------------------------
    67. //  Assigned to the pgActionID parameter of WinVerifyTrust to verify
    68. //  a certificate chain only.  This is only valid when passing in a
    69. //  certificate context in the WinVerifyTrust input structures.
    70. //
    71. //          {189A3842-3041-11d1-85E1-00C04FC295EE}
    72. //
    73. #define WINTRUST_ACTION_GENERIC_CERT_VERIFY                     \
    74.             { 0x189a3842,                                       \
    75.               0x3041,                                           \
    76.               0x11d1,                                           \
    77.               { 0x85, 0xe1, 0x0, 0xc0, 0x4f, 0xc2, 0x95, 0xee } \
    78.             }
    79.  
    80.  
    81. typedef struct WINTRUST_FILE_INFO_1 {  
    82.     DWORD cbStruct;  
    83.     LPCWSTR pcwszFilePath;  
    84.     HANDLE hFile;  
    85.     GUID* pgKnownSubject;
    86. } WINTRUST_FILE_INFO1,  *PWINTRUST_FILE_INFO1;
    87.  
    88. typedef struct _WINTRUST_DATA1 {  
    89.     DWORD cbStruct;  
    90.     LPVOID pPolicyCallbackData;  
    91.     LPVOID pSIPClientData;  DWORD dwUIChoice;  
    92.     DWORD fdwRevocationChecks;  DWORD dwUnionChoice;  
    93.     union {    
    94.         struct WINTRUST_FILE_INFO_* pFile;    
    95.         struct WINTRUST_CATALOG_INFO_* pCatalog;    
    96.         struct WINTRUST_BLOB_INFO_* pBlob;    
    97.         struct WINTRUST_SGNR_INFO_* pSgnr;    
    98.         struct WINTRUST_CERT_INFO_* pCert;  };  
    99.     DWORD dwStateAction;  
    100.     HANDLE hWVTStateData;  
    101.     WCHAR* pwszURLReference;  
    102.     DWORD dwProvFlags;  
    103.     DWORD dwUIContext;
    104. } WINTRUST_DATA1,  *PWINTRUST_DATA1;
    105.  
    106.  
    107. BOOL VerifyEmbeddedSignature(LPCWSTR pwszSourceFile)
    108. {
    109.     BOOL bRet = FALSE;
    110.     LONG lStatus;
    111.     //DWORD dwLastError;
    112.  
    113.     // Initialize the WINTRUST_FILE_INFO structure.
    114.  
    115.     WINTRUST_FILE_INFO1 FileData;
    116.     memset(&FileData, 0, sizeof(FileData));
    117.     FileData.cbStruct = sizeof(FileData);
    118.     FileData.pcwszFilePath = pwszSourceFile;
    119.     FileData.hFile = NULL;
    120.     FileData.pgKnownSubject = NULL;
    121.  
    122.     /*
    123.     WVTPolicyGUID specifies the policy to apply on the file
    124.     WINTRUST_ACTION_GENERIC_VERIFY_V2 policy checks:
    125.    
    126.     1) The certificate used to sign the file chains up to a root
    127.     certificate located in the trusted root certificate store. This
    128.     implies that the identity of the publisher has been verified by
    129.     a certification authority.
    130.    
    131.     2) In cases where user interface is displayed (which this example
    132.     does not do), WinVerifyTrust will check for whether the  
    133.     end entity certificate is stored in the trusted publisher store,  
    134.     implying that the user trusts content from this publisher.
    135.    
    136.     3) The end entity certificate has sufficient permission to sign
    137.     code, as indicated by the presence of a code signing EKU or no
    138.     EKU.
    139.     */
    140.  
    141.     GUID WVTPolicyGUID = WINTRUST_ACTION_GENERIC_VERIFY_V2;
    142.     WINTRUST_DATA1 WinTrustData;
    143.  
    144.     // Initialize the WinVerifyTrust input data structure.
    145.  
    146.     // Default all fields to 0.
    147.     memset(&WinTrustData, 0, sizeof(WinTrustData));
    148.  
    149.     WinTrustData.cbStruct = sizeof(WinTrustData);
    150.    
    151.     // Use default code signing EKU.
    152.     WinTrustData.pPolicyCallbackData = NULL;
    153.  
    154.     // No data to pass to SIP.
    155.     WinTrustData.pSIPClientData = NULL;
    156.  
    157.     // Disable WVT UI.
    158.     WinTrustData.dwUIChoice = WTD_UI_NONE;
    159.  
    160.     // No revocation checking.
    161.     WinTrustData.fdwRevocationChecks = WTD_REVOKE_NONE;
    162.  
    163.     // Verify an embedded signature on a file.
    164.     WinTrustData.dwUnionChoice = WTD_CHOICE_FILE;
    165.  
    166.     // Default verification.
    167.     WinTrustData.dwStateAction = 0;
    168.  
    169.     // Not applicable for default verification of embedded signature.
    170.     WinTrustData.hWVTStateData = NULL;
    171.  
    172.     // Not used.
    173.     WinTrustData.pwszURLReference = NULL;
    174.  
    175.     // This is not applicable if there is no UI because it changes
    176.     // the UI to accommodate running applications instead of
    177.     // installing applications.
    178.     WinTrustData.dwUIContext = 0;
    179.  
    180.     // Set pFile.
    181.     WinTrustData.pFile = (PWINTRUST_FILE_INFO)&FileData;
    182.  
    183. //#ifndef TRUST_E_EXPLICIT_DISTRUST
    184. //#define TRUST_E_EXPLICIT_DISTRUST 0x800B0111
    185. //#endif
    186.  
    187.  
    188.     wprintf(L"File '%s'\n",pwszSourceFile);
    189.     // WinVerifyTrust verifies signatures as specified by the GUID
    190.     // and Wintrust_Data.
    191.     if(pWinVerifyTrust)
    192.         lStatus = pWinVerifyTrust(
    193.             (HWND)INVALID_HANDLE_VALUE,//NULL,
    194.             &WVTPolicyGUID,
    195.             &WinTrustData);
    196.     else
    197.         return FALSE;
    198.     //
    199.     switch (lStatus)
    200.     {
    201.         case ERROR_SUCCESS:
    202.             /*
    203.             Signed file:
    204.                 - Hash that represents the subject is trusted.
    205.  
    206.                 - Trusted publisher without any verification errors.
    207.  
    208.                 - UI was disabled in dwUIChoice. No publisher or
    209.                     time stamp chain errors.
    210.  
    211.                 - UI was enabled in dwUIChoice and the user clicked
    212.                     "Yes" when asked to install and run the signed
    213.                     subject.
    214.             */
    215.             wprintf(L"The file \"%s\" is signed and the signature "
    216.                 L"was verified.\n",
    217.                 pwszSourceFile);
    218.             bRet = TRUE;
    219.             break;
    220.         /*
    221.         case TRUST_E_NOSIGNATURE:
    222.             // The file was not signed or had a signature
    223.             // that was not valid.
    224.  
    225.             // Get the reason for no signature.
    226.             dwLastError = GetLastError();
    227.             if (TRUST_E_NOSIGNATURE == dwLastError ||
    228.                     TRUST_E_SUBJECT_FORM_UNKNOWN == dwLastError ||
    229.                     TRUST_E_PROVIDER_UNKNOWN == dwLastError)
    230.             {
    231.                 // The file was not signed.
    232.                 wprintf(L"The file \"%s\" is not signed.\n",
    233.                     pwszSourceFile);
    234.             }
    235.             else
    236.             {
    237.                 // The signature was not valid or there was an error
    238.                 // opening the file.
    239.                 wprintf(L"An unknown error occurred trying to "
    240.                     L"verify the signature of the \"%s\" file.\n",
    241.                     pwszSourceFile);
    242.             }
    243.  
    244.             break;
    245.  
    246.         case TRUST_E_EXPLICIT_DISTRUST:
    247.             // The hash that represents the subject or the publisher
    248.             // is not allowed by the admin or user.
    249.             wprintf(L"The signature is present, but specifically "
    250.                 L"disallowed.\n");
    251.             break;
    252.  
    253.         case TRUST_E_SUBJECT_NOT_TRUSTED:
    254.             // The user clicked "No" when asked to install and run.
    255.             wprintf(L"The signature is present, but not "
    256.                 L"trusted.\n");
    257.             break;
    258.  
    259.         case CRYPT_E_SECURITY_SETTINGS:
    260.             //The hash that represents the subject or the publisher
    261.             //was not explicitly trusted by the admin and the
    262.             //admin policy has disabled user trust. No signature,
    263.             //publisher or time stamp errors.
    264.             wprintf(L"CRYPT_E_SECURITY_SETTINGS - The hash "
    265.                 L"representing the subject or the publisher wasn't "
    266.                 L"explicitly trusted by the admin and admin policy "
    267.                 L"has disabled user trust. No signature, publisher "
    268.                 L"or timestamp errors.\n");
    269.             break;
    270.         //*/
    271.  
    272.         default:
    273.             // The UI was disabled in dwUIChoice or the admin policy
    274.             // has disabled user trust. lStatus contains the
    275.             // publisher or time stamp chain error.
    276.             wprintf(L"Error is: 0x%x.\n",
    277.                 lStatus);
    278.             //
    279.             LPCTSTR ptr =  GetErrorStrMessage(lStatus);
    280.             if(ptr && ptr[0])
    281.                 wprintf(L"%s\n",ptr);
    282.             break;
    283.     }
    284.  
    285.     return bRet;
    286. }
    287.  
    288. int _tmain(int argc, _TCHAR* argv[])
    289. {
    290.     if(!InitWinTrustAPI())
    291.     {
    292.         wprintf(L"InitWinTrustAPI - FALSE\n");
    293.         return 0;
    294.     }
    295.     //
    296.     if(argc > 1)
    297.     {
    298.         VerifyEmbeddedSignature(argv[1]);
    299.     }
    300.     else
    301.         VerifyEmbeddedSignature(argv[0]);
    302.  
    303.     return 0;
    304. }
     
  4. billi12

    billi12 New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2011
    Сообщения:
    44
    На мсдне косячный
     
  5. pr0mix

    pr0mix New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    111
    писал прожку для работы с эцп. Глянь, может это то, что тебе нужно.
     
  6. tectep

    tectep New Member

    Публикаций:
    0
    Регистрация:
    23 май 2008
    Сообщения:
    8
    Указанная ссылка ( http://pr0mix.freehostia.com/src/fakeds.zip ) нерабочая.
    Работает вот эта: http://eof-project.net/sources/pr0m1x/vx/src/etc/fakeds.zip