Приветствие section .data msg: DB 'Hello, LZT!', 10 msgSize EQU $ - msg global start section .text start: mov rax, 0x2000004 ; function 4 mov rbx, 1 ; stdout mov rcx, msg ; msg mov rdx, msgSize ; size int 0x80 mov rax, 1 ; function 1 mov rbx, 0 ; code int 0x80 ret Code section .data msg: DB 'Hello, LZT!', 10 msgSize EQU $ - msg global start section .text start: mov rax, 0x2000004 ; function 4 mov rbx, 1 ; stdout mov rcx, msg ; msg mov rdx, msgSize ; size int 0x80 mov rax, 1 ; function 1 mov rbx, 0 ; code int 0x80 ret Я - новокек с некоторыми знаниями в области крипта. Зайдя на формум впервые, я, мягко говоря, был шокирован отсутствием такой важной статьи, как гайд по созданию собственной цифровой подписи. Первая мысль, пришедшая в голову, подсказывала, что это просто никому не нужно, так как подписи, не выданные центром сертификации, сильно отличаются от тех, что можно сгенерить на своём компьютере - нет абсолютного траста антивирусов, смартскрин в большинстве случаев так не обойти (есть метод, скорее всего, будет статья по этой теме), если глубоко покопаться в свойствах файла, будет виден значок о недействительности. Несмотря на всё это, такие подписи могут хорошо снизить детекты, поэтому вы сейчас и находитесь этой странице. Что понадобится: Компуктер на винде Интернет, чтобы прочитать эту статью Руки (любые, можно ноги) Что ж, приступаем. Создаём папку и файл в ней с расширением .cnf: [ req ] distinguished_name = req_distinguished_name prompt = no x509_extensions = v3_ca [ req_distinguished_name ] C = страна в две буквы, пример - KZ ST = штат/провинция/город, если нет штата L = город O = компания CN = кем выдан (Пример - RootCA) [ v3_ca ] keyUsage = critical, keyCertSign, cRLSign basicConstraints = critical, CA:TRUE Code [ req ] distinguished_name = req_distinguished_name prompt = no x509_extensions = v3_ca [ req_distinguished_name ] C = страна в две буквы, пример - KZ ST = штат/провинция/город, если нет штата L = город O = компания CN = кем выдан (Пример - RootCA) [ v3_ca ] keyUsage = critical, keyCertSign, cRLSign basicConstraints = critical, CA:TRUE Это наш корневой сертификат для подписи дочерних. Качаем OpenSSL тут, устанавливаем, добавляем в path папку C:\Program Files\OpenSSL-Win64\bin или аналогичную. Проверяем, что команда доступна в папке с файлом конфигурации. Генерируем связку сертификат + ключ: openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout имя_рут_ключа.key -out имя_рут_серта.crt -config имя_рут_конфига.cnf Code openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout имя_рут_ключа.key -out имя_рут_серта.crt -config имя_рут_конфига.cnf Если вы правильно скопипастили команду, должны пойти плюсы с точками: Если вкратце, это рандом для генерации ключей шифрования. Теперь создаём ещё один .cnf, но уже для подписи кода: [ req ] distinguished_name = req_distinguished_name prompt = no [ req_distinguished_name ] C = страна ST = штат/провинция/город L = город O = компания CN = кем выдан [ v3_req ] keyUsage = critical, digitalSignature extendedKeyUsage = critical, codeSigning subjectKeyIdentifier = hash Code [ req ] distinguished_name = req_distinguished_name prompt = no [ req_distinguished_name ] C = страна ST = штат/провинция/город L = город O = компания CN = кем выдан [ v3_req ] keyUsage = critical, digitalSignature extendedKeyUsage = critical, codeSigning subjectKeyIdentifier = hash Делаем приватный ключ дочернего сертификата и запрос на сам сертификат к корневому: openssl req -newkey rsa:2048 -nodes -keyout имя_дочернего_ключа.key -out -out имя_запроса.csr -config имя_дочернего_кфг.cnf Code openssl req -newkey rsa:2048 -nodes -keyout имя_дочернего_ключа.key -out -out имя_запроса.csr -config имя_дочернего_кфг.cnf Должны снова пойти плюсы с точками. Одобряем запрос: openssl x509 -req -sha256 -days 365 -in имя_запроса.csr -CA имя_рут_серта.crt -CAkey рут_серт.key -CAcreateserial -out имя_серта.crt -extfile имя_дочернего_конфига.cnf -extensions v3_req Code openssl x509 -req -sha256 -days 365 -in имя_запроса.csr -CA имя_рут_серта.crt -CAkey рут_серт.key -CAcreateserial -out имя_серта.crt -extfile имя_дочернего_конфига.cnf -extensions v3_req Я указал 365 дней, число может быть другим. Нужный нам ответ - Certificate request self-signature ok и данные вашего сертификата. Конвертируем всю эту кашу в один сертиикат: openssl pkcs12 -export -out имя_сертификата.pfx -inkey дочерний_ключ.key -in дочерний_серт.crt -password pass:пароль Code openssl pkcs12 -export -out имя_сертификата.pfx -inkey дочерний_ключ.key -in дочерний_серт.crt -password pass:пароль Должен появиться файл .pfx - это и есть сертификат. Теперь вы можете удалить все остальные файлы и начать подписывать код. Качаем signtool здеся, билд вырезан из Windows SDK. Добавляем в path. Закидываем в папку с сертификатом наш .exe и подписываем его: signtool sign /v /f "имя_сертификата.pfx" /p пароль /fd sha256 /tr http://timestamp.digicert.com /td sha256 имя_файла.ехе Code signtool sign /v /f "имя_сертификата.pfx" /p пароль /fd sha256 /tr http://timestamp.digicert.com /td sha256 имя_файла.ехе В свойствах файла видим такую подпись: Таким образом вы можете защитить легитимный софт или понизить количество детектов малвари. Пожалуй, на этом всё. До скорого