Pull to refresh

Удаление цифровой подписи PE-файла

Reading time2 min
Views22K
Для подписи PE-файлов (exe, dll, sys и другие) в большинстве случаев используется утилита signtool.exe, но какую утилиту использовать, если цифровую подпись нужно удалить из файла? А такой утилиты официально нет. Можно только подписать или переподписать (поставить свою подпись поверх существующей), но не удалить. Как же быть, если файлик нужно подправить в Hex или PE-редакторе и не хочется оставлять файл с заведомо повреждённой цифровой подписью?

Для чего это нужно

  • Если нужно изменить подписанный файл, например исправить в нём ошибки или локализовать. После любого изменения файла цифровая подпись становится повреждённой и недействительной, поэтому лучше её убрать совсем, чем оставлять в таком виде.
  • Больше узнать о механизме подписания файлов и разобраться в его работе.
В статье описан способ ручного удаления цифровой подписи, достаточно простой, чтобы в нём мог разобраться каждый, кто хоть раз в жизни использовал Hex-редактор.

Инструменты


Для работы нам понадобятся следующие утилиты:
1. Hex-редактор. Я предпочитаю WinHex.
2. Утилита для исправления контрольной суммы PE-файла ModifyPE.
3. Шестнадцатеричный калькулятор, есть в системе.

Пример


Для примера будем удалять цифровую подпись с дистрибутива замечательной открытой и свободной программы для шифрования дисковых разделов DiskCryptor (объект выбран рандомно). Этим примером, кстати, будет видно, что удаление цифровой подписи никак не влияет на работоспособность PE-файлов.

Открываем dcrypt_setup.exe в Hex-редакторе и ищем 4-х байтную последовательность 50450000h (в тексте видно как PE с последующими двумя нулевыми байтами). Эта сигнатура идентифицирует файл как файл PE-формата и идёт сразу за заголовком MS-DOS. В данном случае начало сигнатуры находится по смещению 100h:



Следующее, что понадобится исправить после удаления цифровой подписи — это контрольная сумма файла. Она находится через 58h байт после сигнатуры PE-формата, то есть 100h + 58h = 158h, следовательно текущая контрольная сумма (тип dword, то есть занимает 4 байта) этого файла — 9F36Ch (байты переворачиваются):



Последующие два значения относятся непосредственно к цифровой подписи. Если они состоят из нулей — подписи нет. Первое находится через 40h байт после начала контрольной суммы, или 98h байт после начала сигнатуры — 100h + 98h = 198h:



Это 4-байтное значение означает смещение, по которому находится начало цифровой подписи. Сейчас оно равно 8E438h:



Второе, опять же 4-байтное значение, находится сразу же за первым:



Оно означает размер цифровой подписи, что в данном случае равно 1500h или 5376 байт. Значит конец подписи будет по смещению 8E438h + 1500h = 8F938h. Как правило цифровая подпись идёт до конца файла, проверяем:



Всё совпадает, поэтому этот блок можно смело удалить, после чего концом файла будет 8E437h:



Осталась самая малость — затереть нулями указатели смещения и размера цифровой подписи:



И скорректировать контрольную сумму с помощью утилиты ModifyPE:



Проверяем:



Готово! Теперь пакет установки программы именно такой, каким он был до подписи, байт в байт.

P. S. Не судите строго, это первый раз, в будущем качество будет расти. Конструктивная критика приветствуется.

P.P.S. Автор топика начинающий хабраюзер systracer, который попросил меня опубликовать его текст. Плюсы следует адресовать ему, минусы оставьте мне.
Tags:
Hubs:
+51
Comments18

Articles

Change theme settings