Тема обфускации и деобфускации программ на .NET воистину неисчерпаема: мы с тобой уже рассмотрели множество известных и не очень обфускаторов в статьях «Ангард! Реверсим приложение, защищенное DNGuard», «Неядерный реактор. Взламываем протектор .NET Reactor» и «Реверсинг .NET. Как искать JIT-компилятор в приложениях», но вопрос деобфускации по‑прежнему остается открытым.
Актуальности ему добавляет и то, что даже широко известные обфускаторы постоянно совершенствуются (и, надеюсь, мои статьи разработчикам в этом помогают). Более того, часто это происходит настолько оперативно, что за полгода в очередную версию уже разобранного по винтикам обфускатора добавляют столько нового и интересного, что можно смело разбирать его с самого начала. Темой сегодняшнего обсуждения я выбрал широко распространенный проект, несправедливо обойденный вниманием в моих предыдущих обзорах, — Confuser.
Собственно, ранее я не касался этой темы исключительно из‑за распространенности обфускатора: он изначально заявлен как open source, и, хотя сайт проекта за давностью лет уже не открывается, сам обфускатор легко гуглится. Нетрудно найти гитхабовский репозиторий Confuser (ныне, правда, тоже уже изрядно устаревший). С тех пор каждый уважающий себя .NET-разработчик, не желающий тратить деньги на готовое сильное решение типа DNGuard, считает своим долгом взять свободные исходники Confuser и модифицировать их под себя, чтобы проект не деобфусцировался стандартными инструментами, которых тоже написано великое множество.
Их реально настолько много, что даже перечислять тут не буду. Деобфускаторы для Confuser вынесли в отдельный список на GitHub. Статей по деобфускации тоже хватает, хоть и не в русскоязычном сегменте (надеюсь слегка исправить это упущение), — приводить конкретные ссылки не стану, нагуглишь самостоятельно. Есть и наглядные мануалы. При всей моей нелюбви к ютубовским видеообзорам лично мне понравилась видеоинструкция по снятию ConfuserEx. В ней подробно описаны принципы обфускации ControlFlow, контроля целостности, шифрования/дешифрования кода и используемых ConfuserEx строк. В принципе, из этого ролика ты можешь получить гораздо больше полезной теоретической информации, чем из сегодняшней статьи. Поэтому я, как обычно, не буду дублировать теорию, а на практическом примере разберу порядок действий для случая, когда стандартные подходы по какой‑то причине не приносят результата.
Итак, условие задачи: у нас есть приложение на .NET, для которого необходимо по возможности обойти механизм лицензирования. Detect It Easy сразу предупреждает, что это будет непросто, поскольку приложение обфусцировано при помощи одной из модификаций Confuser.

Отладчик dnSpy, в котором мы открываем это приложение, сообщает нам две новости — плохую и хорошую. Плохая новость заключается в том, что подавляющая часть наименований методов обфусцирована до нечитабельности, а код самих методов скрыт (мы сталкивались с подобным еще в самой первой статье про обфускацию .NET — «Реверсинг .NET. Как искать JIT-компилятор в приложениях»).
С другой стороны, мы уже достаточно много узнали про обфускацию .NET, чтобы не пугаться таких сложностей. Причем в статье «Теневые вызовы. Анализируем хитрую обфускацию в Quick License Manager» я приводил пример, как технически реализуется подобное сокрытие кода и его динамическая загрузка. Более того, в упомянутом ролике приводятся подробности, где и как конкретно это делает изучаемый нами Confuser.
Хорошей новостью можно назвать то, что, внимательно полистав списки обфусцированных классов и методов, мы с радостью обнаруживаем, что названия интересующих нас методов проверки лицензии не обфусцированы (похоже, потому, что эти самые методы объявлены как public для удобства вызова).

А это означает, что с нас снимается самая неприятная часть работы по поиску кода лицензирования в динамике. По сути, нам нужно только деобфусцировать нужный код и придумать, как побороть проверку лицензии.
Начнем с деобфускации, благо в нашем распоряжении есть целый арсенал упомянутых выше инструментов. Конечно, видеоинструкция за год сильно устарела, упоминаемая в нем модификация de4dot сразу рушится по исключению и не деобфусцирует ровным счетом ничего. Но это не страшно, существует целый набор более современных деобфускаторов.
К сожалению, как ты уже наверняка догадался, мы, похоже, имеем дело с какой‑то необычной кастомной версией ConfuserEx, которая вроде как и распознается деобфускаторами, но не деобфусцируется полностью, выкидывая какую‑нибудь ошибку. К примеру, деобфускатор ConfuserEx-Unpacker By ElektroKill в самом конце деобфускации выдает вот такое.

Полученный в итоге модуль очень похож на настоящий, но он не работает, и, что самое обидное, в нем напрочь отсутствует интересующий нас класс License. Подобные неприятные сюрпризы возникают в ходе работы абсолютно любого деобфускатора из приведенного выше списка — модуль или не деобфусцируется совсем, или деобфусцируется, но с нечитаемым кодом, или какая‑то часть кода и вовсе выкидывается. Строки не деобфусцирует ни один инструмент, а главное, ни один из известных деобфускаторов не создает работоспособный код.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
