Authenticode изнутри: как Windows проверяет цифровую подпись EXE и что должен знать Reverse Engineer

god

New member
Член команды
Большинство новичков считают, что цифровая подпись существует исключительно для того, чтобы Windows могла показать пользователю сообщение «Издатель проверен». На самом деле это лишь верхушка айсберга. Для Reverse Engineer цифровая подпись — не индикатор безопасности, а мощный источник информации о происхождении файла, его целостности и цепочке доверия. Правильная интерпретация этих данных помогает быстрее понять контекст исследуемого бинарного файла и избежать ложных выводов при анализе PE-файлов.

Где находится цифровая подпись в PE-файле
Первое заблуждение — подпись не хранится внутри .text, .rdata или других исполняемых секций. В формате Portable Executable она располагается отдельно — в структуре Attribute Certificate Table, адрес которой хранится в массиве Data Directory PE-заголовка.

Упрощённая схема расположения:

text

DOS Header


PE Header


Optional Header


Data Directory

├── Import Table
├── Export Table
├── Resource Table
├── Debug Directory
└── Certificate Table ← цифровая подпись
Именно поэтому сертификат практически не влияет на выполнение программы. Windows не исполняет его содержимое — подпись используется исключительно во время проверки целостности и происхождения файла.

Что происходит при подписании исполняемого файла
Во время подписи никто не «шифрует» EXE. Процесс устроен значительно проще и базируется на криптографических хэшах:

  1. Для файла вычисляется криптографический хэш (как правило, SHA-256).
  2. Полученный отпечаток подписывается закрытым ключом владельца сертификата.
  3. Сертификат разработчика и сформированная подпись добавляются в Certificate Table.
Схематично:

text

program.exe


SHA-256


Подписание хэша закрытым ключом


Certificate Table
Важно понимать разницу между хэшированием и шифрованием. Хэш-функция создаёт уникальный отпечаток данных и предназначена для проверки целостности. Она не позволяет восстановить исходный файл по полученному значению, но гарантирует, что любое изменение в данных приведёт к совершенно другому хэшу.

Почему изменение одного байта делает подпись недействительной
Хэш-функции обладают эффектом лавины. Даже минимальное изменение данных (например, один байт в исполняемой секции) полностью меняет итоговый SHA-256. После этого Windows вычисляет уже другой отпечаток и обнаруживает несоответствие ранее подписанному значению — проверка подписи проваливается.

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

Алгоритм проверки подписи в Windows
Проверка Authenticode — это многоэтапный процесс. Упрощённо его можно представить следующей цепочкой:

text

EXE


Проверка структуры подписи


Проверка сертификата (срок действия, отзыв)


Построение цепочки доверия


Проверка целостности хэша


Результат проверки
На любом из этих этапов система может прекратить проверку, если обнаружит несоответствие: нарушение структуры, просроченный или отозванный сертификат, разрыв цепочки доверия или несовпадение контрольной суммы.

Цепочка доверия сертификатов
Сертификат разработчика сам по себе ничего не доказывает. Windows пытается выстроить полную цепочку доверия до корневого центра сертификации:

text

EXE


Сертификат издателя (End-Entity)


Промежуточный центр сертификации (Intermediate CA)


Корневой центр сертификации (Root CA)


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

Почему цифровая подпись не равна безопасности
Это, пожалуй, самое важное. Authenticode отвечает только на вопросы:

  • кем подписан файл;
  • изменялся ли он после подписания.
Он не анализирует логику программы, не оценивает её функциональность и не заменяет антивирусные или поведенческие механизмы защиты. Поэтому исследователи никогда не делают вывод о безопасности программы только на основании наличия действительной подписи. Злоумышленники часто используют украденные или подставные сертификаты для подписи вредоносного ПО.

Инструменты для анализа цифровой подписи Authenticode
При реверс-инжиниринге полезно не просто смотреть свойства файла, а извлекать подпись программно. Вот несколько ключевых инструментов:

  • Sysinternals Sigcheck — показывает детали подписи, цепочку сертификатов и статус проверки.
  • Get-AuthenticodeSignature (PowerShell) — встроенный способ получить объект подписи и её статус.
  • osslsigncode / signcode — утилиты для извлечения и проверки подписей.
  • PE-парсеры (например, dumpbin /headers, readpe, pecheck) — позволяют найти Certificate Table и изучить структуру PE-файла вручную.
Использование этих инструментов ускоряет анализ и помогает получить точные данные о подписи без запуска сомнительных бинарников.

Что обычно изучают после проверки подписи
Опытный Reverse Engineer редко заканчивает анализ на сертификате. Чаще всего дальше исследуются:

  • структура PE-заголовков и Data Directory;
  • таблица импорта (импортируемые API);
  • экспортируемые функции;
  • секции и их атрибуты (исполняемые, читаемые, записываемые);
  • строки и ресурсы (версии, диалоги, манифесты);
  • отладочная информация (Debug Directory);
  • RTTI (если присутствует);
  • используемые библиотеки и сигнатуры компиляторов.
Эти артефакты позволяют быстро понять назначение программы и определить участки кода, заслуживающие более детального исследования.

Практический вывод
Цифровая подпись Authenticode — это не «ярлык безопасности», а инструмент проверки происхождения и целостности исполняемого файла. Для Reverse Engineer она представляет ценность прежде всего как часть общей картины. Глубокий анализ сертификата, структуры PE-файла, импортов и других артефактов позволяет быстрее понять контекст программы и построить план дальнейшего исследования.

Именно такой подход отличает профессиональное исследование бинарного файла от поверхностной проверки свойств в проводнике.
 
Последнее редактирование:
Вверх