warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
Мы с тобой рассмотрели достаточно протекторов, чтобы усвоить простую и очевидную истину: какой бы сложной и навороченной ни была защита, уязвимость ее определяется уязвимостью самого слабого места, в котором она навешена на программу. Несмотря на всю очевидность этого утверждения, многие разработчики не задумываются о таких вещах и умудряются установить защиту даже на веб‑фронтенд своего приложения. Вполне ожидаемо, что для того, чтобы снять подобную защиту, вовсе не обязательно быть даже не хакером, а просто специалистом по веб‑интерфейсам: с задачей справится заурядный бот.
Не пугайся: чтобы повторить описанные ниже действия, никаких токенов тратить не придется. Наша с тобой основная задача — найти слабое место в подобной защите, если оно, конечно, существует.
Разберем сформулированный мною выше принцип на примере некоего приложения, при загрузке требующего активацию (онлайн или офлайн). Исполняемый файл приложения не представляет для нас ни малейшего интереса, поскольку имеет крохотный (меньше мегабайта) размер и невооруженным (но натренированным) глазом опознается как лаунчер для огромного (около гигабайта) JAR-апплета, лежащего в подпапке / рабочего каталога программы.
Однако не будем пока торопиться разбирать его на классы, как мы многократно делали в статьях «Грязный Джо. Взламываем Java-приложения с помощью dirtyJOE», «Беззащитная Java. Ломаем Java bytecode encryption», «Суровая жаба. Изучаем защиту Excelsior JET для программ на Java», наша задача сегодня значительно проще.
Чисто ради прикола нажмем Ctrl-Alt-Del на открытом активационном окне, чтобы посмотреть список задач, порождаемых нашей программой. А порождает она (помимо крохотного лоадера, пожирающего самый минимум ресурсов) целую кучу процессов под названием Java Chrominium Embedded Framework (JCEF) Helper, реализуемых модулем jcef_helper. из подпапки / программного каталога.
Гугл говорит нам, что этот фреймворк позволяет Java-приложениям встраивать компоненты полноценного веб‑браузера (на базе движка Chromium) прямо в свой интерфейс. То есть мы видим классический фронтенд, реализованный на основе веб‑приложения. Мы сталкивались с подобным, например, в статье «В обход стражи. Отлаживаем код на PHP, упакованный SourceGuardian», однако там приложение запускалось непосредственно из веб‑браузера, а сейчас браузер встроен прямо в Java-апплет.
Еще раз напоминаю, что на этот раз мы не будем сразу нырять глубоко в бэкендную реализацию проверки лицензии, а попробуем для начала разобраться, как именно реализовано окно активации и почему, собственно, оно вызывается при старте неактивированной программы.
Чтобы посмотреть HTML-код, который отображает jcef_helper., нам нужно получить доступ к стандартным инструментам разработчика Chromium (DevTools). Поэтому представим, что перед нами обычный браузер Google Crome, в котором открыта веб‑страница.
К сожалению, правый клик мышью внутри окна не работает, однако нажатие клавиши F12 разработчики заблокировать забыли. С этим нам очень повезло, поскольку в противном случае нам пришлось бы настраивать отладочный порт для удаленной отладки через обычный браузер, а это тот еще геморрой. Но в нашем примере мы идем простым путем, и нажатие F12 вызывает нам окно Development tools, в котором мы сразу открываем вкладку Sources.

Мы видим, что окно активации представляет собой локальную веб‑страницу, хранящуюся по адресу http://. Она динамически собирается при помощи скриптов сборщиком модулей WebPack. К сожалению, эта страница защищена от межсайтовых запросов или требует авторизации, поэтому зайти на нее из системного веб‑браузера не получится. Придется довольствоваться открывшимся отладчиком Development tools, нам его вполне достаточно.
Нас интересует код JS-скриптов, формирующих эту страницу. Напоминаю, мы тестируем гипотезу о том, что проверка лицензии и загрузка активационного окна находится именно в упомянутых скриптах, а значит, откручивается путем простой правки текстового JS-кода.
Задача не такая тривиальная, как могло бы показаться на первый взгляд, — как видно из скриншота, код скомпилирован, оптимизирован, минимизирован и разбит на так называемые чанки. В правой части скрина мы видим один такой фрагмент кода, собственно, и реализующего окно активации, — 804.. Если мы попросим ИИ удовлетворить наш интерес относительно заголовка этого модуля (в общем‑то, типового), то он нам объяснит, что:
"use— строгий режим JavaScript. Он включает улучшенную проверку ошибок, запрещает использование устаревших синтаксических конструкций и повышает производительность кода;strict"; self.— глобальный массив (в контексте window или Worker), который Webpack использует для хранения и синхронизации всех частей (чанков) приложения;webpackChunkalx self.— защитная инициализация. Если массив уже существует, код использует его. Если нет, создает новый пустой массив. Это предотвращает ошибки при загрузке скриптов в случайном порядке;webpackChunkalx || [ ] .— добавление нового модуля в систему сборщика.push([[ 804], { 75804: (...) => {...} }] )
Пока не будем забивать себе голову этими глупостями, нас интересует место, в котором происходит обращение по адресу user/. Воспользовавшись глобальным поиском прямо в окне разработчика, находим очень похожий код в модуле 480..

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