4

WinVerifyTrustを使用して、からのループで呼び出される次の関数を使用して、一部の Windows 実行可能ファイルの有効性を検証しています_tmain

int signature_is_valid(const wchar_t *filepath) {
    GUID guid = WINTRUST_ACTION_GENERIC_VERIFY_V2;
    WINTRUST_FILE_INFO file_info = { 0 };
    WINTRUST_DATA wd;

    file_info.cbStruct = sizeof(file_info);
    file_info.pcwszFilePath = filepath;
    file_info.hFile = NULL;
    file_info.pgKnownSubject = NULL;

    ZeroMemory(&wd, sizeof(wd));
    wd.cbStruct = sizeof(wd);
    wd.dwUIChoice = WTD_UI_NONE;
    wd.fdwRevocationChecks = WTD_REVOCATION_CHECK_NONE;
    wd.dwUnionChoice = WTD_CHOICE_FILE;
    wd.dwStateAction = 0;
    wd.pFile = &file_info;
    wd.dwProvFlags = WTD_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT | WTD_CACHE_ONLY_URL_RETRIEVAL;

    return 0 == WinVerifyTrust(NULL, &guid, &wd);
}

ただし、ループごとにメモリが増加し続け、メモリ リークの確実な兆候です。

の理解に問題がありますか、APIそれともWinVerifyTrust関数が実際にリークしていますか? これをシステムでテストしていWindows XP Professional SP3ます。

編集:

からの出力を次に示しますumdh

+   16812 (  16992 -    180)    472 allocs BackTraceAD1
+     467 (    472 -      5) BackTraceAD1 allocations

 ntdll!RtlDebugAllocateHeap+000000E1
 ntdll!RtlAllocateHeapSlowly+00000044
 ntdll!RtlAllocateHeap+00000E64
 kernel32!LocalAlloc+00000058
 CRYPT32!operator new+00000011
 CRYPT32!I_CryptCreateLruEntry+00000011
 CRYPT32!CreateAuthRootAutoUpdateMatchCaches+00000107
 CRYPT32!CCertChainEngine::FindAuthRootAutoUpdateMatchingCtlEntries+0000004D
 CRYPT32!CChainPathObject::GetAuthRootAutoUpdateUrlStore+000000C9
 CRYPT32!CChainPathObject::CChainPathObject+0000030E
 CRYPT32!ChainCreatePathObject+00000050
 CRYPT32!CCertIssuerList::AddIssuer+0000006A
 CRYPT32!CChainPathObject::FindAndAddIssuersFromStoreByMatchType+00000182
 CRYPT32!CChainPathObject::FindAndAddIssuersByMatchType+00000096
 CRYPT32!CChainPathObject::FindAndAddIssuers+00000023
 CRYPT32!CChainPathObject::CChainPathObject+000001F9
 CRYPT32!ChainCreatePathObject+00000050
 CRYPT32!CCertIssuerList::AddIssuer+0000006A
 CRYPT32!CChainPathObject::FindAndAddIssuersFromCacheByMatchType+00000084
 CRYPT32!CChainPathObject::FindAndAddIssuersByMatchType+00000023
 CRYPT32!CChainPathObject::FindAndAddIssuers+00000063
 CRYPT32!CChainPathObject::CChainPathObject+000001F9
 CRYPT32!ChainCreatePathObject+00000050
 CRYPT32!CCertChainEngine::CreateChainContextFromPathGraph+0000019E
 CRYPT32!CCertChainEngine::GetChainContext+00000044
 CRYPT32!CertGetCertificateChain+00000060
 WINTRUST!_WalkChain+0000019C
 WINTRUST!WintrustCertificateTrust+000000B7
 WINTRUST!_VerifyTrust+00000144
 WINTRUST!WinVerifyTrust+0000004E
 SigTest!signature_is_valid+000000DD 

+   10984 (  10984 -      0)      2 allocs BackTraceBB3
+       2 (      2 -      0) BackTraceBB3 allocations

 ntdll!RtlDebugAllocateHeap+000000E1
 ntdll!RtlAllocateHeapSlowly+00000044
 ntdll!RtlAllocateHeap+00000E64
 kernel32!LocalAlloc+00000058
 CRYPT32!PkiDefaultCryptAlloc+00000011
 CRYPT32!CertFindCertificateInCRL+00000051
 cryptnet!MicrosoftCertDllVerifyRevocation+00000250
 CRYPT32!I_CryptRemainingMilliseconds+0000021B
 CRYPT32!CertVerifyRevocation+000000B7
 CRYPT32!CChainPathObject::CalculateRevocationStatus+000001F2
 CRYPT32!CChainPathObject::CalculateAdditionalStatus+00000147
 CRYPT32!CCertChainEngine::CreateChainContextFromPathGraph+00000227
 CRYPT32!CCertChainEngine::GetChainContext+00000044
 CRYPT32!CertGetCertificateChain+00000060
 WINTRUST!_WalkChain+0000019C
 WINTRUST!WintrustCertificateTrust+000000B7
 WINTRUST!_VerifyTrust+00000144
 WINTRUST!WinVerifyTrust+0000004E
 SigTest!signature_is_valid+000000DD
 SigTest!wmain+00000073
 SigTest!__tmainCRTStartup+000001A8
 SigTest!wmainCRTStartup+0000000F
 kernel32!BaseProcessStart+00000023

関数が漏れているように思えCRYPT32ます...または何かが欠けています。

EDIT2

以下は、数千回のループに対するメモリの進化です。 代替テキスト

4

4 に答える 4

0

この API がリークしているという情報はありません。おそらく、プロセス中のヒープの断片化だけですか?

umdhを使用して X および X+delta の時点でプロセスのスナップショットを取得し、その時点での比較ヒープ使用量を分析して、これを確実に確認できます。これが最も役立つように、すべてのシンボルが利用可能であることを確認してください。

于 2010-11-01T15:31:29.530 に答える
0

はい。crypt32.dll ファイルのバージョンが十分に低い場合、非常に厄介なメモリ リークが発生します。

http://social.technet.microsoft.com/Forums/en-US/itproxpsp/thread/c11530e8-56e2-4bb3-a887-f7809e644861を参照して ください。

修正のためにホットフィックスKB2641690をインストールします

于 2012-11-14T22:18:15.873 に答える
0

MSDN の WINTRUST_DATA のドキュメントによると、 WTD_CACHE_ONLY_URL_RETRIEVAL は Windows XP または Windows 2000 ではサポートされていません。

于 2012-05-23T16:43:28.793 に答える
0

(編集: 新しいグラフを見て、私は間違っていました。)

コールスタックの「I_CryptCreateLruEntry」に基づいて、これはメモリ リークではないと推測します。これは、境界のある方法でデータをキャッシュする API にすぎません。つまり、無限に成長するわけではありません。

その名前の LRU は、同じ証明書が関係する可能性のある後続の操作を高速化するために、取得した証明書を最も最近使用されていないキャッシュに保存していることを示唆しています。

コードをループで実行し、数メガバイトを使用していて、何度も繰り返した後もまだ成長していることがわかった場合は、リークがあるか、構成が非常に不十分なキャッシュ アルゴリズムが存在する可能性がありますが、それ以外の場合は、おそらく何も心配する必要はありません。

于 2010-11-25T22:28:04.773 に答える