Инструменты / стратегия обфускации .NET

В моем продукте есть несколько компонентов: ASP.NET, приложение Windows Forms и служба Windows. Примерно 95% кода написано на VB.NET.

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

То, что я знаю, мне следует искать до сих пор:

  • Сериализация / десериализация . В моем текущем решении я просто говорю инструменту не скрывать какие-либо члены данных класса, потому что боль от невозможности загрузить данные, которые были ранее сериализованы, просто слишком велика.
  • Интеграция с процессом сборки
  • Работа с ASP.NET . Раньше я обнаруживал, что это проблематично из-за изменения имен .dll (у вас часто по одному на страницу), с которым не все инструменты справляются хорошо.

Ответов (25)

Решение

Вернувшись к .Net 1.1, обфускация была необходима: декомпилировать код было легко, и вы могли перейти от сборки к IL, к коду C# и снова скомпилировать его с очень небольшими усилиями.

Теперь с .Net 3.5 я совсем не уверен. Попробуйте декомпилировать сборку 3.5; то, что вы получаете, очень далеко от компиляции.

Добавьте оптимизацию из 3.5 (намного лучше, чем 1.1) и то, как анонимные типы, делегаты и т. Д. Обрабатываются отражением (перекомпиляция - кошмар). Добавьте лямбда-выражения, «магию» компилятора, например Linq-синтаксис var, и функции C# 2, например yield (что приводит к появлению новых классов с нечитаемыми именами). Ваш декомпилированный код далек от компилируемого.

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

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

Пользуюсь smartassembly. По сути, вы выбираете dll, и она возвращает ее в запутанном виде. Кажется, все работает нормально, и пока проблем не было. Очень и очень проста в использовании.

Я перепробовал почти все обфускаторы на рынке, и SmartAssembly, на мой взгляд, лучший.

У меня не было проблем со Smartassembly.

Последние два дня я экспериментировал с расширенной версией Dotfuscator Community Edition (которую можно загрузить бесплатно после регистрации базовой версии CE, которая идет в комплекте с Visual Studio).

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

Я попытался запутать реальный проект, основанный на VSTO в Excel, с интеграцией Virtual Earth, множеством вызовов веб-сервисов, контейнером IOC и множеством размышлений. Это было невозможно.

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

Вот документ от самой Microsoft. Надеюсь, что это поможет ... это с 2003 года, но, возможно, все еще актуально.

бесплатный способ - использовать dotfuscator из визуальной студии, иначе вам придется пойти и купить обфускатор, например Postbuild ( http://www.xenocode.com/Landing/Obfuscation.aspx )

SmartAssembly великолепен, я использовался в большинстве моих проектов

Есть хорошая версия с открытым исходным кодом под названием Obfuscar. Вроде нормально работает. Типы, свойства, поля, методы могут быть исключены. Оригинал здесь: https://code.google.com/p/obfuscar/ , но поскольку он, кажется, больше не обновляется

Я обнаружил, что Agile.Net обеспечивает довольно хорошую защиту для вашей сборки .Net, поскольку предлагает не только обфускацию, но и шифрование. Скачайте бесплатную трассу.
http://secureteam.net/NET-Code-Protection.aspx http://secureteam.net/downloads.aspx

Если вы ищете бесплатную версию, вы можете попробовать DotObfuscator Community Edition, которая поставляется с Visual Studio или Eazfuscator.NET .


С 29 июня 2012 года Eazfuscator.NET стал коммерческим. Последняя доступная бесплатная версия - 3.3.

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

Мы пробовали DotFuscator Pro, SmartAssembly, XenoCode, Salamander и несколько небольших приложений, названия которых ускользают от меня.

Честно говоря, я убежден, что обфускация - это большой хакер.

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

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

Нашим выбором был Xenocode, и если бы я снова сделал этот выбор сегодня, я бы предпочел не запутывать код или использовать Dotfuscator.

Еще я использую SmartAssembly. Я обнаружил, что Ezrinz .Net Reactor намного лучше подходит для меня в приложениях .net. Он запутывает, поддерживает Mono, объединяет сборки, а также имеет очень хороший модуль лицензирования для создания пробной версии или привязки лицензии к конкретной машине (очень легко реализовать). Цена также очень конкурентоспособная, и когда мне нужна была поддержка, они работали быстро. Эзириз

Чтобы было ясно, я просто клиент, которому нравится продукт, и никак не связан с компанией.

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

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

"Dotfuscation" в основном работает путем скремблирования имен функций и переменных. Вероятно, это лучше, чем публиковать код с информацией уровня отладки, когда Reflector буквально отказывается от вашего исходного кода. Но все, что вы делаете сверх этого, скорее всего, приведет к уменьшению отдачи.

Недавно я попытался связать вывод одного бесплатного обфускатора с другим бесплатным обфускатором, а именно с Dotfuscator CE и новым обфускатором Babel на CodePlex. Подробнее в моем блоге .

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

У нас есть многоуровневое приложение с интерфейсом asp.net и winform, которое также поддерживает удаленное взаимодействие. У меня не было проблем с использованием какого-либо обфускатора, за исключением типа шифрования, который генерирует загрузчик, который может быть проблематичным во всевозможных неожиданных отношениях и, на мой взгляд, просто не стоит того. На самом деле мой совет был бы больше похож на «Избегайте шифрования обфускаторов типа загрузчика, таких как чума». :)

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

Мы использовали несколько в течение многих лет в наших коммерческих приложениях и остановились на обфускаторе Spices от 9rays.net, потому что цена подходящая, он выполняет свою работу и у них хорошая поддержка, хотя мы действительно не нуждались в поддержке в течение многих лет, но, честно говоря Я не думаю, что действительно имеет значение, какой обфускатор вы используете, проблемы и кривая обучения одинаковы, если вы хотите, чтобы он работал правильно с удаленным взаимодействием и asp.net.

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

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

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

Вы также можете изучить новые технологии защиты кода, такие как Metaforic и ViLabs, и новые технологии защиты программного обеспечения от копирования, такие как ByteShield . Раскрытие информации: я работаю в ByteShield.

Еще пользуюсь smartassembly. Однако я не знаю, как это работает для веб-приложения. Однако я хотел бы отметить, что если ваше приложение использует защиту условно-бесплатного типа, убедитесь, что оно не проверяет лицензию с логическим возвратом. это слишком легко взломать байтом. http://blogs.compdj.com/post/Binary-hack-a-NET-executable.aspx

Я сейчас по колено в этом, пытаюсь найти хорошее решение. Вот пока мои впечатления.

Xenocode - у меня есть старая лицензия на Xenocode2005, которую я использовал для обфускации моих сборок .net 2.0. Он отлично работал на XP и был достойным решением. Мой текущий проект - .net 3.5, и я использую Vista, служба поддержки посоветовала мне попробовать, но версия 2005 года даже не работает в Vista (вылетает), поэтому теперь я должен купить PostBuild2008 по невероятной цене. 1900 долларов. Это может быть хороший инструмент, но я не собираюсь выяснять. Слишком дорогой.

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

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

Dotfuscator Pro - Не удалось найти цену на сайте. В настоящее время ведутся переговоры о получении цитаты. Звучит зловеще.

Confuser - проект с открытым исходным кодом, который работает довольно хорошо (чтобы запутать ppl, как следует из названия).

Примечание: ConfuserEx, как сообщается, "сломан" в соответствии с проблемой № 498 в их репозитории GitHub.

Вы можете использовать «Dotfuscator Community Edition» - он по умолчанию входит в Visual Studio 2008 Professional. Вы можете прочитать об этом по адресу:

http://msdn.microsoft.com/en-us/library/ms227240%28VS.80%29.aspx
http://www.preemptive.com/dotfuscator.html

«Профессиональная» версия продукта стоит денег, но лучше.

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

Короткий ответ: вы не можете.

Существуют различные инструменты, которые затруднят чтение вашего кода кому-то, на некоторые из которых указывалось в других ответах.

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

Crypto Obfuscator решит все ваши проблемы и сценарии. Это :

  1. Автоматически исключает типы / члены из обфускации на основе правил. Сериализованные типы / поля - одно из них.
  2. Его можно интегрировать в процесс сборки с помощью MSBUild.
  3. Поддерживает проекты ASP.Net.

Мне пришлось использовать защиту от обфускации / ресурсов в моем последнем rpoject, и я обнаружил, что Crypto Obfuscator - хороший и простой в использовании инструмент. Проблема сериализации - это только вопрос настроек этого инструмента.

Избегайте реактора. Это совершенно бесполезно (и да, я заплатил за лицензию). Xenocode был лучшим из тех, с которыми я столкнулся, и для которого я тоже купил лицензию. Поддержка была очень хорошей, но она мне не нужна, просто работала. Я протестировал все обфускаторы, которые смог найти, и пришел к выводу, что xenocode, несомненно, был самым надежным и выполнял лучшую работу (а также возможность отправить процесс вашего .NET exe в собственный exe, который я больше нигде не видел).

Между реактором и ксенокодом есть два основных различия. Во-первых, Xenocode действительно работает. Во-вторых, скорость выполнения ваших сборок ничем не отличается. С реактором это было примерно в 6 миллионов раз медленнее. У меня также сложилось впечатление, что на реакторе работал один человек.