Для подписи PE-файлов (exe, dll, sys и другие) в большинстве случаев используется утилита signtool.exe, но какую утилиту использовать, если цифровую подпись нужно удалить из файла? А такой утилиты официально нет. Можно только подписать или переподписать (поставить свою подпись поверх существующей), но не удалить. Как же быть, если файлик нужно подправить в Hex или PE-редакторе и не хочется оставлять файл с заведомо повреждённой цифровой подписью?
Для работы нам понадобятся следующие утилиты:
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, который попросил меня опубликовать его текст. Плюсы следует адресовать ему, минусы оставьте мне.
Для чего это нужно
- Если нужно изменить подписанный файл, например исправить в нём ошибки или локализовать. После любого изменения файла цифровая подпись становится повреждённой и недействительной, поэтому лучше её убрать совсем, чем оставлять в таком виде.
- Больше узнать о механизме подписания файлов и разобраться в его работе.
Инструменты
Для работы нам понадобятся следующие утилиты:
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, который попросил меня опубликовать его текст. Плюсы следует адресовать ему, минусы оставьте мне.