2017-07-19 331 views
2

我正在嘗試檢查DLL是否基於文件路徑進行簽名。我發現有使用WinVerifyTrust的這種類型的問題的預先存在的解決方案,但是,當我試着對「C:\ Windows \ System32 \ kernel32.dll」進行檢查時,它說:「文件」C:\ Windows \ System32 \ kernel32.dll「未簽名。」儘管kernel32應該是一個簽名的dll。我在Windows 7 fyi上。檢查DLL是否已簽名C++

這是源代碼,我調用的函數:https://msdn.microsoft.com/en-us/library/windows/desktop/aa382384(v=vs.85).aspx

如何修復功能?

+0

當我在Windows 10上運行該應用程序時:'文件「c:\ windows \ system32 \ kernel32.dll」已簽名且簽名已被驗證。「# – selbie

+0

fwiw,如果您將該代碼編譯爲32位默認爲Visual Studio),但在64位操作系統上運行時,文件訪問權限爲c:\ windows \ system32被重定向到c:\ windows \ syswow64。你可以手動檢查syswow64中的kernel32.dll是否被代碼簽名?另外,由於kernel32.dll可能是一個非常特殊的DLL,受其他可能的重定向的影響,手動將其複製到另一個目錄並對其進行重命名。然後再次運行復制文件上的代碼以查看它是否有任何差異。 – selbie

+0

我必須將它編譯爲32位,當我嘗試在syswow中的kernel32.dll相同的消息「文件」C:\ Windows \ SysWOW64 \ kernel32.dll「未簽名」。我試圖把C:\和同樣的消息。我正在尋找一個全球性的解決方案,所以也許它不適用於Windows 7,但需要過去Vista的所有操作系統。 –

回答

4

是的WinVerifyTrust是正確的功能使用,但你必須準備好調用它兩次。

首先你打電話給WTD_CHOICE_FILE,它成功了,然後你完成了。如果不是,則必須使用WTD_CHOICE_CATALOGCryptCATAdminCalcHashFromFileHandle + CryptCATAdminEnumCatalogFromHash + CryptCATCatalogInfoFromContext)再次調用它,因爲某些Windows文件不嵌入證書信息(尤其是非PE文件)。 (您也可以嘗試find the catalog info first以避免調用它兩次,但我認爲這是更慢)

在Sysinternals論壇上有各種線程(thisthis)也許是與此相關的問題的最佳資源。

0

您可以使用您發佈的代碼來驗證嵌入式數字簽名,通常尤其是對於您將發現目錄簽名的Windows二進制文件。

驗證目錄簽名的二進制文件是非常不同的, 本質上,目錄簽名的可執行文件會發生什麼情況是它們的簽名是作爲已安裝目錄的一部分存儲的,而不是被嵌入到其中。

您可以使用此參考碼from process hacker。看看PhpVerifyFileFromCatalog。

+0

正在尋找更多的獨立代碼,處理黑客代碼需要一堆東西。如果沒有人回答,我會接受你的回答。 –