Как защитить дллс? - PullRequest
       34

Как защитить дллс?

14 голосов
/ 30 апреля 2009

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

Спасибо

Ответы [ 7 ]

20 голосов
/ 30 апреля 2009

Короткий ответ таков: кроме очевидных вещей, вы мало что можете сделать.

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

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

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

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

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

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

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

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

12 голосов
/ 30 апреля 2009

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

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

Вы, конечно, можете сделать неудобным выполнение этого реверс-инжиниринга, и этого вполне может быть достаточно.

5 голосов
/ 30 апреля 2009

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

3 голосов
/ 30 апреля 2009

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

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

1 голос
/ 25 августа 2009

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

1 голос
/ 30 апреля 2009

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

0 голосов
/ 30 апреля 2009

Вас может заинтересовать следующая информация о собраниях друзей: http://msdn.microsoft.com/en-us/library/0tke9fxk(VS.80).aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...