Ответ 1
Короткий ответ заключается в том, что помимо очевидных вещей, вы не можете многое сделать.
Очевидные вещи, которые вы, возможно, захотите рассмотреть (примерно в порядке возрастания сложности и уменьшения правдоподобия), включают:
- Статическая ссылка, чтобы не было DLL для атаки.
- Разделите все символы.
- Используйте файл .DEF и библиотеку импорта, чтобы иметь только анонимный экспорт, известный только их идентификаторами экспорта.
- Храните DLL в ресурсе и выставляйте его в файловой системе (под подходящим неясным именем, возможно даже сгенерированным во время выполнения) только при запуске.
- Скрыть все реальные функции за методом factory, который обменивает секрет (лучше, доказательство знания секретности) для таблицы указателей функций на реальные методы.
- Используйте методы отладки, заимствованные из мира вредоносных программ, чтобы предотвратить обратное проектирование. (Обратите внимание, что это, скорее всего, приведет к ложным срабатываниям из AV-инструментов.)
Независимо от этого, достаточно определенный пользователь все еще может найти способы его использования. Порядочный дизассемблер быстро предоставит всю необходимую информацию.
Обратите внимание, что если ваша DLL действительно является COM-объектом или, что еще хуже, средой CLR, тогда существует огромная информация о типе времени выполнения, которую вы не можете удалить, не нарушая ее предполагаемого использования.
РЕДАКТИРОВАТЬ:. Поскольку вы переделали, чтобы подразумевать, что С# и .NET являются средой, а не чистой библиотекой Win32, написанной на C, тогда я действительно должен пересмотреть вышеописанное значение "You Can not, Но..."
В течение долгого времени существовал рынок инструментов для обфускации, чтобы иметь дело с средами, где доставка компилируемого источника является обязательной, но вы не хотите предоставлять полезный источник. Есть продукты С#, которые играют на этом рынке, и похоже, что хотя бы один из них вошел.
Поскольку для загрузки сборки требуется столько усилий из фреймворка, вполне вероятно, что есть биты разрешений, которые оказывают определенное влияние на честных поставщиков и потребителей ассемблий. Я не видел никакого обсуждения реальной безопасности, предоставляемой этими методами, и просто не знаю, насколько они эффективны против определенной атаки.
Многое будет зависеть от вашего варианта использования. Если вы просто хотите предотвратить случайное использование, вы можете найти решение, которое будет работать для вас. Если вы хотите защитить ценные коммерческие секреты от обратного проектирования и повторного использования, вы не можете быть так счастливы.