- Хроники. - -

Защищаем .NET программы.

Posted By Ikutsin On 23 сентября 2009 @ 17:39 In .NET C# | Comments Disabled

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

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

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

ldasm <-> ilasm

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

NGEN

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

Обфускация

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

Анти ildasm

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

Утилита NETZ

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

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

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

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

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

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

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

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

И еще:

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

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

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


Article printed from Хроники.:

URL to article: /1008-zashhishhaem-net-programmy

URLs in this post:

[1] Reflector: http://www.red-gate.com/products/reflector/

[2] NGEN: http://ru.wikipedia.org/wiki/Ngen

[3] о реверсинге после Дотфускатора: http://www.cracklab.ru/art/?action=view&id=350

[4] NETZ: http://madebits.com/netz/index.php

[5] здесь: http://www.csharp411.com/net-assembly-faq-part-3-strong-names-and-signing/

[6] здесь: http://sharptoolbox.com/categories/code-protectors-obfuscators

Copyright © 2008 Все, что меня окружает. All rights reserved.