Здравствуйте, Losar, Вы писали:
L>Есть подписанный файл, если изменить его контент, L>то при просмотре информации о сертификате есть сообщение "This digital signature is not valid"
L>Как определить программно, что сигнатура не валидна?
Я делал так.
Сначала определял наличие Certificate Table в исполняемом файле (ImageEnumerateCertificates) и
проверял, возвращает ли ImageGetCertificateHeader значение WIN_CERT_TYPE_PKCS_SIGNED_DATA.
Если хотя бы одно из условий не выполняется, значит, файл не подписан.
Дальше зовем WinVerifyTrust (флаги могут отличаться, в зависимости от условий задачи).
Если возвращает код, отличный от ERROR_SUCCESS, значит, подпись невалидна.
Re[2]: Как определить что подпись файла не валидна?
Здравствуйте, okman, Вы писали:
O>Здравствуйте, Losar, Вы писали:
L>>Есть подписанный файл, если изменить его контент, L>>то при просмотре информации о сертификате есть сообщение "This digital signature is not valid"
L>>Как определить программно, что сигнатура не валидна?
O>Я делал так. O>Сначала определял наличие Certificate Table в исполняемом файле (ImageEnumerateCertificates) и O>проверял, возвращает ли ImageGetCertificateHeader значение WIN_CERT_TYPE_PKCS_SIGNED_DATA. O>Если хотя бы одно из условий не выполняется, значит, файл не подписан. O>Дальше зовем WinVerifyTrust (флаги могут отличаться, в зависимости от условий задачи). O>Если возвращает код, отличный от ERROR_SUCCESS, значит, подпись невалидна.
Здравствуйте, Losar, Вы писали:
L>Привет.
L>Есть подписанный файл, если изменить его контент, L>то при просмотре информации о сертификате есть сообщение "This digital signature is not valid"
L>Как определить программно, что сигнатура не валидна?
На васике:
Public Function Verify(ByVal szFileName As String) As Long
Dim fResult As Long
Dim dwEncoding As Long
Dim dwContentType As Long
Dim dwFormatType As Long
Dim hStore As Long
Dim hMsg As Long
fResult = CryptQueryObject( _
CERT_QUERY_OBJECT_FILE, ByVal StrPtr(szFileName), _
CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED, _
CERT_QUERY_FORMAT_FLAG_BINARY, 0&, dwEncoding, _
dwContentType, dwFormatType, hStore, hMsg, ByVal 0&)
Verify = fResult
End Function
Re[2]: Как определить что подпись файла не валидна?
Но CryptQueryObject(CERT_QUERY_OBJECT_FILE, pszFileName,
CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED, CERT_QUERY_FORMAT_FLAG_BINARY,
0, NULL, &dwContentType, NULL, &hStore,&hMsg, NULL)
возвращает true и потом даже можно вытащить имя.
Здравствуйте, baranovda, Вы писали:
B>Здравствуйте, Losar, Вы писали:
L>>Привет.
L>>Есть подписанный файл, если изменить его контент, L>>то при просмотре информации о сертификате есть сообщение "This digital signature is not valid"
L>>Как определить программно, что сигнатура не валидна?
B>На васике:
B>
B>Public Function Verify(ByVal szFileName As String) As Long
B> Dim fResult As Long
B> Dim dwEncoding As Long
B> Dim dwContentType As Long
B> Dim dwFormatType As Long
B> Dim hStore As Long
B> Dim hMsg As Long
B> fResult = CryptQueryObject( _
B> CERT_QUERY_OBJECT_FILE, ByVal StrPtr(szFileName), _
B> CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED, _
B> CERT_QUERY_FORMAT_FLAG_BINARY, 0&, dwEncoding, _
B> dwContentType, dwFormatType, hStore, hMsg, ByVal 0&)
B> Verify = fResult
B>End Function
B>
Re[3]: Как определить что подпись файла не валидна?
Здравствуйте, Losar, Вы писали:
L>Дело в том что сейчас на такой файл WinVerifyTrust возвращает OK.
Это странно, потому что у меня все отрабатывает нормально.
Только что взял три exe файла — один без подписи, второй с подписью, третий тоже с
подписью, но с одним модифицированным байтом. Утилита проверки подписи, основанная на
вышеописнном подходе, выдала:
>File (1) is not signed.
>File (2) has valid signature.
>File (3) has corrupted signature.
У меня код аналогичен, вот только я вместо WTD_STATEACTION_CLOSE использую WTD_STATEACTION_IGNORE.
По-моему, когда WinVerifyTrust используется для с флагом WTD_STATEACTION_CLOSE, она
выполняет не верификацию подписи, а закрытие хэндла hWVTStateData, который был получен
предыдущим вызовом. Может быть, поэтому и возвращается ERROR_SUCCESS на сломаной подписи.