Как защитить DLL?

Как защитить DLL моего проекта таким образом, чтобы они не могли ссылаться и использоваться другими людьми?

Спасибо

Ответы

Ответ 1

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

Очевидные вещи, которые вы, возможно, захотите рассмотреть (примерно в порядке возрастания сложности и уменьшения правдоподобия), включают:

  • Статическая ссылка, чтобы не было DLL для атаки.
  • Разделите все символы.
  • Используйте файл .DEF и библиотеку импорта, чтобы иметь только анонимный экспорт, известный только их идентификаторами экспорта.
  • Храните DLL в ресурсе и выставляйте его в файловой системе (под подходящим неясным именем, возможно даже сгенерированным во время выполнения) только при запуске.
  • Скрыть все реальные функции за методом factory, который обменивает секрет (лучше, доказательство знания секретности) для таблицы указателей функций на реальные методы.
  • Используйте методы отладки, заимствованные из мира вредоносных программ, чтобы предотвратить обратное проектирование. (Обратите внимание, что это, скорее всего, приведет к ложным срабатываниям из AV-инструментов.)

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

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

РЕДАКТИРОВАТЬ:. Поскольку вы переделали, чтобы подразумевать, что С# и .NET являются средой, а не чистой библиотекой Win32, написанной на C, тогда я действительно должен пересмотреть вышеописанное значение "You Can not, Но..."

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

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

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

Ответ 2

Вы сталкиваетесь с той же проблемой, что и сторонники DRM.

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

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

Ответ 3

Взгляните на StrongNameIdentityPermissionAttribute. Это позволит вам объявить доступ к вашей сборке. В сочетании с хорошим инструментом защиты кода (например, CodeVeil (отказ от продажи я продаю CodeVeil)), вы будете вполне довольны.

Ответ 4

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

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

Ответ 5

Ну, вы можете отметить все ваши "общедоступные" классы как "внутренние" или "защищенные внутренние", а затем пометить сборки с помощью [assembly: InternalsVisibleTo ("")] Атрибут, и никто, кроме отмеченных сборок, не сможет увидеть содержимое.

Ответ 6

Вы пробовали реагент .Net? Я недавно наткнулся на это. Некоторые люди говорят, что это здорово, но я все еще проверяю это.