Как я могу защитить свои сборки.NET от декомпиляции?
Первое, что я узнал первым, когда начал работать с C#, было самым важным. Вы можете декомпилировать любую сборку.NET с помощью Reflector или других инструментов. Многие разработчики не знают об этом факте, и большинство из них шокированы, когда я показываю им их исходный код.
Защита от декомпиляции все еще остается сложной задачей. Я все еще ищу быстрый, простой и безопасный способ сделать это. Я не хочу запутывать свой код, поэтому имена моих методов будут a, b, c или около того. Reflector или другие инструменты вообще не должны распознавать мое приложение как сборку.NET. Я уже знаю о некоторых инструментах, но они очень дорогие. Есть ли другой способ защитить мои приложения?
РЕДАКТИРОВАТЬ:
Причина моего вопроса не в том, чтобы предотвратить пиратство. Я только хочу помешать конкурентам читать мой код. Я знаю, что они будут, и они уже сделали. Они даже сказали мне это. Может быть, я немного параноик, но деловые конкуренты, читающие мой код, не дают мне чувствовать себя хорошо.
12 ответов
Нужно иметь в виду, что вы хотите сделать это таким образом, чтобы это имело смысл для бизнеса. Для этого вам нужно определить свои цели. Итак, каковы ваши цели?
Предотвращение пиратства? Эта цель не достижима. Даже нативный код может быть декомпилирован или взломан; Множество Warez, доступных онлайн (даже для таких продуктов, как Windows и Photoshop), является доказательством того, что решительный хакер всегда может получить доступ.
Если вы не можете предотвратить пиратство, то как насчет просто уменьшить его? Это тоже ошибочно. Требуется только один человек, взломавший ваш код, чтобы он был доступен каждому. Тебе нужно каждый раз везти. Пиратам повезло только один раз.
Я поставил это перед вами, цель должна состоять в том, чтобы максимизировать прибыль. Вы, кажется, полагаете, что прекращение пиратства необходимо для этого усилия. Это не. Прибыль - это просто выручка за вычетом затрат. Прекращение пиратства увеличивает расходы. Это требует усилий, что означает добавление стоимости где-то в процессе, и таким образом уменьшает эту сторону уравнения. Защита вашего продукта также не способствует увеличению вашего дохода. Я знаю, что вы смотрите на всех этих пиратов и видите все деньги, которые вы могли бы заработать, если бы вместо этого они заплатили бы ваши лицензионные сборы, но реальность такова, что этого никогда не произойдет. Здесь есть некоторая гипербола, но обычно считается, что пираты, которые не могут взломать вашу безопасность, либо найдут аналогичный продукт, который они могут взломать, либо без него. Вместо этого они никогда не купят его, и поэтому они не отражают потерянные продажи.
Кроме того, защита вашего продукта фактически снижает доход. Для этого есть две причины. Одним из них является небольшой процент клиентов, которые испытывают проблемы с вашей активацией или безопасностью, и поэтому решают не покупать снова или не просят вернуть свои деньги. Другой - небольшой процент людей, которые на самом деле пробуют пиратскую версию программного обеспечения, чтобы убедиться, что она работает перед покупкой. Ограничение пиратского распространения вашего продукта (если вы каким-то образом сможете добиться успеха в этом) не позволяет этим людям когда-либо пробовать ваш продукт, и поэтому они никогда его не купят. Кроме того, пиратство может также помочь распространению вашего продукта среди более широкой аудитории, что позволит охватить больше людей, которые будут готовы платить за него.
Лучшая стратегия состоит в том, чтобы предположить, что ваш продукт будет пиратским, и подумать о том, как воспользоваться ситуацией. Еще пара ссылок по теме:
Как я могу предотвратить кражу моего кода?
Защита приложения.NET
На работе здесь мы используем Dotfuscator от PreEmptive Solutions.
Хотя невозможно защитить.NET сборки, 100% Dotfuscator делает это достаточно сложно, я думаю. Я пришел с множеством методов запутывания;
Перекрестное переименование сборки
Схемы переименования
Переименование префикса
Усиленная индукция перегрузки
Инкрементное запутывание
Отчет по переименованию HTML
Контроль потока
Строковое шифрование
И оказалось, что они не очень дороги для небольших компаний. У них есть специальные цены для небольших компаний.
(Нет, я не работаю в PreEmptive;-))
Конечно, есть бесплатные альтернативы;
Как предотвратить декомпиляцию любого приложения на C#
В значительной степени описывает всю ситуацию.
В какой-то момент код должен быть переведен в байт-код виртуальной машины, и пользователь может получить его.
Машинный код тоже не сильно отличается. Хороший интерактивный дизассемблер / отладчик, такой как IDA Pro, делает прозрачным практически любое собственное приложение. Отладчик достаточно умен, чтобы использовать AI для определения общих API, оптимизации компилятора и т. Д. Он позволяет пользователю тщательно перестраивать конструкции более высокого уровня из сборки, сгенерированной из машинного кода.
И IDA Pro в некоторой степени поддерживает.Net.
Честно говоря, после нескольких лет работы над проектом реверс-инжиниринга (для обеспечения совместимости) главное, что я получил из своего опыта, - это то, что мне, вероятно, не стоит слишком беспокоиться о людях, крадущих мой код. Если кто-то захочет, это никогда не будет очень трудно получить независимо от того, какую схему я реализую.
Никакой обфускатор не сможет защитить ваше приложение, даже ни одно из описанных здесь. Посмотрите эту ссылку, это deobsfuscator, который может deobsfuscate почти каждый obsfuscator там.
https://github.com/0xd4d/de4dot
Лучший способ, который может вам помочь (но помните, что они также не являются полноправными) - это использовать смешанные коды, кодировать ваши важные коды на неуправляемом языке и создавать DLL, как в C или C++, а затем защищать их с помощью Armageddon или Themida. Themida не для каждого взломщика, это один из лучших защитников на рынке, он также может защитить ваше программное обеспечение.NET.
Я знаю, что вы не хотите запутывать, но, возможно, вам стоит проверить dotfuscator, он возьмет ваши скомпилированные сборки и запутает их для вас. Я думаю, что это может даже зашифровать их.
Мы используем {SmartAssembly} для защиты.NET распределенного приложения корпоративного уровня, и оно отлично сработало для нас.
Я слышал о некоторых проектах, которые напрямую компилируют IL в нативный код. Вы можете получить дополнительную информацию из этого поста: возможно ли скомпилировать код.NET IL в машинный код?
Если вы хотите полностью защитить свое приложение от декомпиляции, посмотрите на Hasp от Aladdin. Вы можете обернуть свои сборки в зашифрованную оболочку, доступ к которой может получить только ваше приложение. Конечно, интересно, как они могут это сделать, но это работает. Однако я не знаю, защищают ли они ваше приложение от вложений / размышлений во время выполнения, что Crack.NET может сделать.
- Edit. Также будьте осторожны с компиляцией в нативный код в качестве решения... также есть декомпиляторы для нативного кода.
У тебя API?
Вместо того чтобы пытаться защитить один файл ddl в одном из ваших продуктов на всех устройствах ваших клиентов, почему бы не создать службу API для ваших ценных функций продукта? Пусть фактический продукт, сохраненный на устройстве, использует этот API для доставки продукта так, как вы этого хотите.
Я думаю, что таким образом вы на 100% уверены, что ваш код не декомпилирован, и вы устанавливаете свои собственные ограничения в своем API, чтобы разработчики / хакеры не использовали ваш API так, как вы этого не хотите.
Конечно, это еще немного работы, но в конце концов, вы все под контролем.
Если кто-то должен украсть ваш код, это, вероятно, означает, что ваша бизнес-модель не работает. Что я имею в виду под этим? Например, я покупаю ваш продукт, а затем прошу поддержки. Вы слишком заняты или считаете, что мой запрос недействителен и является пустой тратой времени. Я расшифрую ваш продукт, чтобы поддержать мой относительный бизнес. Ваш продукт становится более ценным для меня, и я расставляю приоритеты, чтобы решить бизнес-модель использования вашего продукта. Я перекодирую и переименую ваш продукт, а затем выхожу и зарабатываю деньги, которые вы решили оставить на столе. Есть причины для защиты кода, но, скорее всего, вы смотрите на проблему с неправильной точки зрения. Конечно же. Ты "кодер", а я деловой человек.;-) Ура!
пс. Я тоже разработчик. то есть "кодер"
Помимо перечисленных здесь продуктов сторонних производителей, есть еще один: NetLib Encryptionizer. Однако это работает не так, как обфускаторы. Обфускаторы модифицируют саму сборку с помощью встроенного в нее "двигателя" деобфускации. Encryptionizer шифрует библиотеки DLL (управляемые или неуправляемые) на уровне файлов. Таким образом, он не изменяет DLL, кроме как для ее шифрования. "Движок" в данном случае - это драйвер режима ядра, который находится между вашим приложением и операционной системой. (Отказ от ответственности: я из NetLib Security)