0

WinVerifyTrustmsiの署名を検証する機能を試しています。

これはファイルシステム上のファイルでは機能しますが、メモリブロブでは機能しません。
問題を示すための私の例のこの基礎は、マイクロソフトのサンプルプログラムです

BOOL VerifyEmbeddedSignature(LPCWSTR pwszSourceFile)
{
   std::basic_ifstream<BYTE> file(pwszSourceFile, std::ios::binary);
  std::vector<BYTE> data((std::istreambuf_iterator<BYTE>(file)),std::istreambuf_iterator<BYTE>());

  LONG lStatus;

  /*
  // this works
  WINTRUST_FILE_INFO FileData;
  memset(&FileData, 0, sizeof(FileData));
  FileData.cbStruct = sizeof(WINTRUST_FILE_INFO);
  FileData.pcwszFilePath = pwszSourceFile;
  FileData.hFile = NULL;
  FileData.pgKnownSubject = NULL;
  */
  WINTRUST_BLOB_INFO FileData{};
  memset(&FileData, 0, sizeof(FileData));
  FileData.cbStruct = sizeof(WINTRUST_BLOB_INFO);
  FileData.gSubject = WIN_TRUST_SUBJTYPE_RAW_FILE;
  FileData.cbMemObject = static_cast<DWORD>(data.size());
  FileData.pbMemObject = data.data();

  GUID WVTPolicyGUID = WINTRUST_ACTION_GENERIC_VERIFY_V2;
  WINTRUST_DATA WinTrustData;
  memset(&WinTrustData, 0, sizeof(WinTrustData));
  WinTrustData.cbStruct = sizeof(WinTrustData);
  WinTrustData.pPolicyCallbackData = NULL;
  WinTrustData.pSIPClientData = NULL;
  WinTrustData.dwUIChoice = WTD_UI_NONE;
  WinTrustData.fdwRevocationChecks = WTD_REVOKE_NONE;
  //WinTrustData.dwUnionChoice = WTD_CHOICE_FILE; -- works
  WinTrustData.dwUnionChoice = WTD_CHOICE_BLOB;
  WinTrustData.dwStateAction = WTD_STATEACTION_VERIFY;
  WinTrustData.hWVTStateData = NULL;
  WinTrustData.pwszURLReference = NULL;
  WinTrustData.dwUIContext = 0;
  WinTrustData.pBlob = &FileData;
  //WinTrustData.pFile = &FileData; -- works

  lStatus = WinVerifyTrust(
    NULL,
    &WVTPolicyGUID,
    &WinTrustData);

  WinTrustData.dwStateAction = WTD_STATEACTION_CLOSE;
  WinVerifyTrust(
    NULL,
    &WVTPolicyGUID,
    &WinTrustData);

  return lStatus == ERROR_SUCCESS;
}

上記の例では、 は機能しWINTRUST_FILE_INFOますが、WINTRUST_BLOB_INFOは機能しません。メモリブロブで発生するエラーは常にTRUST_E_PROVIDER_UNKNOWN.

問題はWIN_TRUST_SUBJTYPE_RAW_FILE件名の種類にあると思いますが、msi ファイルにどちらを使用すればよいかわかりません。msiファイルのメモリブロブで符号チェックがまったく可能かどうか疑問に思っています。

4

1 に答える 1

1

WIN_TRUST_SUBJTYPE_RAW_FILE適切なサブジェクト GUID ではありません。関数CryptSIPRetrieveSubjectGuidは、指定されたファイルのヘッダー情報に基づいて GUID を取得します。

于 2020-07-08T01:19:51.790 に答える