Картинка блога

Рано или поздно у разработчика появляется желание защитить свою интеллектуальную собственность от посторонних глаз. В мире нативного (native, unmanaged) кода, эта задача более или менее решаема. Как обстоят дела в .NET?

В качестве вступления

Любая программа написанная на .NET собирается в CLR сборку, которая выполняется виртуальной машиной. Тут все как в обычном файле приложения: заголовок, секции, ассемблер, но немного другие. Как и в других технологиях, выполняемых под виртуальной машиной, защитой можно считать запутывание имен методов и переменных, сокрытие метаданных, запутывание де-компилятора, шифрование и упаковка. Все эти способы актуальны и для .NET. Еще один способ, это преобразование Managed кода — в Unmanaged, с шифрованием как в обычном нативном коде. Скажу сразу, меня постигло огромное разочарование в этом вопросе.

ldasm <-> ilasm

Эти программы включены в любую Visual Studio. Они позволяют работать с  .NET ассемблером. ildasm — дизассемблирует, ilasm — собирает файл. Не буду вдаваться в подробности, их достаточно в интернете. Идея взята из дизассемблера для flash: диассемблировать сборку и использовать не стандартные команды смещения, вызова функций и ветвления, так, чтобы такие программы как Reflector не смогли де-компилировать код. Я не нашел в интернете ничего подобного для .NET, истинна может быть где-то в cpblk, calli, tail calls.

NGEN

NGEN предназначен для перевода Managed кода в Managed чтобы избежать накладных расходов на JIT компилятор. Как и ildasm он поставляется вместе с Visual Studio. Бытует мнение, что с помощью NGEN можно перевести сборку в Unmanaged код и спокойно зашифровать. Это не так, ngen можно использовать только на той машине, которая собственно и будет запускать приложение.

Обфускация

С тем-же .NET идет Dotfuscator Community Edition. В такой версии, эта штука меняет названия переменных, методов и классов, делая реверсинг, как-бы запутанней. Все метаданные остаются, навигация по коду — тоже. Однако, есть возможность определить классы, которые не надо обфусцировать, это полезно для интерфейсов фасада и файлов ресурсов, к которым Windows Form Designer обращается не строго типизированного, а в кавычках. Других бесплатных обфускаторов в мире по всей видимости нет.

Анти ildasm

В природе есть программы-протекторы, стирающие метаданные сборки и шифрующие строковые переменные. Но в Open Source мире таких пока нет. Подобные программы могут стоить и 400$ и 2000$. Трал версии можно не пробовать, скорее всего обработанные сборки будут работать только на вашей машине. После обработки, сборку уже не открыть в обычном Reflector-е. Но никто не мешает снять дамп программы после расшифровки прямо из памяти. Такой подход очень хорошо известен и не раз описывался в Хакере. Вот еще полезная статья о реверсинге после Дотфускатора.

Утилита NETZ

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

Виртуализация

Этот подход помог многим программам обзавестись portable версиями. Виртуализация позволяет собрать все зависимости в один файл, так, чтобы не потребовалось никаких сторонних библиотек для ее запуска. Например, можно создать приложение на .NET которое можно будет запускать без предустановленного фрейм-ворка. Так как получается эдакая каша из кода и сборок, разобраться в логике становится тяжело. Так как бесплатных решений нет, ссылок тоже нет.

Подписка сборок (Strong Name)

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

В качестве заключения

Код, которые выполняется на машине пользователя защитить не возможно, мало того, бесплатными средствами даже не возможно толком усложнить задачу реверсинга. Так что:

  • Переносим ценную логику на сервер.
  • Пишем ценную логику на C++. Умельцев разобраться в native коде, гораздо меньше.

И еще:

Reverse Engineering является легальным в ЕС (Reverse Engineering is LEGAL in the EU according to directives in order to promote interoperation and competition).

Список коммерческих «протектеров», «пакеров» и «криптеров» можно посмотреть здесь

Был бы рад подискутировать на эту тему.

Метки:, ,

8 комментариев в “Защищаем .NET программы.”

  1. Бесплатных версий обфускаторов гораздо больше, чем один Community Edition. Зачастую как раз обфускация присутствует в бесплатных вариантах, а вот более продвинутые техники запутывания, шифрования и прочее в платных.

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

    Так же можно упаковывать код, а лучше упаковщиком собственного производства.

    По поводу подписи, можно повставлять в сборку проверки на валидность токена, это конечно мелочь но усложнит взлом еще на несколько минут.

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

  2. Спасибо Roman за ваши дополнения. Reactor действительно дешевле своих собратьев, сборка не открывается в Reflector-е, интересно можно ли получить дамп памяти. Я пробовал кормить exe файл с Windows Forms и включенным anti dizassemble без обфускации в версии 3.8, файл перестал работать. Обработанные библиотеки продолжали работать.

  3. Еще одна статья на эту тему http://www.gotdotnet.ru/LearnD.....25201.aspx

  4. На счет дампа память сразу не скажу. А вот про реактор — я делал винформс приложение с его настройками по умолчанию, — защитил, релектор ругается при открытии на отсуствие CLI заголовка. Это при выключенной обфускции и включенной защите. Тоже использую версию 3.8. В таклм случае насколько я понимаю он упаковывает управляемый файл в неуправляемую exe. Это конечно хорошо, но думаю он кладет управляемую сборку в ресурсы. И по дампу из памяти можно вычислить наш код.

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

    За статью спасибо, читал ее. Но к ней есть несколько замечаний, например распространенное заблуждение на счет ngen-a. Из того что там написано использовал Xenocode, но не смог интегрировать его безплатный вариант в MSBuild. А так вроде не плохой но нужно проверять.

    Вообще честно говоря нужно после кажого обфускатора и применения его различных настроек самому запускать рефлектор и проверять за ним, особенно если касается библиотек.

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

  5. Кстати обменяемся ссылками. Вот тема на , там есть неплохой ответ, она самый первый и народ его достаточно высоко заценил, на мой взгляд тоже достаточно толковый.

  6. Сорри тег скушало
    Вот: http://stackoverflow.com/quest.....ngineering

  7. Маммочка… как это все сложно.. голова закипает… как в этом всем разобраться простому смертному… во всех этих защитах и т.д.?

  8. Вот ссылки на тему в хабру:
    http://habrahabr.ru/blogs/net/74204/
    http://habrahabr.ru/blogs/net/74463/