|
|
Обфускация – есть такое слово
|
|
Страница 1 из 3 Доступность метаданных вплоть до вашего кода (конечно это MSIL, но более читабельный чем ассемблерный код) в продуктах .Net стала головной болью для разработчиков коммерческих продуктов и технологий для .Net. Как защитить код от излишне любопытной публики, как защитить продукт как интеллектуальную собственность (если можно легко декомпилировать в понятный код, значит можно снять защиту от несанкционированного использования, да еще собрать в работающую сборку)?
Вот тут на помощь приходит обфускация. Результат. Вот пример исходного метода (перед обфускацией): private void CalcPayroll(SpecialList employeeGroup) { while(employeeGroup.HasMore()) { employee = employeeGroup.GetNext(true); employee.UpdateSalary(); DistributeCheck(employee); } } А вот результат (после): private void _1(_1 _2) { while(_2._1()) { _1 = _2._1(true); _1._1(); _1(_1); } } Попробуйте поймите смысл алгоритма после обфускации. На это уйдет время – надо узнать, что за классы принимают участие, попробовать понять их назначение, в общем предстоит большой труд. В этом задача обфускации – затруднить для понимания исходный код, запутать и устранить логические связи в коде. Что делает обфускатор: Анализирует метаданные, так как не все члены сборки он может обфусцировать. Например обфускатору не стоит заменять имена конструкторов типа – это может быть чревато. Хотя в некоторых случаях это бывает возможно. Также иногда невозможна обфускация виртуальных или абстрактных методов.
Список членов сборки для обфускации готов. Обфускатор присваивает им новые имена, базируясь на определенном алгоритме. Одни обфускаторы присваивают имена такой же длины что и были но лишенные прежнего смысла, другие базируются на нумерации всех членов и обфусцируют тх соответствии номеру члена сборки, третьи – базируясь на токен (token) члена сборки – уникальный идентификатор члена сборки в MSIL, четвертые стараются минимизировать длину имени и почаще использовать одно и то же имя среди членов сборки (в dotfuscator это называется overload induction)– это дает максимальный эффект обфускации (представьте себе что у вашего класса все методы и поля названы как «1»). После этого производится запись данных обратно в сборку или генерация новой сборки – все это в руках авторов обфускаторов, ее оптимизация – так как многие из обфускаторов способны удалить ненужную информацию из сборки (дебаг-информация, неиспользуемые методы, поля, классы). Вуа-ля – сборка готова. Фактически сборка после обфускации отличается от исходной одной деталью – модифицированным разделом строк (String Heap или #Strings)– одним из пяти разделов метаданных, это итог символьной обфускации, когда обфускатор не модифицирует тела методов. Может быть модифицирован еще один раздел (User Strings или #US) – но пока не встречал таких обфускаторов. Если интересно, могу как-нибудь рассказать о структуре метаданных и PE-файла в .Net сборках. Открываем в ildasm или Reflector или в другом навигаторе по сборкам и оцениваем результат. Некоторые обфускаторы имеют дополнительные фичи: запутывание namespaces (изменение принадлежности различных классов определенным namespace), шифрование строковых и графических ресурсов, контроль обфускации на базе специальных атрибутов, которыми помечаются члены классов в исходном коде, некоторые стараются заигрывать с MSIL-кодом методов сборки. Наука не дремлет, изыскивая новые возможности вам помочь и предложить немного больше чем предлагают (или предполагают :) ) конкуренты.
|
|
-
.NET Framework,
Оптимизация сериализации в .NET
Приводятся код и методы, позволяющие разработчикам оптимизировать сериализацию данных....
-
.NET Framework,
Плавающая точка в .NET - часть 1: принципы и форматы
Данная статья представит основные принципы арифметических операций с плавающей точкой: числовые форматы, точности и достоверность, погрешности округления. Также в статью включено обсуждение типов плавающей запятой в .NET....
-
.NET Framework,
JIT-оптимизации
Компилятор .NET Just-In-Time Compiler (JIT) считается многими одним из основных преимуществ производительности CLR по сравнению с JVM и другими управляемыми средами, которые используют двоичный код, скомпилированный компилятором JIT. ...
-
.NET Framework,
Инъекции CLR: замена методов во время выполнения
Многие из нас, наверняка, были заинтересованы в том, как работает универсальный язык CLR. Одной из наиболее интересных вещей является динамический компилятор JIT (Just In Time Compiler). Мы рассмотрим то, как JIT компилирует MSIL и создадим утилиту, которая позволяет программным образом заменить любой метод (JIT) другим во время выполнения. Мы также создадим отладочную утилиту, которая прехватывает JIT-вызовы и выводит в консоль информацию о диагноcnbrt....
-
.NET Framework,
Оптимизация запуска приложений .NET
Ждать, пока приложение запустится, неприятно для многих пользователей, поэтому ускорение запуска приложений клиентов может значительно улучшить первое впечатление от вашей работы. И так как скорость запуска имеет значение, следует знать факторы, которые на нее влияют, чтобы избежать распространенных ошибок....
-
.NET Framework,
Создание компилятора языка для .NET Framework
Эксперты по компиляторам являются знаменитостями в компьютерном мире. Я видел, как Андерс Хейльсберг (Anders Hejlsberg) представлял презентацию на конференции разработчиков Professional Developers Conference и когда он сошел со сцены, его встретила целая орда мужчин и женщин, просящих поставить автограф на книгу, или сняться на фотографии вместе с ними. Люди, посвящающие свое время изучению и пониманию всех тонкостей лямбда-выражений, систем типов и языков сборки, кажутся своего рода носителями ...
-
.NET Framework,
Маршалинг данных между управляемым и неуправляемым кодом
Посмотрим правде в глаза: нет в мире совершенства. Мало кто при разработке использует только управляемый код. А между тем, тяжким грузом лежат устаревшие неуправляемые приложения, с которыми приходится мириться. Есть ли способ интегрировать проекты, в которых задействован как управляемый, так и неуправляемый код? Какой вид принимает этот способ: вызов неуправляемого кода из управляемого приложения или вызов управляемого кода из неуправляемого приложения?...
-
.NET Framework,
IronPython как движок для макросов в .NET приложениях
Подозреваю, многие из вас задумывались — как можно в .NET приложение добавить поддержку макросов — чтобы можно было расширять возможности программы без ее перекомпиляции и предоставить сторонним разработчикам возможность легко и просто получить доступ к API вашего приложения? В статье рассмотрено, как в качестве основы для выполнения макросов использовать IronPython — реализацию языка Python на платформе .NET....
|
|
|