Подписание сборок.NET: действительно ли это защищает мою сборку от вмешательства?

В моем приложении реализована система "блокировки", которая защищает мое приложение от копирования и незаконного использования. Система проверяет подпись аппаратного кода и ожидает, что он будет подписан с помощью закрытого ключа, которым владеет только моя компания. (Приложение имеет открытый ключ для проверки подписи.)

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

  1. Поскольку я не видел, чтобы CLR когда-либо говорил о недействительности подписи сборки, я хочу убедиться, что эта система действительно работает. Является ли? Что я должен сделать, чтобы это работало?
  2. Может ли злоумышленник сосредоточить свои усилия на CLR, чтобы он не заботился о моей подписи? То есть, если он не может вмешаться в мой код, потому что я подписал его, может ли он вмешаться в CLR?
  3. В общем, я хотел бы узнать ваш опыт о таких защитных и защитных технологиях. Кто-нибудь может предложить что-нибудь еще?

4 ответа

Решение

Подписание сборки предназначено для того, чтобы приложения / сборки могли ссылаться на сборку и быть уверенными, что они получают сборку, на которую они изначально ссылались. Если кто-то хочет, он может теоретически декомпилировать все ваше приложение и перекомпилировать без подписи. (то есть: они могли бы перекомпилировать ссылочную сборку так, чтобы она ссылалась на неподписанную версию ссылочной сборки).

Затем они смогут изменить код так, как они хотят, потому что клиент (exe) теперь будет ссылаться на неподписанную (или "повторно подписанную") dll.

Чтобы сделать процесс декомпиляции и перекомпиляции более сложным, вы можете попробовать создать сборку C++/CLI в смешанном режиме, содержащую как управляемый, так и собственный код. Но да... в конечном итоге у людей есть все ваши двоичные файлы, и, прилагая достаточные усилия, они могут обойти любую систему лицензирования, которую вы придумали.

Существует определенное количество заблуждений о подписанных сборках. Подпись сборки не является, как указал Маккенир, безопасным механизмом, который нужно использовать для предотвращения подделки ваших сборок. Следующая статья о codeproject дает довольно хорошее рассмотрение предмета:

http://www.codeproject.com/KB/security/StrongNameExplained.aspx

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

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

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

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

Некоторые обфускаторы, такие как Crypto Obfuscator, используют эту технику с функцией шифрования строк. Он использует открытый ключ вашей сборки для шифрования всех строк. Если открытый ключ был изменен или удален, расшифровка не удастся, и ваше приложение даже не запустится.

Другие вопросы по тегам