Pull to refresh

Защита .NET приложений — всё же, во что заворачивать селёдку?

Reading time 9 min
Views 26K

Защита .NET приложений — всё же, во что заворачивать селёдку?



В пику вот этому обзору. Решил написать собственный обзор обфускаторов, ибо считаю вышеобозначенный не только поверхностным, но и вводящим в заблуждение.
Актуален один вопрос — так ли хорошо защищает тот или иной продукт от снятия защиты? Учитывая, что производители обфускаторов честно предупреждают — сборка остается дизассемблируемой. И это краеугольный камень проблемы защиты .Net приложений. Тотальная защита приводит к неудобствам запуска сборки в разных средах, обфускация — к условной открытости кода. Остается решать задачу по усложнению получения кода, его читабельности и снятию защиты.

Итак, что мы имеем:
Есть 2 класса программ для защиты .Net приложений:
  1. Протекторы (native processor wrapper)
    Подобные машинки поставляются также в сочетании с обфускатором, достаточно слабым (предлагающим допустим обычно переименованием членов сборки, не больше). Обертка бывает различных видов, изящнее всего она представлена в Salamander Protector (здесь и обфускатор достаточно качественный), исключение в смысле слабости обфускатора — Salamander, но и здесь могут быть проблемы, как с отладкой, так и с запуском.

    Представители: CodeVeil, Salamander Protector, .Net Reactor.

    Преимущества: т. н. «недоступность» для декомпиляторов и ILDASM. Но дело в том, что эта недоступность – кажущаяся. .Net ограничивает права сборок находящиеся в оперативной памяти (in memory), сборки перед запуском надо где-то сохранять на диске – и вот тут они становятся доступны.
    Недостатки: много проблем с запуском сборки в средах с более строгими policies, неадекватное реагирование антивирусов, приводят к тому, что пользователь начинает бояться защищенные подобным образом продукты, невозможность отладки защищенной сборки. Плюс – невозможность создания защищенной сборки для работы как в 32-битной, так и в 64-битных средах. Либо то, либо другое, хотя разработчик может скомпилировать программу в конфигурации AnyCPU для работы как в 32-битной, так и в 64-битных средах. Ну и собственно – кажущиеся преимущества. Производители протекторов обычно рекомендуют обфусцировать сборки, перед тем как защищать их протектором, тем самым признавая уязвимость защиты.
  2. Обфускаторы
    Представляют более естественные для среды .Net методы защиты, после которых сборка не требует дополнительных надстроек и шаманства для запуска и отладки.

    a. Stand-alone обфускаторы, которые не используют сервисы и интерфейсы MS для доступа к метаданным и для генерации обфусцированной сборки, то есть имеющие свою машинку доступа, парсеры, генераторы и прочие инструменты для работы с .Net сборками.

    Представители: Spices.Net Obfuscator, Dotfuscator, {SmartAssembly}

    Преимущества: независимость от внешних сервисов в выборе средств защиты, широкий спектр и нестандатные подходы в защите.
    Недостатки: как честно и предупреждают ответственные производители — код остается дизассемблируемым (если не ILDASM, то каким-нибудь кустарным дизассемблером, исходники можно взять в SSCLI или Mono).

    b. Зависимые от MS сервисов (тут списк большой – от эксплуатации ILASM/ILDASM, доступа через COM, а также использования сервисов от .Net 2.0). Функционал подобных заведомо ограничен, т.к сервисы е предоставляют возможности ввернуть что-нибудь нестандартное.

    Представители: Salamander Obfuscator, Skater.Net, Demeanor от WiseOwl (это практически сейчас неизвестный обфускатор, хотя и неплохого качества, один из пионеров).

    Преимущества: не знаю, но во всяком случае Salamander предлагает неплохой обфускатор.
    Недостатки: нестабильность, зависимость от сервисов, в связи с чем ограниченность в средствах (Salamander не может работать с проектами, содержащими сборки от разных платформ, например .Net 2.0 и .Net 1.1). Плюс — те же недостатки пункта a).


Рекомендации разработчикам


Их немного: при начале разработки помните о том, что проект будет обфусцирован. Это означает, что видимость тех или иных членов сборки должна быть регламентирована, а значит – что должно быть обфусцировано, а что – нет. Основной проблемой для обфускатора является использование reflection/serialization. .Net предоставляет кучу возможностей для вызова методов, обращаясь к ним по имени, использования классов для структурированного запоминания и чтения данных. Обфускатор не может распознать подобные вещи, поэтому стоит в процессе кодирования использовать некоторые правила, для сравнительного легкого исключения из обфускации подобных случаев:
  • Классы, работающие в serialization-reflection помещать в отдельную сборку. Это нетрудно, ибо эти классы и их члены и так должны иметь публичную видимость.члены и так должны иметь публичную видимость.
  • Классы, работающие в serialization-reflection декларировать под определенным namespace и в этом случае исключать их из обфускации будет нетрудно, причем все скопом.
  • Если уж приходится использовать serialization-reflection в коде – то лучше помечать подобные методы специальным атрибутами. Не ставьте сейфовый замок на фанерную дверь. Умерьте свою паранойю. Лучше изучайте получившиеся после обфускации сборки, проверяйте классы и их члены – все ли вы скрыли от пытливого глаза, оптимизируйте найстройки, чтобы все, что нужно – было обфусцировано, скрыто и спрятано. Пробуйте открыть ILDASM-ом, reflector-ом – что видно из этих продуктов. Пробуйте сделать dump из ILDASM (если получится) – смотрите сгенерированный файл. Это нужно для понимания, насколько сложно будет изготовить из вашей сборки что-то другое, слепить код, или взять кусочек кода декомпилятором.
    Теперь насчет баланса. Ну вот возьмите Reflector, возьмите Spices.Net — вот они защищены обычным обфускатором, не протектором, и как предыдущий обозреватель написал — легко все видно в winDbg. А толку? Кто-то узнал какие-то секреты Reflector-а (а Pro версия сейчас небесплатна), кто-нибудь узнал секреты Spices.Net? А ведь эти приложения написаны в pure IL без native processor code (в отличие от Salamander).
  • Также хочется сказать некоторые вещи насчет тестирования обфускаторов — если вы попробовали некий продукт, после которого получили неработающие сборки, имеет смысл обратиться к производителю продукта, во-первых это хлеб для производителя — разбирать подобные проблемы, во-вторых — реальный шанс получить скидку (если производитель думает о клиентах), если вообще продукт забесплатно — сотрудничество всегда оплачивается. Дайте шанс производителю решить вашу проблему, это взаимовыгодно.


Вот теперь — сравнения


Сразу могу сказать, что многие представители обфускаторов не вошли в таблицу, только для того, чтобы не тратить ваше время. Да и Dotfuscator включен в этот список так как просто является продвигаемым Microsoft продуктом, хотя может далеко не всё из того, что заявляет. Будущее SmartАssembly также нельзя назвать ясным после покупки компанией Red-Gate за $1M — (имхо, сделка того не стоила). Reflector теперь обновляется редко (что хорошо разве что для общирного набора плагинов), что и будет наблюдаться и со SmartАssembly скорее всего. Зачем компании занимавшейся SQL влезать в рынок обфускаторов-декомпиляторов (хотя пакет «Обфускатор-Декомпилятор» — это продуктивный подход, он есть в Salamander, есть в Spices.Net) – ума не приложу, рынок достаточно специфичный и на нем уже умерло немало многообещающих проектов типа Decompiler.Net (даже позиции Salamander зашатались, например, они так и не выпустили технологию V-Spot Elimination, хотя в этом обзоре автор пишет, что они этим гордятся (вопрос только чем — тем что не выпустили, или типа «выпустили»? Реализовали-то и заявку на патент сделали 9Rays.Net, вообще-то).
Итак:

Возможности Dotfuscator Spices.Net Obfuscator Salamander Obfuscator {SmartAssembly}
В пробной версии Собственно Community Edition c минималистическим набором. Дает полное представление, не ораничена по функционалу (только помечает обфусцированные сборки специальной watermark – «Obfuscated by Spices.Obfuscator. Not for commercial use») и идет в полном комплекте – GUI, VS Integration, MSBuild integration, консоль и SDK.
Можно использовать бесплатно для защиты некоммерческих программ.
Ограничения – предоставляется консольная версия. Функциональные ограничения.
Интерфейс, автоматизация, интеграция Интерфейс не очень. Кратко – ugly (ну тут на вксю и цвет...).
Консольная версия присутствует. Есть возможность применения правил, но достаточно запутанная. применения правил, но достаточно запутанная.
Автоматизации нет.
Интеграция в MSBuild, интеграция с VS в виде Add-In, который не интегрируется в build-process текущего проекта.
Поставляется как в GUI версии в составе Spices.Net, так и в консоли. В GUI версии предоставляется немало дополнительных инструментов для исследования сборок.
Автоматизация есть – предоставляется пример на C# как написать собственный обфускатор с использованием машинки Spices.Net Obfuscator. Кроме этого поддерживаются ObfuscationEvents (по аналогии VS Build Events), позволяющие вставлять кастомные акции между шагами процесса обфускации.
Интеграция в MSBuild и VS присутствует – настраивать опции обфускации можно прямо в свойства проекта, включать-отключать любой проект солюшена, вообще выключать обфускацию.
Поставляется в GUI.
Консоль есть.
Автоматизации нет.
Интеграции нет.
Неплохой wizard-style простенький интерфейс.
Консоль присутствует.
Автоматизации нет.
Интеграции тоже нет.
Tamper-Resistance Модуль «стукач» поставляется в Enterprise, предназначен от внутрикорпоративных краж. Для обычного софта – достаточно отключить доступ в инет этой программе, или просто напросто удалить защиту ибо это достаточно легко. Есть. Взломанная, переименованная или подделанная сборка перестает работать. Защита как от ILASM/ILDASM roundtrip, так и от простого переименования сборки (то есть смены identity – сюда входит как ее название так и полное название в случае strong name сборки, а также номер версии).
И вот что интересно: после введения этой технологии хакнутых версий Spices.Net больше не найти, а Salamander и SmartAssembly (о да, предлагающие control flow!) — пожалуйста, лежат на варезниках.
Нет. Нет.
String Encryption Есть Есть. Дополнительно – защита ресурсов (без шифрования и компрессии, но работает
с защитой от подделки (tamper resistant))
Есть. Есть. Дополнительно – компрессия и шифрование ресурсов.
AntiILDASM, противодействие декомпиляции AntiILDASM есть, противодействия декомпиляции нет. AntiILDASM есть, противодействие декомпиляции есть (Reflector не берет, но Salamander Decompiler частично может. Автоматически защищает от Spices.Net Decompiler). АntILDASM есть, автоматически защищает от Salamander Decompiler. АntILDASM есть
Удаление неиспользуемого кода и деклараций (pruning) Может Может, гибко Может Может.
Software watermarking Может Может (с защитой от подделки – то есть используется технология TamperProof) Нет Нет
Control flow obfuscation Есть, частично распознаваемо декомпиляторами. Вместо нее предлагается технология CodeAnonymizer как более эффективное средство борьбы с декомпиляторами. Есть, но распознаваемо декомпиляторами.
Упоминается V-Spot Elimination — нереализованная технология, подобная реализованной в Spices.Net CodeAnonmizer
Есть, но распознаваемо декомпиляторами
Работа с mixed-code сборками Не очень хорошо, без оптимизации по размеру Может, с оптимизацией по размеру Есть, но бывает нестабильна Может, ограниченно (error reporting не вставляется в подобный код)
Поддержка 64-бит Есть Есть Нет Нет
Деобфускация StackTrace Нет в community edition, есть в enterprise, но не очень удобная, базирующаяся на карте обфускации Есть как инструмент Spices.Net и предлагается более детальное бесплатное решение. Нет Есть внедряемый Error Reporting модуль. Уникальная фича.
Преимущества Идет в каждой поставке с VS. В отличие от других обфускаторов – для каждой новой версии .Net выходит самым первым – инсайдер все-таки. Большой выбор средств для защиты. Две технологии, которые не предлагают другие обфускаторы. Наличие собственного неплохого декомпилятора, позволяет понимать, что обфускатор знает, что надо защищать.ать, что обфускатор знает, что надо защищать.
Из плюсов могу также назвать оперативную поддержку на русском и конструктивность в решении проблем.
Древнейший представитель, неплохое качество защиты. Простенький, идет навстречу основным потребностям маленьких разработчиков и заточен под них, но из-за этого малость негибок, хотя обладает неплохим арсеналом средств защиты.
Недостатки Неоправданно дорог. Список фичей и качество исполнения не соответствует цене.
Поддержка небесплатна.
Обилие настроек и инструментов иногда останавливает. Заточенность на профессиональное использование, а не для нужд маленьких разработчиков. Хотя для них как раз
все есть в консольной версии.
Негибкость настроек, несовременность. С выходом .Net 2.0 ребята уже бросали этот проект, но потом вышли с комбинацией Obfuscator + Protector. Не может работать с проектами различных .Net версий. На последних версиях .Net – неустойчив.
Сложно и долго идут на контакт по поддержке.
Непонятно будущее этого хорошего продукта. Отсутствие интеграции, tamper-resistance ухудшает характеристики. А ведь первое, что они могли бы предложить – защиту от reflector – Это была бы очень мощная фича.
Раньше была очень дружелюбная поддержка, сейчас не знаю.


Про цены


Специально не сравнивал цен. У Дотфускатора цены высоки и расценки за поддержку таковы, что служат барьером, судя по всему, они ориентируются на крупный корпоративный бизнес. По остальным производителям могу сказать, что тут есть место для принципа «цена – это то, что устроит и продавца и покупателя». Давно уже практикуется договариваться, чем например индусы овладели в совершенстве и давно не парятся насчет того, как купить 400-долларовый продукт за 150 баксов. Существуют недекларируемые скидки для студентов (academic discounts), для всяческих MVP и MCP, для членов user groups и сообществ, для некоммерческих организаций, региональные и национальные, за упоминание в блоге и размещение лого продукта на некторый срок. Об этом конечно производитель на сайте не пишет. В конце концов вы можете предоставить проблемный файл или наоборот — сообщить о дыре в защите, любое сотрудничество с производителем приведшее к улучшению качества продукта будет оценено.
Попробуйте попросить скидку, да обрящете. Успехов!

P. S. Есть есть желание дать инвайт опытному и хорошему человеку, активно участвовавшего в создании этой статьи — свяжитесь со мной, пожалуйста.
Tags:
Hubs:
+33
Comments 30
Comments Comments 30

Articles