Проверка цифровой подписи исполняемого файла
Проверка цифровой подписи исполняемого файла
Цифровая подпись в настоящее время является одним из основных способов подтверждения, что файл не был модифицирован, что он получен от достоверного источника и что он принадлежит именно тому издателю, который заявлен. Использование современных криптографических алгоритмов практически исключают возможность ее подделки. А вот как программно проверить цифровую подпись исполняемых файлов - это я вам сейчас расскажу.
Для работы понадобится несколько структур, констант и GUID, которых нет в FASM. Ничего удивительного, функции работы с цифровыми подписями появились в Windows XP, а поддержка инклудов FASM остановилась на Windows 2000.
Code (Assembler) : Убрать нумерацию
- ; GUID {00AAC56B-CD44-11D0-8CC2-00C04FC295EE}
- WINTRUST_ACTION_GENERIC_VERIFY_V2 \
- dd 000AAC56Bh
- dw 0CD44h
- dw 011D0h
- db 08Ch, 0C2h, 000h, 0C0h, 04Fh, 0C2h, 095h, 0EEh
- struct WINTRUST_FILE_INFO
- cbStruct dd ?
- pcwszFilePath dd ?
- hFile dd ?
- pgKnownSubject rb 16
- ends
- struct WINTRUST_DATA
- cbStruct dd ?
- pPolicyCallbackData dd ?
- pSIPClientData dd ?
- dwUIChoice dd ?
- fdwRevocationChecks dd ?
- dwUnionChoice dd ?
- pData dd ?
- dwStateAction dd ?
- hWVTStateData dd ?
- pwszURLReference dd ?
- dwProvFlags dd ?
- dwUIContext dd ?
- pSignatureSettings dd ?
- ends
- WTD_UI_NONE = 2
- WTD_REVOKE_NONE = 0x00000000
- WTD_CHOICE_FILE = 1
- WTD_STATEACTION_VERIFY = 0x00000001
- WTD_STATEACTION_CLOSE = 0x00000002
- CERT_X500_NAME_STR = 3
- CERT_NAME_SIMPLE_DISPLAY_TYPE = 4
- TRUST_E_NOSIGNATURE = 0x800B0100
- TRUST_E_BAD_DIGEST = 0x80096010
- ERROR_SUCCESS = 0
Code (Assembler) : Убрать нумерацию
- ; Имя проверяемого файла
- mov [wfinfo.cbStruct],sizeof.WINTRUST_FILE_INFO
- mov [wfinfo.pcwszFilePath],fname
- mov [wfinfo.hFile],0
- mov edi,wfinfo.pgKnownSubject
- xor eax,eax
- stosd
- stosd
- stosd
- stosd
- ; Заполнить структуру запроса
- mov [wdata.cbStruct],sizeof.WINTRUST_DATA
- mov [wdata.dwUIChoice],WTD_UI_NONE
- mov [wdata.fdwRevocationChecks],WTD_REVOKE_NONE
- mov [wdata.dwUnionChoice],WTD_CHOICE_FILE
- mov [wdata.pData],wfinfo
- mov [wdata.dwProvFlags],0
- mov [wdata.dwStateAction],WTD_STATEACTION_VERIFY
- mov esi,WINTRUST_ACTION_GENERIC_VERIFY_V2
- mov edi,policy
- movsd
- movsd
- movsd
- movsd
- invoke WinVerifyTrust,INVALID_HANDLE_VALUE,policy,wdata
Если цифровая подпись присутствует, то, независимо от ее валидности, из сертификата можно извлечь данные об издателе. Для этого последовательно запрашивается информация о провайдере, затем данные из цепочки сертификатов и, наконец, данные из самого сертификата.
Code (Assembler) : Убрать нумерацию
- invoke WTHelperProvDataFromStateData,[wdata.hWVTStateData]
- mov [pProvData],eax
- invoke WTHelperGetProvSignerFromChain,[pProvData],0,FALSE,0
- mov [pProvSigner],eax
- invoke WTHelperGetProvCertFromChain,[pProvSigner],0
- mov [pProvCert],eax
- mov [dwStrType],CERT_X500_NAME_STR
- ; Получить размер строки сведений об издателе
- mov eax,[pProvCert]
- invoke CertGetNameString,dword [eax+4],\
- CERT_NAME_SIMPLE_DISPLAY_TYPE,\
- 0,dwStrType,NULL,0
- mov [dwCount],eax
- ; Строка пустая?
- cmp [dwCount],0
- je @f
- ; Получить сведения об издателе
- mov eax,[pProvCert]
- invoke CertGetNameString,dword [eax+4],\
- CERT_NAME_SIMPLE_DISPLAY_TYPE,\
- 0,dwStrType,\
- szSigner,[dwCount]
- ; szSigner = название издателя сертификата
- @@:
- ; Освободить ранее выделенный элемент
- mov [wdata.dwStateAction],WTD_STATEACTION_CLOSE
- invoke WinVerifyTrust,INVALID_HANDLE_VALUE,policy,wdata
В приложении пример программы с исходным текстом, которая запрашивает информацию об издателе из драйвера.
Просмотров: 1106 | Комментариев: 1
Метки: Assembler, безопасность
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ufa
(27.09.2023 в 20:15):
Благодарю, пригодится когда-нибудь.
Добавить комментарий
Заполните форму для добавления комментария