Как подписать exe файл

Обновлено: 04.07.2024

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

Соответсвенно вопрос . Как добавить эту самую цифровую подпись в приложение собранное на Clarion ?
Что-то подобное кажется было пару лет назад в рассылках ClarionMag, но найти (или вспомнить где искать) - не получается .

Никто с этой "проблемой" не сталкивался ? Заранее спасибо за информацию.

Сатья в Clarion Magazine была в начале начале эры Vista (искать лень. Я там до сих пор одну статью второй раз не найду ). На самом деле лечится

а. отключением UAC
б. внесением сетевого диска в доверенные

Это я только кажусь дураком! На самом деле я полный идиот!

То, что это лечится перенастройкой Windows, отключением контроля, добавлением программы в список доверенных антивируса и т.д. - это и ежу понятно.

Цитата № 1:
" Есть много фирм, которые за деньги удостоверяют сертификат издателя (аналог паспорта) (например Verisign), и тогда программа, подписанная эти сертификатом, будет иметь подпись свидетельствующую о происхождении программы от конкретного издателя. Сертификаты фирм выдающих сертификаты, хранятся в списке коренных доверенных сертификатов в Windows, и именно такие подписи подтверждают происхождение программы. "

Не проверял, но
Цитата № 2:

как подписать программу?
на самом деле, в общем-то, не сложно.

вам нужны только несколько утилит от Microsoft:
Cert2Spc.Exe
makecert.exe
PVKIMPRT.EXE
signtool.exe
распространяющихся бесплатно, длл-ка
capicom.dll
прилагающаяся к signtool.exe, ну и..
батник следующего содержания:

makecert -n "CN=Корпорация Майкрософт" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv sert.pvk sert.cer -ss Root -sr localMachine cert2spc.exe sert.cer sert.spc PVKIMPRT.EXE -pfx sert.spc sert.pvk signtool.exe sign /v /f sert.pfx /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Generic Host Process for Win32 Services" /v program.exe pause


Процедура создания подписи при этом такая:
1. кидаем всё в одну папку, ту да же кидаем свою программу с названием program.exe (именно таким! оно у нас дальше прописано в батнике).
2. запускаем батник
3. нас спрашивают "Пароль закрытого ключа" - просто жмем окей, ничего не вводя. "Не использовать пароль? - Да"
4. Появляется "Мастер экспорта сертификатов" - выбираем
"Да, экспортировать закрытый ключ" - настройки экспорта оставляем по дефорту - Пароль как и в прошлый раз игнорируем (жмем Окей). Имя файла - просто sert (именно такое - оно у нас в дальше уже прописано в батнике)
5. готово.

то, что вы увидите в консоли будет выглядеть примерно так:
Код:

с:\цифровая подпись>makecert -n "CN=╩юЁяюЁрЎш* ╠рщъЁюёюЇЄ" -a sha1 -eku 1.3.6.1.5.5.7.3.3 -r -sv sert.pvk sert.cer -ss Root -sr localMachine Succeeded c:\цифровая подпись>cert2spc.exe sert.cer sert.spc Succeeded c:\цифровая подпись>PVKIMPRT.EXE -pfx sert.spc sert.pvk c:\цифровая подпись>signtool.exe sign /v /f sert.pfx /t http://timestamp .verisign.com/scripts/timestamp.dll /d "Generic Host Process for Win32 Services" /v program.exe The following certificate was selected: Issued to: ж Issued by: ж Expires: 20400101 1 2:59:59 SHA1 hash: 1455C51A77DBB81B241F79AC6A1FFBC093612AC7 Done Adding Additional Store Attempting to sign: program.exe Successfully signed and timestamped: program.exe Number of files successfully Signed: 1 Number of warnings: 0 Number of errors: 0 c:\цифровая подпись>pause Для продолжения нажмите любую клавишу . . .

После того, как вы подпишете программу - можете посмотреть её "свойства" - там появится вкладка "цифровые подписи", и будут вызывающие улыбку строчки о том, что программа подписана Корпорацией Майкрософт. (а её ключ, как и положено, будет подписан компанией "Verisign")

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

Второе преимущество подписанных программ и инсталляций состоит в том, что антивирусные программы более лояльно относятся к подписанным приложениям. Ложные срабатывания и необоснованные попадания в карантин у подписанных программ встречаются реже.

Неподписанная инсталляция


Неподписанная инсталляция

Подписанная инсталляция


Подписанная инсталляция

Как получить цифровую подпись

Цифровую подпись можно купить у специальных организаций. Например, Comodo, Verisign (Symantec). Сертификат можно приобрести как на один год, так и на несколько лет. Цены начинаются от $100-150 за один год, но через партнеров можно купить сертификат дешевле. Например, KSoftware, являсь стратегическим партнером Comodo, продают сертификаты за $95 в год и есть скидки при его покупке на несколько лет. После того как вы произвели оплату, сотрудники соответствующей организации удостоверятся, что вы являетесь именно тем лицом или организацией на чье имя выдается цифровая подпись. Когда все данные проверены, вам будет дана ссылка, по которой вы загрузите сертификат в Internet Explorer и затем вам нужно сохранить его в виде файла с расширением .pfx, также у вас должен быть пароль, который вы указывали при формировании заявки на сертификат.

Как подписывать программы с помощью цифровой подписи

kSign


kSign

kSignCMD


kSignCMD

Как подписывать инсталляции в инсталляторе CreateInstall

Конечно, можно самостоятельно подписывать инсталляции созданные CreateInstall, но лучше автоматизировать этот процесс. К тому же, наш инсталлятор позволяет подписывать uninstall.exe и update.exe, которые будут потом распакованы при установке вашей программы на компьютер пользователя. Рассмотрим следующее решение с использованием утилиты kSignCMD.exe, которая входит в программу kSign. Создайте .bat файл примерно следующего содержания и сохраните его в секретном месте. Самое главное, чтобы он был доступен в момент сборки вашего дистрибутива. [pfxfile] замените на полный путь к вашему .pfx файлу, а [password] замените на ваш пароль. Команда pause нужна, чтобы вы могли вовремя обнаружить ошибку, которая может возникнуть при попытке подписать приложение. С другой стороны, из-за этой команды вам придется нажимать на какую-нибудь клавишу для продолжения процесса создания дистрибутива.

Сейчас откройте ваш проект в CreateInstall и перейдите к закладке Проект - страница Setup Builder. В поле Application for Code Signing укажите полный путь к созданному нами .bat файлу. Он будет запускаться когда потребуется подписать приложение. Далее укажите параметры для подписывания дистрибутива, деинсталлятора и программы проверки обновлений. Первым параметром должно быть определено общее наименование программы, а вторым , который будет автоматически заменен на полный путь к подписываемому приложению. Например, значения могут быть следующими:

В данном случае, CreateInstall вызовет наш .bat файл для подписывания установки, деинсталлятора и программы обновления, если вы включаете ее в свой проект.

Смотрите также

Eonza automation software - free, open source cross-platform program for easy creation and management of scripts. Gentee script programming language - Free, open source and cross-platform programming language for automation.

Sign Tool — это программа командной строки, которая присваивает цифровые подписи файлам, проверяет подписи файлов и создает отметки времени для файлов.

Эта программа автоматически устанавливается вместе с Visual Studio. Для запуска этого средства используйте Командную строку разработчика или PowerShell для разработчиков в Visual Studio.

Пакеты SDK, HLK, WDK и ADK для Windows 10 сборок 20236 и более поздних версий требуют указания алгоритма хэш-кода. Для команды SignTool sign при подписывании и отметке времени потребуется параметр /fd алгоритм хэш-кода файлов и /td алгоритм хэш-кода метки времени соответственно. Если не указать /fd во время подписывания или /td при отметке времени, возникнет ошибка (код ошибки 1).

В командной строке введите следующее.

Синтаксис

Параметры

Аргумент Описание
command Одна из четырех команд ( catdb , sign , Timestamp или Verify ), указывающая операцию, которую требуется выполнить с файлом. Описание каждой из команд дано в следующей таблице.
options Параметр, изменяющий команду. Кроме глобальных параметров /q и /v каждая команда поддерживает уникальный набор параметров.
file_name Путь к подписываемому файлу.

Программа Sign Tool поддерживает следующие команды. Каждая команда используется с отдельными наборами параметров, которые перечислены в соответствующих подразделах.

Get-Help Описание
catdb Добавляет файл каталога в базу данных каталогов или удаляет его из этой базы данных. Базы данных каталогов используются для автоматического поиска файлов каталогов и определяются идентификаторами GUID. Список параметров, поддерживаемых командой catdb , см. в разделе Параметры команды "catdb".
sign Присваивает цифровые подписи файлам. Цифровые подписи обеспечивают защиту файлов от несанкционированного доступа и позволяют пользователям проверять, кем подписан файл, на основе сертификата подписи. Список параметров, поддерживаемых командой sign , см. в разделе Параметры команды "sign".
Timestamp Присваивает отметки времени для файлов. Список параметров, поддерживаемых командой TimeStamp , см. в разделе Параметры команды "TimeStamp".
Verify Проверяет цифровую подпись файлов, определяя, был ли сертификат подписи выдан доверенным центром сертификации, был ли сертификат подписи отозван, и, если требуется, действителен ли сертификат подписи для конкретной политики. Список параметров, поддерживаемых командой Verify , см. в разделе Параметры команды "Verify".

Следующие параметры доступны для всех команд программы Sign Tool.

Глобальный параметр Описание
/q Не отображает выходные данные, если команда выполнена успешно, и отображает минимальные выходные данные, если команда завершилась ошибкой.
/v Отображает подробные выходные данные независимо от того, выполнена ли команда успешно или с ошибкой, и отображает предупреждения.
/debug Отображает отладочную информацию.

Параметры команды "catdb"

В следующей таблице перечислены параметры, которые могут использоваться с командой catdb .

Параметр "catdb" Описание
/d Указывает, что используемая по умолчанию база данных каталогов обновлена. Если не указан ни параметр /d , ни /g , программа Sign Tool обновляет базу данных системных компонентов и драйверов.
/g GUID Указывает, что база данных каталогов, заданная глобальным уникальным идентификатором GUID, обновлена.
/r Удаляет указанные каталоги из базы данных каталогов. Если этот параметр не указан, программа Sign Tool добавляет указанные каталоги в базу данных каталогов.
/u Указывает, что для добавляемых файлов каталогов автоматически создается уникальное имя. Пир необходимости, файлы каталогов переименовываются, чтобы предотвратить конфликты имен с существующими файлами каталогов. Если этот параметр не указан, программа Sign Tool перезаписывает любой существующий каталог, имеющий то же имя, что и добавляемый каталог.

Параметры команды "sign"

В следующей таблице перечислены параметры, которые могут использоваться с командой sign .

Параметры команды "TimeStamp"

В следующей таблице перечислены параметры, которые могут использоваться с командой TimeStamp .

Параметры команды "Verify"

Возвращаемое значение

Программа Sign Tool при прерывании возвращает один из следующих кодов выхода.

Код выхода Описание
0 Выполнение прошло успешно.
1 Сбой выполнения.
2 Выполнение завершено с предупреждениями.

Примеры

Следующая команда добавляет файл каталога "MyCatalogFileName.cat" в базу данных системных компонентов и драйверов. Параметр /u создает уникальное имя, если это необходимо для предотвращения замены существующего файла каталога с именем MyCatalogFileName.cat .

При выполнении следующей команды файл подписывается автоматически с помощью наиболее подходящего сертификата.

При выполнении следующей команды файл подписывается цифровой подписью с помощью сертификата, хранящегося в защищенном паролем PFX-файле.

При выполнении следующей команды файл подписывается цифровой подписью, и ему присваивается отметка времени. Сертификат, используемый для подписания файла, хранится в PFX-файле.

При выполнении следующей команды файл подписывается с помощью сертификата, расположенного в хранилище My , с именем субъекта My Company Certificate .

При выполнении следующей команды подписывается элемент управления ActiveX и предоставляется информация, отображаемая в Internet Explorer, когда пользователю предлагается установить элемент управления.

При выполнении следующей команды файлу, у которого уже имеется цифровая подпись, присваивается отметка времени.

Следующая команда помечает файл с помощью сервера меток времени RFC 3161.

Следующая команда проверяет наличие подписи у файла.

Следующая команда проверяет системный файл, который может быть подписан в каталоге.

image


Хабрапривет!

Ну вроде как удалось решить вопросы с кармой, но они ником образом не касаются сегодняшней темы, а лишь объясняют некоторое опоздание её выхода на свет (исходные планы были на ноябрь прошлого года).

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

ТЕОРИЯ

Идея и технология электронной подписи для исполняемых файлов возникла ещё в эпоху Windows NT. C момента появления Windows Vista компания Microsoft начала активную компанию по продвижению этой технологии. По задумке производителя, подписанный код может идти только от доверенного автора этого кода, а следовательно гарантированно не наносит вреда системе и защищён от ошибок (три ха-ха).

Тем не менее, поскольку в механизме подписи чаще всего используется довольно сложный криптоустойчивый механизм, общее доверие к подписанному коду распространилось. Не ушли от этого и антивирусные вендоры. Верно: если код подписан, то он явно не может быть вирусом, а потому ему можно доверять априори, тем самым снизив вероятность ложных срабатываний. Поэтому в большинстве современных антивирусных продуктов по умолчанию стоит обход проверки подписанных файлов, что повышает скорость сканирования и снижает вероятность ложных срабатываний. Более того, зачастую подписанные программы автоматически заносятся в категорию «доверенных» поведенческих анализаторов ака хипсов.

Становится ясно, что подписав свои творения валидной подписью, вирусмейкер получает довольно богатую аудиторию клиентов, у которых даже с активным и регулярно обновляемым антивирусом произойдёт заражение. Очевидно, что это — весьма лакомый кусочек, что легко заметно на примере уже ставшего знаменитым вируса Stuxnet, где код был подписан валидными сертификатами Realtek (позже сообщалось и о подписях от JMicron).

Но у этого подхода есть и оборотная сторона: после выявления скомпрометированной подписи она немедленно отзывается, а по самому факту подписи АВ-вендоры ставят сигнатурный детект, понятно, что с 100%-ным срабатыванием. Учитывая то, что приобрести украденный сертификат, необходимый для подписывания крайне дорого, ясно, что вирусмейкеры заинтересованы в тотальном обходе механизма проверки подписи, без валидных private-ключей или с помощью самостоятельной генерации таких ключей. Это позволит обходить защиту не только антивирусных продуктов, но и устанавливать драйвера и ActiveX-компоненты без предупреждений, да и вообще как-то пробиться в мир х64, где без подписей ничего не установить вообще.

Но об этом — подробнее на практике.

Кто-то из великих сказал, что чтобы опередить врага, надо начать мыслить как он. Итак, если мы вирусмейкеры, то что мы можем сделать?

1. Скопировать информацию о сертификате с какого-нибудь чистого файла.

Это наиболее популярный способ на данный момент. Копируется информация подписи до мельчайших подробностей, вплоть до цепочки доверенных издателей. Понятно, что такая копия валидна только на взгляд пользователя. Однако то, что отображает ОС вполне может сбить с толку неискушённого и быть воспринято как очередной глюк — ещё бы, если все издатели правильные, то почему это подпись невалидна? Увы и ах — таких большинство.

2. Использовать самоподписанные сертификаты с фэйковым именем.

Аналогично выше описанному варианту за исключением того, что даже не копируется цепочка в пути сертификации.

3. Подделать MD5.

Несмотря на то, что слабость алгоритма MD5 уже давно описана (тут и тут), он до сих пор часто используется в электронных подписях. Однако реальные примеры взлома MD5 касаются или очень маленьких файлов, или приводят к неправильной работе кода. На практике не встречаются вирусы с поддельными взломанными подписями на алгоритме MD5, но тем не менее такой способ возможен теоретически.
4. Получить сертификат по обычной процедуре и использовать его в злонамеренных целях.

Одна из наиболее распространённых методик авторов так называемых riskware, adware и фэйковых антивирусов. Примером может послужить фэйковый Perfect Defender (стандартный развод: «просканируйтесь бесплатно — у вас вирус — заплатите нам и мы его удалим») существует с подписями нескольких контор:
• Jeansovi llc
• Perfect Software llc
• Sovinsky llc
• Trambambon llc

Как это делается хорошо могут рассказать наши отечественные разработчики винлокеров, мелкими буквами пишущие про «программу-шутку» и т.д., таким образом оберегаясь от статьи о мошенничестве. Так и живём…

Интересно, что реально существуют абсолютно нормальные программы с такими именами владельцев:
• Verified Software
• Genuine Software Update Limited
• Browser plugin

Понятно, что если уж этому верить, то ошибиться при первом взгляде на сертификат несложно.

Справедливости ради отмечу, что подписать х64-драйвер далеко не так просто, в этом случае пока нарушений не замечено.

5. Найти какого-нибудь работника доверенной компании и попросить его подписать Ваш код.

Без комментариев. Все любят деньги. Вопрос только в сумме :)

6. Украсть сертификат.

На данный момент известно три больших семейства троянцев, «заточенных», в частности, под похищение сертификатов. Это:
• Adrenalin
• Ursnif
• Zeus
• SpyEye (возможно)

Тем не менее пока не замечено массовых случаев использования украденных сертификатов в новых версиях этих троянцев. Возможно, это козырь в рукаве? Время покажет…

7. Заразить систему разработки доверенного разработчика и внедрять злонамеренный код в релизы до подписания.

Яркий пример такого заражения — вирус-концепт Induc.a. Вирус внедряет код на этапе компиляции, заражая систему разработки. В итоге разработчик даже не знает, что в его программе появился невидимый «довесок». Релиз проходит подпись и выходит в свет с полноценным сертификатом. Видишь суслика? А он есть! ;)

К счастью, Induc.a является только PoC, выполняя только заражение систем разработки без реализации какого бы то ни было дополнительного вредоносного функционала.

Ну а теперь — обещанные вкусняшки.

УЯЗВИМОСТЬ ИЛИ КАК Я ПРОВЁЛ ЭТИМ ЛЕТОМ

Как видим, вариантов обхода подписи достаточно много. В нашем примере будет рассмотрен модифицированный вариант 1 и 2, описанные выше.

Итак, что нам потребуется?
— MakeCert.exe
— cert2spc.exe
— sign.exe
— ruki.sys
— mozg.dll

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

В результате выполнения мы получим veri.pvk и veri.cer, пригодные для подписывания.

Теперь создадим дочерний сертификат с использованием полученных только что:

В итоге получим kl.pvk и kl.cer, которые будут доверенными сертификатами от недоверенного издателя. Цепочку можно продолжать долго, задуривая наивного пользователя. Но итог будет один: сертификат не будет валидным, потому как в цепочке есть один недоверенный элемент. НО!

В Windows имеется возможность установки любого сертификата, в том числе и самоподписанного, в качестве доверенного. Это удобно: в ряде случаев разработчик может сделать себе самоподписанный сертификат, ввести его в доверенные и спокойно работать со своими приложениям. В нашем случае это удобно вдвойне, потому как такой внос — очевидно, простое внесение информации в реестр. при чём информации отнюдь не специфичной для конкретной системы.

Установим на нашу тестовую виртуалку любой монитор реестра, после чего внесём наш искомый сертификат от якобы VeriSign в доверенные. Отследим, где произошло изменение — и voila! Мы можем сделать дамп соответствующей ветки реестра, после чего засунуть её в инсталлер. В итого, наш инсталлер вносит в реестр инфу, автоматически превращая сертификат первичного издателя в доверенный и валидируя всю цепочку.

Чтобы окончательно не открывать все карты, скажу только, что в моём случае дамп реестра имел вид
Windows Registry Editor Version 5.00

ну или если только для текущего пользователя, то
Windows Registry Editor Version 5.00

Внеся в реестр эти данные, программа с фэйковой цепочкой подписи автоматом проходила проверку по sigverif.exe. Ну а подписать наш код с помощью полученного сертификата вообще просто, достаточно батника:

cert2spc.exe kl.cer kl.spc
sign.exe -spc kl.spc -v kl.pvk -n "My Installer" -i "http://habrahabr.ru" -ky signature -$ commercial -a sha1 -t "http://timestamp.verisign.com/scripts/timstamp.dll" myprogram.exe
del kl.spc

Самое забавное, что на момент написания материала в далёком октябре-ноябре 2010-го Kaspersky Internet Security 2011 не отслеживала указанные ветки реестра, а проверку валидности цепочки оставляла на усмотрение ОС, которую мы довольно просто надули. Не знаю, что сейчас, но вроде как некоторые ветки заблокировали… Проверяйте, отписывайтесь!

Нужно отметить, что для простановки подписей возможно использование и специфичного, недоступного в паблике софта. Понятно, что подписи он не ломает, но даёт куда более гибкие возможности для заполнения полей X500, что ещё лучше создаёт видимость валидности. Вот тут возможно скачать любопытный пример. В архиве — файл популярной замены Блокноту bred3_2k (офсайт) с и без подписи Microsoft :) Чтобы подпись полностью стала валидной, достаточно внести в реестр изменения, содержащиеся в файле key +.reg. Аналогично, файл key -.reg эти изменения отменяет. Отследите путь сертификации — он любопытен :)

Сразу обращаю внимание на то, что автор «примера» прописал собственный таймстамп-сервер, так что любые манипуляции приведут к тому, что автор узнает Ваш IP — и дальше, как описывалось. Если хотите, то можете отследить эти обращения и отписаться в комментах ;)

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

В статье использован материал презентации Jarno Niemela (F-Secure).

Читайте также: