Всем привет! Решил поделиться с сообществом информацией о небольшом разборе одной маленькой утилиты (с обфусцированным кодом), известной в узких кругах 1с-ников. Это моя первая статья на Хабре, прошу сильно не пинать, но достойно критиковать.
Disclaimer
Всё, что вы здесь увидите, может повлиять на ваши психические способности, не применяйте на себе описанное в статье, так как это может причинить вам вред. Автор не несёт никакой ответственности за точность, полноту или качество предоставленной информации.
Что это?
TurboConf — это «шароварная» программа, расширяющая возможности конфигуратора 1с дальше ни слова про 1с, не требующая установки. Скачать ее можно на одноименном сайте рунета. Все исследования проводились на версии 5.9.7209.21363 от 27 сентября 2019 г.
Первоначальный анализ
После скачивания получаем zip-архив. Распаковываем. Видим несколько exe-файлов. Посмотрим на главное приложение с фирменной иконкой. Если его открыть в простом HEX-редакторе, например, HxD, то легко можно понять, что оно представляет собой сборку под .Net Framework, т. к. видны имена классов стандартной библиотеки .Net:
Далее берем декомпилятор DotPeek и смотрим данную сборку в нем. Байт-код не обфусцирован, поэтому декомпилятор выдает почти оригинальные исходники:
Несложно здесь понять, что далее работа утилиты перемещается на приложение «TurboConf.Application.exe». Открываем его в DotPeek. Это тоже сборка с IL-кодом. Но в отличие от предыдущей сборки, часть методов здесь обфусцирована, скорее всего, с помощью Confuser. Изучая код, становится понятно, что основная логика работы находится в «TurboConf.Service.dll» — и это тоже сборка под .Net, и тоже часть методов обфусцирована. Отлично, этим еще интереснее!
Исследование защиты
При просмотре структуры сборки, в пространстве имен «TurboConf.Service.Utils» обнаруживаем класс «Crypto», а в нем метод с говорящим названием «DecryptStringAES»:
Хотя он и обфусцирован, из него в дальнейшем нетрудно восстановить логику работы. Найдем использование данного метода (Shift+F12):
И сразу же успех! Данный метод вызывается 2 раза в конструкторе класса, отвечающего за лицензирование!
Восстановление исходного кода
Обфускатор зашифровал все строки и поместил их в один ресурсный файл. Получить данный файл можно с помощью майкрософтовского декомпилятора «ildasm.exe», входящего в SDK Windows (и не только):
А вместо оригинальных строк обфускатор подставляет в код следующую конструкцию: «<Module>.c(рандомная_арифмитическая_операция)», где результат арифметической операции представляет некое число, на основании которого высчитывается смещение для ресурсного файла, из которого затем достаются зашифрованные данные и восстанавливается исходная строка. Чтобы облегчить себе задачу расшифровки строк создадим новый проект в Visual Studio, перенесем, немного доработав, класс «<Module>» и ресурсный файл «resource». Таким образом сможем понимать, что в окне DotPeek следующий код
<Module>.c(sizeof (float) - 47, sizeof (int) + 6429, (int) ((uint) k >> 16) >= 0 ? sizeof (int) + 200 : System.Type.EmptyTypes.Length - 1805516213)
это есть строка «User:»
Не спеша восстанавливаем всю логику класса лицензирования. На этом можно было бы остановиться, т. е. сделать простой битхак в исследуемом файле «TurboConf.Service.dll», заменив проверку равенства наличия лицензии на неравенство, но так не интересно. Идем далее…
Принцип защиты
Для получения лицензии необходим уникальный идентификатор оборудования, на котором запускается программа. Данный HardwareID генерируется на основании идентификатора процессора и серийного номера тома диска «Ц». Для получения триальной лицензии программа делает GET запрос c идентификатором оборудования на домен «netlenka1c.ru». И в ответ приходит ключ с указанием даты окончания пробного периода, подписанный … цифровой подписью. В основе защиты программы применяется асимметричный алгоритм RSA с 1024-битным ключом. На этом этапе я понял, что без модификации оригинального файла не обойтись, т. к. получить закрытый ключ практически невозможно (в файлах утилиты он отсутствует).
Мини центр лицензирования
Поняв, как устроена защита, решил сделать себя небольшим божком для данной программы, чтобы самому иметь возможность генерировать ключи. Для этого был разработан патчер, который сначала заменяет открытый ключ цифровой подписи в сборке на само сгенерированный открытый ключ:
А затем разработанная утилита по генерации ключей (как временных на указанный срок действия, так и бессрочных), добавляет цифровую подпись в ключ на основании само сгенерированного закрытого ключа:
В итоге имеем работоспособную зарегистрированную программу с полным функционалом:
Мораль
Обфускация – достаточно неплохой метод запутать реверсера, но это лишь вопрос времени.
P.S.
В статье специально есть недосказанности и пробелы в повествовании, чтобы не подставлять автора программы. Никаких исходников и рабочих программ не прилагается и не будет. Уважайте чужой труд, особенно коллег по «цеху»!
Всем дочитавшим пост – благодарность за внимание!
Автор: SerVerOnLine