Сорь не догляделСкрипт в посте не выводит информации о наличии цифровой подписи.
Смотрел, но он у меня на файлах без подписи выдает:WinTrust.au3 и кажется это то что тебе нужно
Хотя по логике должно быть:An unknown error occurred trying to verify the signature of the "%s" file.
А при попытке запуска на виртуалке (тоже Win7 x64) вообще зависает и с большой задержкой вываливается с ошибкой:The file "%s" is not signed or does not exist
---------------------------
---------------------------
Error is: 0x800b0109.
---------------------------
ОК
---------------------------
На xp sp3 нормУ меня этот скрипт не срабатывает.
Win7 x64
#include <Array.au3>
Const $xStart = "50450000" ;заголовок
Const $xOffset = 148 * 2 ;смещение до контрольной суммы относительно заголовка
Const $sPtrn = '(..)'
$sPathLog = "C:\Users\Дмитрий\Downloads\autoit-v3-setup.exe"
$hOpen = FileOpen($sPathLog,16)
$sFounded = StringRegExp(FileRead($hOpen,1024), $xStart & ".{" & $xOffset & "}(.{8})(.{8}).*",3)
FileClose($hOpen)
If IsArray($sFounded) And UBound($sFounded) = 2 Then
$sFounded[0] = StringRegExpReplace($sFounded[0], $sPtrn & $sPtrn & $sPtrn & $sPtrn, '$4$3$2$1')
$sFounded[1] = StringRegExpReplace($sFounded[1], $sPtrn & $sPtrn & $sPtrn & $sPtrn, '$4$3$2$1')
$hSum = Dec($sFounded[0]) + Dec($sFounded[1])
If Dec($sFounded[0]) = 0 And Dec($sFounded[1]) = 0 Then
MsgBox(64,"Информация","Файл НЕ подписан сертификатом")
Exit
ElseIf Dec($sFounded[0]) = 0 or Dec($sFounded[1]) = 0 Then
MsgBox(16,"Информация","Сертификат битый")
Exit
EndIf
If Hex($hSum,16) <> Hex(FileGetSize($sPathLog),16) Then
MsgBox(16,"Ошибка","Файл\сертификат битый")
Else
MsgBox(64,"Информация","Файл подписан сертификатом" & @CRLF & "Адрес: 0x" & $sFounded[0] & @CRLF & "Длинна сертификата: 0x" & $sFounded[1])
EndIf
Else
MsgBox(16,"Ошибка","Не найдена сигнатура PE формата")
EndIf
#include <Array.au3>
Const $xStart = "50450000" ;заголовок
Const $xOffset = 148 * 2 ;смещение до контрольной суммы относительно заголовка
Const $sPtrn = '(..)'
$sPathLog = "C:\Users\Дмитрий\Downloads\autoit-v3-setup.exe"
$hOpen = FileOpen($sPathLog,16)
$sFounded = StringRegExp(FileRead($hOpen,1024), $xStart & ".{" & $xOffset & "}(.{8})(.{8}).*",3)
If IsArray($sFounded) And UBound($sFounded) = 2 Then
$sFounded[0] = StringRegExpReplace($sFounded[0], $sPtrn & $sPtrn & $sPtrn & $sPtrn, '$4$3$2$1')
$sFounded[1] = StringRegExpReplace($sFounded[1], $sPtrn & $sPtrn & $sPtrn & $sPtrn, '$4$3$2$1')
$hSum = Dec($sFounded[0]) + Dec($sFounded[1])
If Dec($sFounded[0]) = 0 And Dec($sFounded[1]) = 0 Then
MsgBox(64,"Информация","Файл НЕ подписан сертификатом")
Exit
ElseIf Dec($sFounded[0]) = 0 or Dec($sFounded[1]) = 0 Then
MsgBox(16,"Информация","Сертификат битый")
Exit
EndIf
If Hex($hSum,16) <> Hex(FileGetSize($sPathLog),16) Then
MsgBox(16,"Ошибка","Файл\сертификат битый")
Else
FileSetPos($hOpen, Dec($sFounded[0]) ,0)
$sRead = FileRead($hOpen,Dec($sFounded[1]))
$sLengtName = StringRegExp($sRead, "060355040313(.{2}).*",3)
$sSignName = StringRegExp($sRead, "060355040313.{2}(.{" & (Dec($sLengtName[0])*2) & "}).*",3)
MsgBox(64,"Информация","Файл подписан сертификатом" & @CRLF & "Адрес: 0x" & _
$sFounded[0] & @CRLF & "Длинна сертификата: " & (Dec($sFounded[1])) & " байт" & @CRLF & "Имя издателя: " & BinaryToString("0x"&$sSignName[0],4))
EndIf
Else
MsgBox(16,"Ошибка","Не найдена сигнатура PE формата")
EndIf
FileClose($hOpen)
Спасибо.Может найдешь для себя что-то
полезное в этой статье
Func _IsSign($sFile)
Local $Result
If Not FileExists($sFile) Then
Return SetError(1, 0, 0)
EndIf
;~ $Result = DllCall('crypt32.dll', 'bool', 'CryptQueryObject', 'dword', $CERT_QUERY_OBJECT_FILE, 'wstr', $sFile, 'dword', $CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED, 'dword', $CERT_QUERY_FORMAT_FLAG_BINARY, 'dword', 0, 'dword*', 0, 'dword*', 0, 'dword*', 0, 'handle*', 0, 'handle*', 0, 'ptr', 0)
$Result = DllCall('crypt32.dll', 'bool', 'CryptQueryObject', 'dword', 0x0001, 'wstr', $sFile, 'dword', 0x0400, 'dword', 0x0002, 'dword', 0, 'dword*', 0, 'dword*', 0, 'dword*', 0, 'handle*', 0, 'handle*', 0, 'ptr', 0)
If (@Error) Or (Not $Result[0]) Then
Return SetError(2, 0, 0)
EndIf
;~ If $Result[7] = $CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED Then
If $Result[7] = 10 Then
Return 1
Else
Return 0
EndIf
EndFunc ;==>_IsSign