4

我使用WinVerifyTrust_tmain驗證某些Windows可執行文件具有以下功能的有效性,稱爲一個循環:內存泄漏,同時驗證可執行文件的驗證碼簽名?

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

這裏是幾千循環記憶進化: alt text

+0

只是因爲內存與生長每次迭代並不意味着_necessarily_有內存泄漏。堆可能會決定釋放新的內存,而不是先前釋放的內存。這在有大量可用內存的系統中很常見。當系統中存在內存壓力時,工作集將被修剪,這可能會說服堆不要那麼貪婪。 – 2012-05-23 18:30:17

回答

0

我沒有看到這個API泄露任何信息。也許這只是堆碎片的過程?

您可以使用umdh在X和X + delta處對您的進程拍攝快照,然後分析當時的比較堆使用情況。確保所有符號都可用,這是最有幫助的。

0

(編輯:展望新的圖表,我錯了)

基於在調用堆棧「I_CryptCreateLruEntry」,我的猜測是,這是不是一個內存泄漏;它只是以有限的方式緩存數據。即它不會無限增長。

LRU在於顧名思義它是將其存儲在Least Recently Used cache爲了加快可能涉及相同的證書後續操作中獲得的證書。

如果你在一個循環中運行代碼,發現它使用了幾兆字節,並且在許多迭代之後仍然在增長,那麼可能是泄漏,或者配置非常糟糕的緩存算法,但否則我會說你可能沒有任何東西擔心。

+0

我知道LRU應該做什麼,但它似乎沒有緩存任何東西。對於循環中正在檢查的同一個可執行文件,內存將保持線性增長。 – 2010-11-26 12:56:32

+0

看看新圖,我同意。這看起來並不像緩存(除非它緩存了可怕的錯誤:))。對不起,紅鯡魚。 – 2010-11-26 13:02:34

0

根據MSDN documenation of WINTRUST_DATA,Windows XP或Windows 2000不支持WTD_CACHE_ONLY_URL_RETRIEVAL。我懷疑這與表觀泄漏有什麼關係,但認爲可能值得指出。