AppFuscator — облачная защита .NET

    Привет Хабр! Мы плодотворно трудились над нашим продуктом, и сегодня я хочу поделиться новостями. Для тех, кто не читал предыдущих топиков (1 и 2), напомню, что мы разрабатываем онлайн сервис для защиты .NET приложений. Процесс обфускации происходит непосредственно в облаке по модели SaaS.

    Расскажу немного о нововведениях.

    Программа-клиент


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

    obfuscation program C#

    Программа распространяется как OpenSource (лицензия MIT), все желающие могут ознакомиться с исходниками. В дальнейшем, мы планируем вынести API в отдельный модуль, для легкой интеграции с другими программами.

    Программа пока бета, заранее приносим извинения за возможные баги.

    Control flow obfuscation


    В AppFuscator добавлен новый алгоритм защиты Control flow obfuscation — запутывание потока управления. Суть этого метода заключается в разделении алгоритма программы на отдельные компоненты и построение из них сложно-связанного графа переходов. В итоге логику работы кода понять становиться весьма не просто.

    Небольшой пример:
    Control flow obfuscation
    Полный код обфусцированого метода можно посмотреть здесь (для наглядности выключены все виды защиты кроме Control flow обфускации)

    Из особенностей:
    • Несколько различных способов перехода между блоками
    • Поддержка Switch инструкций
    • Динамические счетчики, передающие состояние между блоками

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

    Улучшенный WPF обфускатор


    Существенно доработаны алгоритмы обфускации WPF. Наш обфускатор умеет переименовывать объекты, используемые в XAML разметке, и при этом корректно обрабатывает Bingings, Attached Properties, Attached Events и другие хитрые конструкции из мира WPF. Как правило процесс обфускации не требует ручной настройки, обо всем позаботится интеллектуальные алгоритмы анализа кода и XAML разметки (если точнее, BAML).
    WPF obfuscation

    Личный кабинет пользователя


    Теперь каждому пользователю доступен личный кабинет. В нем можно видеть историю обфускаций и скачивать предыдущие обфусцированные версии для изучения MAP файлов.
    appfuscator user cabinet

    Мы будем рады услышать Ваши вопросы и предложения, а так же, обсудить возникшие идеи.

    UPD1. Разместили 10 промо-кодов на регистрацию:
    wdk6tuffkc
    2ppcpfgtpj
    9p82pm8xnt
    fg73hqfakd
    wpkt6k8rqc
    7ztv4jck8r
    ku8dqn4u38
    jc6gxxbdgw
    eyjw7b9zd8
    2nf68m6r2t

    UPD2. Инвайты кончились. Кому не хватило, ещё один не активированный был у нас в твитере.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 24

      0
      Мне понравилась идея с control flow, но похоже вам действительно нужно менять алгоритм почаще, а то строки следующего вида кажутся очевидными:

      int num7 = -19581;
      switch (0)
      {
          case 0:
          do
          {
              ...
              if (num7 == -18995)
              { .... }
              ...
          }
          while (false);
          ...
      
        0
        Полностью согласен. Да, требует больше времени, но control flow восстанавливается на ура.
          0
          Не существуют защиты, которую не возможно обойти. Единственная цель любых средств защиты — максимально повысить стоимость взлома и, в идеале, сделать его нерентабельным.
        0
        Да, но это вырожденный случай, как правило в switch оказывается не одна ветка а множество. При этом значение счетчика устанавливается в предыдущем шаге для следующего, чтобы усложнить анализ. Кроме того, в некоторые моменты, выполнение уходит за пределы switch блока, и обрабатывается другими инструкциями перехода. Там так же применяется переход на базе счетчика, с разделенной на разные блоки инциализацией и инструкцией перехода.
          0
          тогда извиняюсь, так как глаза случайно наткнулись именно на этот блок
            0
            А Вы попробуйте одновременно включить все режимы защиты в обфускаторе (кроме галочки Library mode, т.к. это не защита). В совокупности они дают особенно красивый эффект :)
          0
          Ссылка на faq с главной страницы ведет на 404.
          Трудно добраться до заметки про прайсинг. Было бы удобнее (мне по крайней мере) добавить в главное меню ссылку на прайсинг. Пусть даже с той же текстовкой про «Pricing in progress...», как в нынешнем неочевидном месте.
            0
            Большое спасибо, действительно мы слишком увлеклись работой над программой, и совсем забыли про обновление сайта. Битую ссылку поправили, страницу с нормальным прайсом сделаем в самое ближайшее время.
              0
              ММММ Метро UI в Кабинете. Обожаю минималистик. Только стиль основного портала совсем «не торт».
              Но Вы меня не слушайте… я брюзга, возможно.
            +1
            У вас что, пароли в открытом виде хранятся?
              0
              Нет, пароль доступен только в момент регистрации из формы, а в БД сохраняется уже хеш md5 с солью.
                0
                Всё равно мне кажется это лишним и даёт повод для недоверия. И лучше пароль на почту вообще не высылать, нечего ему там делать.
                  0
                  Да, спасибо Вам за замечание, мы убрали вставку пароля в письмо.
              0
              А WinRT приложения (Metro) обфусцировать умеет сервис?

              * И по моему на сайте явно не хватает странички с тарифами, как например тут:
              habrahabr.ru/info/advertising/corporate/
              т.к. сначала желательно знать на сколько лучше ваше предложение, а уже потом решать пользоваться или нет.
                0
                Сервис может обфусцировать любые .NET сборки, поэтому если WinRT приложение написано на .NET, то все должно работать.
                Страничка с тарифами обязательно будет, как я уже писал выше, что мы проглядели этот вопрос.
                0
                Надежная защита говорите… Выложите кто-нибудь семпл обфусцированного сервисом файла.
                  +1
                  Для примера выкладываю обфусцированную OpenSource программу NClass
                  Обфускация проведена со всеми параметрами по умолчанию, без явных исключений, все алгоритмы защиты включены:
                  public.66bit.ru/files/2013.02.15/2abc87810a9a9963d7ee81e3434a36b5/NClass.rar (смотреть в ILSpy, Reflector и т.п.)
                  Оригинальный код: nclass.sourceforge.net/
                    0
                    Защита более чем надёжна. 100%
                    0
                    Ох сколько уже попыток было…
                    Пара вопросов по how it works:
                    1. Обычно производители или владельцы кода испытывают диссонанс когда они защищают свой код, а тут раз… и надо его в третьи руки(а у многих(корпоративных) даже в соглашениях о неразглашении прописан прямой запрет передачи) передавать код третьей стороне. Как эта проблема решена в вашем SaaS решении?
                    2. Интересно конечно, как же происходит поиск референсных сборок, если они допустим не системные, а от стороннего вендора, или кастомные? Бывают проекты на 1-10 гигов (если учитывать все референсные сборки).
                    Вопросов конечно больше, но вот SaaS (или около-SaaS) решения в области защиты кода часто упираются в этот тупик.
                    Спасибо заранее.
                      0
                      Приложения на Windows Forms обфусцирует отлично, но вот на WPF под управлением .NET Framework 4.0 — главную форму приложения открывает, но стоит только нажать на ссылку, подгружающую фрейм — сразу же ПО вылетает без суда и следствия…
                        0
                        Все дело в том, что в WPF используется множество механизмов неявного связывания по имени. Наш обфускатор распознает и корректно обрабатывает многие из этих случаев, но во-первых, разумеется, мы могли что-то и упустить, а во-вторых местами неявное связывание слишком уж неявное чтобы его выявить и обработать :) Особенно в этом плане опасны случаи генерации WPF содержимого непосредственно из кода приложения.

                        Чтобы выявить проблемную область, мы рекомендуем перенаправить поток ошибок в текстовый файл (по типу: you.exe 2> log.err), а затем скормить его стек трейс декодеру. Он подскажет с чем связана ошибка, дальше как правило достаточно добавить атрибут ObfuscationAttribute.

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

                        Спасибо за отзыв!
                          +1
                          Кстати да, не работает как раз то, что приложение генерирует автоматически. Если элемент физически (?) создан на форме и его стиль прописан через свойства объекта — он работает.
                          Если дополнительно для него прописан стиль, определяющий наведение мыши — работает.
                          Но если какой-либо компонент создается непосредственно из кода — как раз эти «узкие» места обфускатор и не обработал.
                          Прочтя множество информации из поисковых систем, данной проблемой страдают практически все обфускаторы. Точнее, я не нашел рабочего варианта для BAML.
                          Единственным подходящим решением было использование "ILProtector" для защиты WPF, НО из всего приложения на нем НЕ РАБОТАЛА всего одна форма — нажимая кнопку открывается окно, в окне пользователь авторизуется на веб-сайте (компонент WebBrowser), при переходе по ссылке ПО должно считывать адресную строку и проверять на наличие определенного параметра. Если параметр найден — передавать его на основную форму приложения и закрывать текущее окно.
                          Собственно, обработчик WebBrowser_LoadCompleted и не срабатывает после применения ПО «ILProtector».
                          Но хотелось бы не просто защищать, а именно обфусцировать проект.

                          Чтобы выявить проблемную область, мы рекомендуем перенаправить поток ошибок в текстовый файл (по типу: you.exe 2> log.err), а затем скормить его стек трейс декодеру. Он подскажет с чем связана ошибка, дальше как правило достаточно добавить атрибут ObfuscationAttribute.

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

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

                          Если у самого не получится решить проблему, тогда к Вам обращусь. А если решу сам — напишу как решил.
                            0
                            Но хотелось бы не просто защищать, а именно обфусцировать проект.

                            Здесь почти наверняка проблема именно в переименовании.

                            Если у самого не получится решить проблему, тогда к Вам обращусь. А если решу сам — напишу как решил.

                            Да, обязательно напишите что получится. И, в любом случае, мы будем рады помочь Вам советом.
                              0
                              Здесь почти наверняка проблема именно в переименовании.

                              Я более чем уверен, что в переименовании. Тот же Гугл дает ~90% всех проблем при обфускации WPF проектов именно с переименованием.

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое