Обфускаторы (и деобфускаторы) для .NET §0

    Ни для кого не секрет, что из скомпилированных сборок (exe и dll) для платформы .NET может быть легко восстановлен код на языках высокого уровня (C#, VB.net). Это означает не только то, что если в программе имеется система лицензирования, то она может быть легко снята; но и то, что ваш исходный код могут скопировать, например, нечистые на руку конкуренты. Чтобы обезопасить себя от подобных угроз большинство разработчиков коммерческого софта используют разного рода обфускаторы.

    Зачем и от кого защищаемся?


    Очевидно, что обфускация как один из этапов защиты актуальна только для коммерческого софта.
    Защищать программу, если в ней используется система регистрации по серийному номеру или активация, требуется от «кракеров», которые либо за неимением денег (если программа дорогая), либо из любви к искусству пишут краки. Выяснить, где находится нужный условный переход, или проверка серийника намного тяжелее, если перед вами в лучшем случае «узел» из IL-кода, чем если мы видим легко понятный C#-код. Это, конечно, не панацея, но добавляет n-ное количество минут, необходимое для взлома. (Если n достаточно велико, то пытаться ломать будут только очень упорные индивиды ;)

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

    Обычно для просмотра метаданных сборки используется .NET Reflector. Он имеет простой и понятный интерфейс, а так же возможность расширить функциональность плагинами.
    Скриншоты и примеры использования новички могут найти на сайте рефлектора.

    Также существует несколько коммерческих просмотрщиков сборок и декомпиляторов, возможно я перечислю их потом (триал версии разбирают только половину сборки, а «счастливые обладатели» лицензионных версий сообщают о не очень больших отличиях от рефлектора).

    Обфускаторы и упаковщики


    .NET-приложения пытаются защищать двумя основными методиками: непосредственно обфускацией IL-кода (когда на выходе получается почти-валидная* .net-сборка, и её можно выполнять на немодфицированном MS.NET или mono). И упаковкой — модификацией сборки так, что на выходе получается winapi-приложение, содержащее в себе распаковывающий модуль и упакованый IL-код.
    * — сборка может содержать невалидные IL-инструкции, которые однако не будут выполняться. И сборка в целом выглядит «нормальной» и может быть запущена на любом поддерживаемом рантайме
    С обфускацией вроде всё ясно: подаём на вход .net сборку, получаем на выход .net сборку, всё работает примерно так же. Никаких лишних «спрятанных» данных, всё находится на месте, только запутано и переименовано в что-то бесполезное.
    В случае с упаковщиком нас ожидают некоторые проблемы:
    • Наша сборка будет выполняться теперь только под виндой (либо аккуратно настроенным mono+wine)
    • Упаковщик, который передаёт на вход mscoree оригинальную сборку, снимается за 1 минуту, и не имеет смысла для защиты. Упаковщики, которые перехватывают внутренние функции mscoree очень сильно зависят от версии фреймворка, и вызывают у некоторых антивирусов false positive реакции. Перехват внутренних функций вообще дело тонкое и неблагодарное.
    • Упаковщики являются native-программами, и не дают скомпилироваться вашему приложению в x86-64 код там, где это доступно (а в некоторых случаях это даёт большой прирост производительности)
    • Для нормального выполнения среде .net в любом случае требуется доступ к оригинальному IL-байткоду. И даже preJITted-сборки должны его в себе содержать. А значит и получить этот байткод тоже реально.
    • И, на последок, цитата: «if it runs it can be unpacked»

    Разнообразные «защитники» (protectors) обычно объединяют в себе оба подхода и будут рассмотрены в обеих частях данного обзора.

    Инструменты реверсера


    Первым и самым основным инструментом является рефлектор. Обычно каждый качает к нему плагины на свой вкус. Я порекомендую лишь один: reflexil, он позволяет менять байткод методов, свойства сборки, и содержит удобную утилиту удаления strong-name. С помощью этого плагина очень удобно делать краки ;)
    Если сборка подверглась обфускации, то просматривать её в рефлекторе не очень удобно, поэтому перед изменением (или вытаскиванием кода) её надо «деобфусцировать», для этого применяются разнообразные готовые деобфускаторы (коих в интернете можно найти очень много).
    Также полезно иметь собственный деобфускатор, который всегда легко «допилить» до нужд определённой задачи.
    Если мы будем иметь дело с упаковщиками, то нам понадобятся различные инструменты для native reverse engineering, такие как дебаггер (WinDbg, OllyDbg), дампер (PE tools), редактор PE-файлов (например CFF Explorer). А так же специфичные для .net-распаковки инструменты: Generic .NET Unpacker, .net dumper (KDD), .Net Assembly Rebuilder. С ними мы познакомимся во второй части обзора.

    Всё, на этом моё словоблудие заканчивается, следующий пост будет содержать в себе больше подробностей (даже с картинками) ;)

    Продолжение →

    Примерное содержание следующих постов:
    • 1. Обфускаторы.
      • 1.1. Методики
      • 1.2. Обзор обфускаторов
      • 1.3. Методики деобфускации
      • 1.4. Деобфускаторы
    • 2. Упаковщики.
    • 3. Использованные источники, и что ещё почитать по теме

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 29

      +2
      Сдается мне все эти обфускаторы просто делание денег из воздуха их авторами. Ни от чего реально они не защищают. Принцип Security through obscurity здесь скорее вреден, чем полезен. Защита софта делается совсем не так.
        +2
        Вот собственно и хочу сделать обзор на эту тему. От чего, как и реально ли они защищают.
          +2
          Ну тогда интересно будет послушать :)
            +1
            Спасибо, жду реакции других хабровчан ;)

            На самом деле насчёт защиты по серийным номерам и похожих вещей вы правы.
            [спойлер] На данный момент основной целью применения обфускаторов я вижу защиту от такого:
            Вы выпустили на свет программу, которая содержит какой-то код, который не так легко написать с нуля.
            А ваш конкурент взял рефлектор, скопировал сорцы, отрефакторил, поменял внешний вид, и выпустил аналогичный продукт практически не затратив денег (или других ресурсов) на разработку.
              +1
              От этого лучше спасет лицензия GPL :)
                0
                От этого лучше спасет unmanaged code.
                  +1
                  и это рассмотрим ;) только данный подход имеет свои минусы
                    +1
                    конечно. нужно знать с++.
                • UFO just landed and posted this here
              +1
              Да, кстати, не все они деньги гребут ;)
              babel — конкурентноспособный обфускатор, выложенный по GPL
              а phoenix — вообще «учебный» проект (в одном из своих постов Pistelli именно так о нём и говорил)
                0
                >Защита софта делается совсем не так.
                А как и где об этом можно почитать?
                +1
                ИМХО — вредная привычка спрашивать, «а надо ли?». Напишите, сообщество оценит ;).
                Сам когда-то занимался обфускацией, данная проблематика мне интересна.
                  0
                  а если не оценит, то автор потом долго ещё ничего писать не сможет :)
                    +1
                    Да, есть такая проблема… Хотя если оценивать будут мои посты, а не меня самого, то это не страшно ;)
                    Пока что «за» и «против» примерно равное количество.
                      +1
                      однозначно «за». статьи могут пригодиться многим.

                      p.s. использовал в своё время .NET Reflector. очень удобный инструмент.
                  +1
                  Был еще помнится Spices.net; а вообще идея написать про обфускаторы хорошая, только советую вам сделать сс на blogs.gotdotnet.ru потому что там видимость намного больше.
                    +1
                    .NET Reactor отсюда: www.eziriz.com/
                    Правда это не обфускатор в чистом виде
                      0
                      да, «протекторы» тоже будут ;)
                      0
                      Кому надо сломает.
                        0
                        ах да и забыл.
                        Тема на довольно таки известном ресурсе, с 2003 года :)

                          +1
                          Vingrad

                          извиняюсь за кучу ответов, пока не освоился :(
                        0
                        Прикольное введение. Только судя по ссылкам направленность «как взломать .net приложение».

                        Хотя согласен нужно знать от чего защищаться. За reflexil спасибо, не знал про него. Зачетная штука.
                          +1
                          Очень было бы интересно почитать про снятие защит с .NET программ. И еще интереснее — как лучше от этого защититься. Я так понимаю, намечается целый цикл статей. С нетерпением жду, удачи автору!
                            +1
                            .NET Reflector очень понравился :-)
                            спасибо
                              +2
                              Это, так сказать, must have инструмент не только реверсера, но и обычного дотнет разработчика ;)
                              +1
                              Статья обфусцирована переводами каретки?
                                0
                                Это результак Ctrl+K, D в студии, я думал что хабр не будет вставлять дополнительных переносов… :(
                                  +1
                                  Статью деобфусцировал ;)
                                  0
                                  тема хорошая, продолжайте пожалуйста!

                                  Only users with full accounts can post comments. Log in, please.