Цифровая подпись программ

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ErrorNeo, 6 Mar 2010.

  1. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    957
    Likes Received:
    843
    Reputations:
    402
    как подписать программу?
    на самом деле, в общем-то, не сложно.

    вам нужны только несколько утилит от Microsoft:
    Cert2Spc.Exe
    makecert.exe
    PVKIMPRT.EXE
    signtool.exe

    распространяющихся бесплатно, длл-ка
    capicom.dll
    прилагающаяся к signtool.exe, ну и..
    батник следующего содержания:

    Code:
    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. готово.

    то, что вы увидите в консоли будет выглядеть примерно так:
    Code:
    с:\цифровая подпись>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
    Для продолжения нажмите любую клавишу . . .
    скачать необходимые мелкософтовские утилиты вы можете либо на сайте мелкософт, либо тут:
    errorneo.com/files/sign.zip или www.sendspace.com/file/dlfaxt
    (батник тоже в архиве)

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

    Для чего вам это?
    исключительно для красоты, т.к. Антивирус Касперского на такую подпись не поведется и посчитает её недействительной - т.е. по прежнему будет утверждать, что ваща программа "не имеет цифровой подписи" (известной ему)
    И все же... так солиднее ;) :cool:
    Ну а чтобы Касперский не ругался на вашу программу - подписывать надо не свежесгенеренным сертификатом на "Корпорацию Майкрософт", а сертификатом, выданным вам кем-либо, уже имеющим такой зарегистрированный сертификат.

    ps.
    благодарю slesh за то, что когда-то помогал мне с этим разобраться.
     
    #1 ErrorNeo, 6 Mar 2010
    Last edited: 17 Mar 2010
    10 people like this.
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,704
    Likes Received:
    1,224
    Reputations:
    455
    Кстати цифровые подписи довольно удобны в некоторых моментах.
    А именно:
    1) дополнительная инфа о проге или её авторстве которое должны проверять другие проги
    2) Часто юзаю ЭЦП для защиты какойнить мощной проги. т.е. прога состоит из монитора и основной части. Основная часть подписана, а монитор при запуске основной части проверяет её подпись и если она не совпадает то отказывает работать с ней.
    С одной стороны это даёт защиту от поражения проги вредоносными программа или другими изменениями. Ну и отчасти удобно идентифицировать клиентов кому была продана она.
     
    2 people like this.
  3. Dark Koder

    Dark Koder New Member

    Joined:
    23 Dec 2009
    Messages:
    17
    Likes Received:
    1
    Reputations:
    0
    а есть ли какие нибудь еще методы подписки?
     
  4. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,005
    Likes Received:
    444
    Reputations:
    94
    перезалей плиз набор. а вообще что-то плохо верится, что удастся так подписать. Я когда некоторое время назад смотрел, понял так, что нужно где-то платно заявляться, просить сертификат у всяких VeriSign'ов... короче проще wintrust.dll пропатчить :)
     
  5. gold-goblin

    gold-goblin Elder - Старейшина

    Joined:
    26 Mar 2007
    Messages:
    918
    Likes Received:
    172
    Reputations:
    3
    Можно по подробней?
     
  6. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,005
    Likes Received:
    444
    Reputations:
    94
    ну проверка подлинности - это функа WinVerifyTrust из wintrust.dll
    >>If the trust provider verifies that the subject is trusted for the specified action, the return value is zero.
    патчим её на xor eax, eax; ret 14... или не 14... и пусть всё принимается
     
  7. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,704
    Likes Received:
    1,224
    Reputations:
    455
    я юзал подписание и нормально всё идет. Фишка в том, что создать ключ для цифровой подписи может любой чел. И он может спокойно подписывать им что хочет, другое дело состоит в том, что проверить подлинность ключа можно тока через инет, через спец конторы. А так как мы туда ключ не добавляли, то и проверку эту он завалит.

    Так что можно ключ юзать чисто для контроля целостности.
     
  8. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,704
    Likes Received:
    1,224
    Reputations:
    455
    Я юзаю вот такой вот код для проверки:
    Code:
    BOOL VerifySignature(wchar_t* pwszSourceFile)
    {
    	BOOL ret;
    	LONG lStatus;
    	DWORD dwLastError;
    	
    	WINTRUST_FILE_INFO FileData;
    	memset(&FileData, 0, sizeof(FileData));
    	FileData.cbStruct = sizeof(WINTRUST_FILE_INFO);
    	FileData.pcwszFilePath = pwszSourceFile;
    	FileData.hFile = NULL;
    	FileData.pgKnownSubject = NULL;
    	
    	GUID WVTPolicyGUID = WINTRUST_ACTION_GENERIC_VERIFY_V2;
    	WINTRUST_DATA WinTrustData;
    	
    	memset(&WinTrustData, 0, sizeof(WinTrustData));
    	WinTrustData.cbStruct = sizeof(WinTrustData);
    	WinTrustData.pPolicyCallbackData = NULL;
    	WinTrustData.pSIPClientData = NULL;
    	WinTrustData.dwUIChoice = WTD_UI_NONE;
    	WinTrustData.fdwRevocationChecks = WTD_REVOKE_NONE; 
    	WinTrustData.dwUnionChoice = WTD_CHOICE_FILE;
    	WinTrustData.dwStateAction = 0;
    	WinTrustData.hWVTStateData = NULL;
    	WinTrustData.pwszURLReference = NULL;
    	WinTrustData.dwProvFlags = WTD_SAFER_FLAG;
    	WinTrustData.pFile = &FileData;
    	
    	lStatus = WinVerifyTrust(NULL,&WVTPolicyGUID,&WinTrustData);
    	
    	ret = true;
    	
    	if (lStatus == TRUST_E_NOSIGNATURE)
    	{
    		dwLastError = GetLastError();
    		if (TRUST_E_NOSIGNATURE == dwLastError ||
    			TRUST_E_SUBJECT_FORM_UNKNOWN == dwLastError ||
    			TRUST_E_PROVIDER_UNKNOWN == dwLastError) 
    		{
    			ret = false;
    		}
    	}
    	
    	return ret;
    }
    
    
     
    2 people like this.
  9. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    малацы оба 8)
     
  10. ErrorNeo

    ErrorNeo Elder - Старейшина

    Joined:
    2 May 2009
    Messages:
    957
    Likes Received:
    843
    Reputations:
    402
    добавил зеркало на sendspace.
    Для того, чтобы тебя подписали _нормальным_ сертификатом - да, нужно изголяться, что-то кому-то платить, регистрироваться.. (не связывался) Но и проверку такой серт сможет пройти.
    Ну а тот способ, что приведен тут - просто позволяет сгенерировать серт "в домашних условиях". "Проверки" никакой этот серт не пройдет... но все же это - серт:)
     
    1 person likes this.
  11. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,704
    Likes Received:
    1,224
    Reputations:
    455
    а ты не пробовал ввести пароль?
     
  12. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    989
    Likes Received:
    1,109
    Reputations:
    327
    это да если тя не успели проинлайнить
     
  13. crypt0n

    crypt0n Member

    Joined:
    20 Feb 2010
    Messages:
    40
    Likes Received:
    5
    Reputations:
    0
    а что собой представляет серитфикат с точки зрения pe файла? это в хидере записывается?
     
  14. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,704
    Likes Received:
    1,224
    Reputations:
    455
    цифровая подпись - это блок данных находящийся за пределами исполняемой части программы. т.е. после последней секции находится он. типа оверлея. И содержит в себе кучу всякой хрени включая контрольную сумму файл. в PE никак не отмечается присутствие или отсутствие цифровой подписи.
     
  15. altblitz

    altblitz Elder - Старейшина

    Joined:
    5 Jun 2009
    Messages:
    3,378
    Likes Received:
    2,777
    Reputations:
    231
    естесственно, сертификацию не пройдет.

    есть GPG и Web Of Trust.
    программы, перед установкой и запуском - проверяются по MD5/SHA1 ключу. Линукс же.
     
  16. Toxa33rus

    Toxa33rus Member

    Joined:
    31 Mar 2012
    Messages:
    41
    Likes Received:
    6
    Reputations:
    0
    Вот тут http://www.hackzone.ru/forum/open/id/16030/ обещают подписать файл тру сертификатом, после чего файл не будет палиться антивирусом. На сколько можно этому верить?
    А еще такой вопрос: сертификат выдается на время или постоянно будет действовать?
     
  17. VladimirV

    VladimirV Well-Known Member

    Joined:
    1 Apr 2013
    Messages:
    1,130
    Likes Received:
    5,936
    Reputations:
    57
    День добрый!
    Сегодня понадобилось прикрутить подпись. На последнем этапе введения пароля активны только кнопки "Назад" и "Отмена", вводишь пароль и подтверждение - матерится что пароль не совпадает. Ввод пароля во все поля тоже не дал результата.
    Нашел выход добавлением в последней строке батника /p XXX (XXX-Пароль) но тогда пароли нужно вводить везде!!!
    signtool.exe sign /v /f sert.pfx /p XXX /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Generic Host Process for Win32 Services" /v program.exe
     
    #17 VladimirV, 16 Jul 2013
    Last edited: 16 Jul 2013
  18. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    989
    Likes Received:
    1,109
    Reputations:
    327
    эти подписи - самопальные и никакой силы не имеют. драйвер, например, подписанный такой подписью будет послан нах и загружен конечно не будет.

    а сертификаты надо оформлять у центров сертификации, ибо это тоже самое что паспорт.
     
  19. Zeeman

    Zeeman New Member

    Joined:
    21 Apr 2011
    Messages:
    11
    Likes Received:
    1
    Reputations:
    0
    Добрый вечер, господа! Решил вклиниться в разговор т.к. тема актуальная.
    Использовал алгоритм из 1 поста за исключением того что вместо отсутствующей утилиты PVKIMPRT использовал pvk2pfx.
    Вместо Generic Host Process и "Корпорация Майкрософт" поставил свои данные (допустим, "Рога и Копыта LTD") т.к. задача у меня скорее поднять ЧСВ в глазах потенциальных пользователей софта, а не втюхать гадость под видом софта от мелкомягких.

    Файл установщика подписан, свойства - цифровые подписи показывает сертификат на Рога и Копыта подаисанный Symantec Time Stamping Services Signer.
    На WinXP все как было, без изменений, на Windows 8 ругается IE (на малоизвестный бинарник) и сама винда (Контроль учетных записей) сообщает что Издатель - неизвестно хотя мне нужно чтобы отображался издатель "Рога и Копыта" (пусть даже с сообщением что сертификат не является доверенным). Это реально сделать?
    В свойствах цифровой подписи пишет что цепочка обработана но прервана на корневом, который не является доверенным.
     
Loading...