Blog. Just Blog

Проверка цифровой подписи исполняемого файла

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Проверка цифровой подписи исполняемого файла
Проверка цифровой подписи исполняемого файла

Цифровая подпись в настоящее время является одним из основных способов подтверждения, что файл не был модифицирован, что он получен от достоверного источника и что он принадлежит именно тому издателю, который заявлен. Использование современных криптографических алгоритмов практически исключают возможность ее подделки. А вот как программно проверить цифровую подпись исполняемых файлов - это я вам сейчас расскажу.

Для работы понадобится несколько структур, констант и GUID, которых нет в FASM. Ничего удивительного, функции работы с цифровыми подписями появились в Windows XP, а поддержка инклудов FASM остановилась на Windows 2000.
  1. ; GUID {00AAC56B-CD44-11D0-8CC2-00C04FC295EE}
  2. WINTRUST_ACTION_GENERIC_VERIFY_V2 \
  3.     dd 000AAC56Bh
  4.     dw 0CD44h
  5.     dw 011D0h
  6.     db 08Ch, 0C2h, 000h, 0C0h, 04Fh, 0C2h, 095h, 0EEh
  7.  
  8. struct WINTRUST_FILE_INFO
  9.         cbStruct       dd ?
  10.         pcwszFilePath  dd ?
  11.         hFile          dd ?
  12.         pgKnownSubject rb 16
  13. ends
  14.  
  15. struct WINTRUST_DATA
  16.         cbStruct            dd ?
  17.         pPolicyCallbackData dd ?
  18.         pSIPClientData      dd ?
  19.         dwUIChoice          dd ?
  20.         fdwRevocationChecks dd ?
  21.         dwUnionChoice       dd ?
  22.         pData               dd ?
  23.         dwStateAction       dd ?
  24.         hWVTStateData       dd ?
  25.         pwszURLReference    dd ?
  26.         dwProvFlags         dd ?
  27.         dwUIContext         dd ?
  28.         pSignatureSettings  dd ?
  29. ends
  30.  
  31. WTD_UI_NONE            = 2
  32. WTD_REVOKE_NONE        = 0x00000000
  33. WTD_CHOICE_FILE        = 1
  34. WTD_STATEACTION_VERIFY = 0x00000001
  35. WTD_STATEACTION_CLOSE  = 0x00000002
  36. CERT_X500_NAME_STR            = 3
  37. CERT_NAME_SIMPLE_DISPLAY_TYPE = 4
  38.  
  39. TRUST_E_NOSIGNATURE = 0x800B0100
  40. TRUST_E_BAD_DIGEST  = 0x80096010
  41. ERROR_SUCCESS = 0
Основная часть проверки цифровой подписи исполняемого файла осуществляется при помощи функции WinVerifyTrust. На этом этапе определяется сам факт наличия цифровой подписи в файле, а также ее валидность.
  1.         ; Имя проверяемого файла
  2.         mov     [wfinfo.cbStruct],sizeof.WINTRUST_FILE_INFO
  3.         mov     [wfinfo.pcwszFilePath],fname
  4.         mov     [wfinfo.hFile],0
  5.         mov     edi,wfinfo.pgKnownSubject
  6.         xor     eax,eax
  7.         stosd
  8.         stosd
  9.         stosd
  10.         stosd
  11.  
  12.         ; Заполнить структуру запроса
  13.         mov     [wdata.cbStruct],sizeof.WINTRUST_DATA
  14.         mov     [wdata.dwUIChoice],WTD_UI_NONE
  15.         mov     [wdata.fdwRevocationChecks],WTD_REVOKE_NONE
  16.         mov     [wdata.dwUnionChoice],WTD_CHOICE_FILE
  17.         mov     [wdata.pData],wfinfo
  18.         mov     [wdata.dwProvFlags],0
  19.         mov     [wdata.dwStateAction],WTD_STATEACTION_VERIFY
  20.  
  21.         mov     esi,WINTRUST_ACTION_GENERIC_VERIFY_V2
  22.         mov     edi,policy
  23.         movsd
  24.         movsd
  25.         movsd
  26.         movsd
  27.  
  28.         invoke  WinVerifyTrust,INVALID_HANDLE_VALUE,policy,wdata
Результат проверки возвращается в регистре EAX: ERROR_SUCCESS - цифровая подпись присутствует и она валидная, TRUST_E_NOSIGNATURE - цифровая подпись вообще отсутствует, TRUST_E_BAD_DIGEST - цифровая подпись есть, но подписанный файл модифицирован или не соответствует этой подписи. Другие коды ошибок могут появляться, например, в случае попытки проверить файл, не являющийся исполняемым. Они нас не интересуют.

Если цифровая подпись присутствует, то, независимо от ее валидности, из сертификата можно извлечь данные об издателе. Для этого последовательно запрашивается информация о провайдере, затем данные из цепочки сертификатов и, наконец, данные из самого сертификата.
  1.         invoke  WTHelperProvDataFromStateData,[wdata.hWVTStateData]
  2.         mov     [pProvData],eax
  3.  
  4.         invoke  WTHelperGetProvSignerFromChain,[pProvData],0,FALSE,0
  5.         mov     [pProvSigner],eax
  6.  
  7.         invoke  WTHelperGetProvCertFromChain,[pProvSigner],0
  8.         mov     [pProvCert],eax
  9.  
  10.         mov     [dwStrType],CERT_X500_NAME_STR
  11.  
  12.         ; Получить размер строки сведений об издателе
  13.         mov     eax,[pProvCert]
  14.         invoke  CertGetNameString,dword [eax+4],\
  15.                 CERT_NAME_SIMPLE_DISPLAY_TYPE,\
  16.                 0,dwStrType,NULL,0
  17.         mov     [dwCount],eax
  18.         ; Строка пустая?
  19.         cmp     [dwCount],0
  20.         je      @f
  21.  
  22.         ; Получить сведения об издателе
  23.         mov     eax,[pProvCert]
  24.         invoke  CertGetNameString,dword [eax+4],\
  25.                 CERT_NAME_SIMPLE_DISPLAY_TYPE,\
  26.                 0,dwStrType,\
  27.                 szSigner,[dwCount]
  28.         ; szSigner = название издателя сертификата
  29. @@:
  30.         ; Освободить ранее выделенный элемент
  31.         mov     [wdata.dwStateAction],WTD_STATEACTION_CLOSE
  32.         invoke  WinVerifyTrust,INVALID_HANDLE_VALUE,policy,wdata
С помощью функции CertGetNameString извлекаем строку названия издателя. Обратите внимание, что функция вызывается дважды. Первый раз определяется длина строки, которая должна принять данные, а второй раз эти данные запрашиваются. Можно выделить память для строки после получения ее размера, а можно просто зарезервировать буфер достаточного объема. После получения данных освобождаем выделенный элемент, заменив код действия в структуре WINTRUST_DATA и повторно вызвав функцию WinVerifyTrust.

В приложении пример программы с исходным текстом, которая запрашивает информацию об издателе из драйвера.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Get.Certificate.Signer.Demo.zip (10,624 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 1106 | Комментариев: 1

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ufa (27.09.2023 в 20:15):
Благодарю, пригодится когда-нибудь.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.06 сек. / MySQL: 2 (0.0041 сек.) / Память: 4.5 Mb
Наверх