Могу ли я удалить цифровую подпись из библиотеки DLL?

Моя сборка установщика «подписывает» DLL с помощью сертификата подписи кода в процессе сборки.

Я заметил, что если я попытаюсь построить дважды подряд, вторая сборка не удастся, потому что DLL уже подписана, поэтому код захлопнется. Очевидно, я могу исправить это, подписав копию DLL в сборке, но проблема меня заинтриговала:

Можно ли "отписать" DLL, а если нет, то почему ...?


person Roddy    schedule 04.12.2008    source источник


Ответы (6)


signtool remove /s C:\path\to.exe.or.dll

signtool доступен в Windows SDK и должен быть как минимум из комплекта Windows 8 SDK (версия 6.2.9200.20789), чтобы команда remove поддерживалась.

person vine'th    schedule 21.10.2016
comment
Хм, где вы видели команду удаления для singtool.exe? Какая это версия? Не могли бы вы связать это? Насколько я могу судить, ваша существующая ссылка не показывает его. - person Nikola Davidovic; 10.02.2017
comment
Хм, использовать signtool /? чтобы увидеть варианты. @NikolaDavidovic - person vine'th; 20.02.2017
comment
Ну, в нем нет команды remove. Убедитесь сами. Его нет в указанной вами ссылке. Итак, я спрашиваю, какую версию signtool.exe вы использовали, когда писали этот ответ? Проверял с версией продукта 6.1.7600.16385. - person Nikola Davidovic; 20.02.2017
comment
Я использую командную строку Visual Studio: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>signtool /? Usage: signtool <command> [options] Valid commands: sign -- Sign files using an embedded signature. timestamp -- Timestamp previously-signed files. verify -- Verify embedded or catalog signatures. catdb -- Modify a catalog database. remove -- Remove embedded signature(s) or reduce the size of an embedded signed file. For help on a specific command, enter "signtool <command> /?" - person vine'th; 21.02.2017
comment
Спасибо @ wine'th за ответ. Да, signtool.exe из комплекта SDK для Windows 8 (версия 6.2.9200.20789) имеет команду remove, а также более поздние версии. Поэтому для того, чтобы иметь к нему доступ, вы должны скачать как минимум версию SDK для windwos 8. К сожалению, мне не удалось найти страницу MSDN, документирующую команду remove. - person Nikola Davidovic; 21.02.2017
comment
@ Vine'th Это не выглядит слишком безопасным, если вы можете просто удалить подпись. Значит, это может сделать любой пользователь, не так ли? - person JConstantine; 11.11.2020
comment
@JConstantine сертификат в основном используется, чтобы указать: этот файл был одобрен определенным органом. Когда какой-либо неопределенный пользователь удаляет сертификат, появляется индикация: этот файл был изменен недоверенной стороной. Я не вижу в этом проблемы. В конце концов, это правда. - person grek40; 21.01.2021

Вы можете использовать delcert.exe из этого сообщения форума XDA.

вот небольшой инструмент, который удаляет (удаляет) цифровой знак (Authenticode) из исполняемых файлов PE, таких как * .exe, * .dll, * .mui и т. д.

person smartins    schedule 06.04.2012
comment
Этот инструмент использует ImageRemoveCertificate API и отлично работает. - person zig; 30.12.2015
comment
И это даже идет с исходниками, отлично. - person VZ.; 19.08.2016

Достаточно легко удалить подпись из файла .dll с помощью ImageRemoveCertificate API.

В ваших тегах не указан какой-либо язык, но в этой статье показано, как реализовать его на C #. Удаление цифровой подписи из файла с помощью C #

Кроме того, если вы ищете простой инструмент, который сделает эту работу за вас, вы можете использовать FileUnsigner.

person coolmine    schedule 04.02.2013

Другой возможный вариант - переключиться на SignTool. exe. Он поставляется с Windows SDK, и подписание уже подписанного двоичного файла делает не генерировать ошибку. Я использую signtool.exe в процессе сборки и не испытываю никаких трудностей с ним, даже если что-то уже подписано.

Также ознакомьтесь с вопросом В чем основное различие между кодом знака .exe и signtool.exe?

person jveazey    schedule 11.03.2011

Конечно, это возможно, но не тривиально.

Хотя проще было бы сохранить копию заранее подписанной DLL.

Эта цифровая подпись представляет собой не более чем дополнительный раздел, добавляемый в конец PE-файла. Вы можете написать программу, которая удаляет подпись, если хотите.

Это не так просто, как обрезать файл; вам необходимо удалить ссылки на подпись в заголовке файла. Это может усложниться, если у DLL есть несколько подписей, и вы просто хотите удалить одну.

Формат PE-файла опубликован здесь

person Die in Sente    schedule 27.01.2009
comment
Спасибо. Не совсем ответ, на который я надеялся (например, просто запустите UNSIGNTOOL), но теперь я лучше осведомлен! - person Roddy; 28.01.2009

Проверьте, поддерживает ли ваш инструмент сборки функцию «Повторная подпись». Это должно заменить все существующие подписи.

В противном случае вы можете использовать Stud_PE, чтобы удалить блок подписи. Откройте DLL или EXE в Stud_PE, перейдите на вкладку разделов, щелкните правой кнопкой мыши раздел цифровой подписи и выберите «Удалить раздел». Однако для этого требуется взаимодействие с пользователем. Старые версии инструмента могли уничтожить файл.

person Thomas Weller    schedule 27.03.2012