Обфускация – есть такое слово
Страница 2. Плюсы и минусы обфускации


 

Плюсы и минусы

Плюсы:
Обфускаторы делают дизассемблированный код тяжелым для изучения, превращая IsLicensed() в x().
Некоторые обфускаторы используют баги ILDASM для защиты от дизассемблинга в нем (Salamander).
Некоторые обфускаторы даже конвертируют код в native код, делая бесполезным дизассемблинг (Salamander).
Некоторые обфускаторы шифруют и пакуют ваш exe и иже с ним referenced сборки в один exe-файл, так что размер программы может уменьшиться 2-4 раза и не поддается дизассемблингу (Thinstall).

Минусы
Продукт остается дизассемблируемым.
Собрать сборку после дизассемблинга не составит труда.
IL код – доступный для чтения и понимания по сравнению c ассемблерным.
«Защита» обфускаторов, которые используют баги ILDASM будут бессильны перед дизассемблерами других разработчиков.

Защита обфускаторов, которые используют шифрование символьной части метаданных, строковых и бинарных ресурсов мешает пользователям продукта, отлаживать и тестировать свои продукты. Кроме этого – это риск, так как некоторые символьные данные используются в Reflection – для получения типа (GetType(“MyType”)), или загрузки ресурса (GetManifestResourceStream(“MyResource”)).

Зачастую обфускаторы имеют кучу настроек, непонятных или сложных для понимания обычному юзеру. Неинформированность юзера может привести к тому что его обфусцированная программа будет работать не так как хотелось и иногда приводить к крэшу, да еще и не отлавливаемому отладчиком.
Цена – порядок цен – от 40 до 1500 долларов за программу. И цена может ничего не говорить о качестве обфускации. Может так статься что 40-долларовый обфускатор защитит ваш куда лучше чем более дорогой.

Насчет 4-его плюса. Защищенная таким образом прога «жестко привязана» к используемому .Net Framework, и сервис-пак установленный вами, «порушит» корректность работы защищенной программы. Да и такая защита возможна только для Intel-процессоров.

Насчет 5-го плюса. Да действительно защита сильна и лишена недостатков 4-го плюса. Продукт загружает из ресурса нужные сборки в память и managed exe файл и передает ему управление, занимаясь только разруливанием проблем со сборками, типами, ресурсами (через AssemblyResolve, TypeResolve, ResourceResolve). Но – не все сборки нужны сразу, загрузка их требует дешифровки и распаковки – дополнительного времени и нагрузки на процессор. Не все производят exe-файлы. А Thinstall будет работать только с exe, так как dll-сборки уже не имеют как раньше процессорного DllMain, из которой это было возможно производить. Но – взломать ее проблем также не составляет труда. Есть такая программа ProcDump – она может продампить запущенный процесс и соответственно легко получить расшифрованными и распакованными защищенный exe и referenced сборки. Thinstall будет иметь проблемы с загрузкой в память managed C++ сборки.

Некоторые обфускаторы создают замкнутую систему обфусцированных сборок, где необфусцированными остаются сборки сторонних производителей и MS-вские. Но и здесь все далеко от совершенства – обфускатор не знает как используются ресурсы сборки, поэтому может привести вашу программу к нерабочему состоянию. Хотя в данном случае качество обфускации становится идеальным – ни к чему не подкопаться. Опять же – это возможно только для exe-программ. Если вам необходимо защищать библиотеку классов, то вам необходимо будет оставлять необфусцированными публичные члены классов и публичные классы – отсюда крэкер может начать свою работу.
Обфускаторы и их возможности:

RemoteSoft Slamander Obfuscator -
Имеет навороченный навигатор, позволяющий лазать не только по метаданным, но и по структуре PE-файла, анализировать ресурсы, бинарные данные. Богатые возможности для анализа метаданных. Нет анализа callgraph методов. Есть свой дизассемблер, но дизассемблирует сразу весь класс, не меньше - приходится ждать. Может использоваться как редактор сорцов. Неплохой символьный обфускатор, декларируемая защита от дизассемблера не работает - у меня спокойно открывался метод, обфусцированный им. Не работает с проектами и с наборами сборок. Навигатор (explorer) имеет плагинную архитектуру что позволяет подключать модули от Salamander к нему. Применяют overload induction - т.е максимально короткие и часто применяемы названия для членов сборки. Также предлагают Protector - который превращает ваши методы в native embedded code - не дизассемблируются, но зависимы от текущей версии .Net Framework. Попробовать не дают :)) Декларируемая оптимизация сборок не была произведена (работает ли на самом деле?). Написан в native code

Preemptive Solutions Dotfuscator - Community Edition этого обфускатора распространяется с VS .Net 2003. Бедный интерфейс (Дельфи?). обфусцирует как и все, трудно настраиваемый, трудно понимаемый, но интегрирован в VS как addin. Не стал устанавливать, от греха подальше. Работает с телами методов запутывая control flow, т.е как раз всяческие for и while. Почему именно dotfuscator распространяется с VS - вопрос не ко мне. Работает с проектами через интеграцию со студией. Возможно другие версии его покруче - но Community Edition мне не понравилась.

9Rays.Net ILObfuscator - новая версия 2.5 разительно отличается от предыдущей 2.0. Очень много качественных изменений. Во-первых появился GUI. Что многим облегчает задачу работы со сборками. ILOGUI - это и навигатор по сборкам, дизассемблер, система работы с проектом обфускации, в ней можно просматривать и экстрагировать ресурсы, содержащиеся в сборке. Чем отличается от других? Managed code - С# и managed С++, работа с набором сборок, а значит и кросс-обфускация, позволяющая достичь максимального уровня обфускации, неплохой и понятный GUI c VS IDE-like MDI интерфейсом, с ILO поставляется SDK, позволяющим вам создать свою собственную систему обфускации, удобная работа со свойствами проекта, есть коллекции замен и исключений, гибкие возможности по запутыванию - скажем фича по запутыванию namespaces (можно выбрать один из варантов), также предлагаются на выбор варианты наименования обфусцированных классов. Есть функция оптимизации сборки после обфускации, правда только для managed сборок, без embedded native code. ILO самообфусцирован - вы можете убедиться в качестве его обфускации. Из заявленных на следующую версию фичей - поддержка solutions - т.е наборов проектов, генерация карт обфускации и импорт их при обфускации проектов, эти фичи уже позволят фиксировать результат обфускации и использовать его в следующей обфускации проекта и уменьшать время тестирования сборки после обфускации и максимально обфусцировать проект. Кроме этого обещано функцию оптимизации дополнить фичей удаления неиспользуемых членов сборок и вставить функцию анализа проекта для выявления оных, дополнить навигацию закладками и history.

Lesser Software LSW IL-Obfuscator - простая и быстрая программа, которая для многих подойдет. Немного настроек, все понятно и просто. Берет как Il-файлы, так и скомпилированные сборки. Правда не все - иногда выдает какую-то странную ошибку и скопилированную сборку не подымает. Такое впечатление что он ее сначал дизассемблирует. Не работает с наборами сборок, но поддерживает замены и исключения из обфускации. Native code. Но за $40.

Thinstall (теперь уже тоже от Lesser Software) - эта штуковина как раз работает только с exe -файлами. Создает самоустанавливающийся exe-файл, со всеми файлами на борту, закрывая от дизассемблирования сборки. Такой файл не без усилий, но вскрывается, не стоит обманываться. Как признаются сами производители - лучше всего использовать вместе с обфускатором.

Wise Owl Demeanor - не юзал, не дают. Много чего может - и удаляет ненужную информацию из метаданных, шифрует строковые переменные, работает с мультимодульными сборками (редко используемая вещь) и интегрируется с VS.Net. Но стоит немеряно $1250. Оценить сей шедевр не дают.

Так с чего же начать?

С проектирования системы (программы или библиотеки классов), которую вы собираетесь написать. Да, если вы хотите написать максимально защищенный код, вам придется учитывать ряд факторов при проектировании вашего продукта.

Не стоит путать проектирование с программированием. Какие факторы необходимо учитывать. Обфускатор не Господь Бог, всего не может, поэтому стоит пойти его возможностям навстречу. Типичной обфускацией является символьная (учитывая все плюсы и минусы упомянутые выше)– когда обфускатор только и всего изменяет названия типов, полей, методов, свойств и событий на бессмысленные. Скажем тип Obfuscator переименовывается в 0, а его метод Run() – тоже в 0, а параметры методов просто перенумеруются – 0,1,2,3,4. После подобной обфускации теряется логическая связь между классами, дизассемблированной код – трудночитаем.

Если вы собираетесь обфусцировать замкнутую систему – тогда вам подойдет полная обфускация, когда изменяются все названия членов сборки, и в этом случае концы найти на порядок гораздо труднее чем в случае, когда кое-какие методы, типы у вас остаются не обфусцированными (такое возможно при обфускации exe-файлов не использующих Reflection).

К слову сказать кроме символьной обфускации есть еще обфускация алгоритмов методов – когда простейшее умножение I*3 может быть представлено более сложным алгоритмом, например – I*((1+1/2)*2) или запутаны while и for. Но мы будем говорить только о символьной обфускации, применительно к обфускации .Net сборок.

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

 
« Предыдущая статья   Следующая статья »