X-files в Java: обфускация и виды шифраторов | OTUS
⚡ Подписка на курсы OTUS!
Интенсивная прокачка навыков для IT-специалистов!
Подробнее

Курсы

Программирование
Team Lead Архитектура и шаблоны проектирования Разработчик IoT C# Developer. Professional PostgreSQL Подготовка к сертификации Oracle Java Programmer (OCAJP) C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Symfony Framework Unity Game Developer. Basic JavaScript Developer. Professional Android Developer. Basic JavaScript Developer. Basic Java Developer. Professional Highload Architect Reverse-Engineering. Professional Java Developer. Basic PHP Developer. Professional Алгоритмы и структуры данных Framework Laravel Cloud Solution Architecture Vue.js разработчик Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool" PHP Developer. Basic
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK Дизайн сетей ЦОД Разработчик IoT PostgreSQL Экспресс-курс "Версионирование и командная работа с помощью Git"
-30%
Экспресс-курс «Введение в непрерывную поставку на базе Docker» Базы данных Reverse-Engineering. Professional Administrator Linux. Professional Network engineer Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив «СУБД в высоконагруженных системах» Супер-интенсив "Tarantool" Network engineer. Basic
Корпоративные курсы
Безопасность веб-приложений IT-Recruiter Дизайн сетей ЦОД Компьютерное зрение Разработчик IoT Вебинар CERTIPORT Machine Learning. Professional
-6%
NoSQL Пентест. Практика тестирования на проникновение Java QA Engineer. Базовый курс Руководитель поддержки пользователей в IT
-8%
SRE практики и инструменты Cloud Solution Architecture Внедрение и работа в DevSecOps Супер-практикум по работе с протоколом BGP Infrastructure as a code Супер-практикум по использованию и настройке GIT Промышленный ML на больших данных Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes» BPMN: Моделирование бизнес-процессов Основы Windows Server
Специализации Курсы в разработке Подготовительные курсы Подписка
+7 499 938-92-02

X-files в Java: обфускация и виды шифраторов

Java_Deep_12-5020-17c8a3.10_site.png

Вы же знаете, что jar-файл это zip-архив? То есть, его можно unzip -d target my.jar распаковать и достать все class-файлы. А каждый class-файл это bytecode, который легко-легко можно декомпилировать и получить весь ваш проект с именами всех ваших классов и их переменных и методов. И кодом методов. То есть, совсем всё можно из jar-файла получить. Если, конечно, он не обфусцирован.

Давайте рассмотрим базовые способы обфускации

источник

Первый вид шифраторов изменяет структуру программы переименовыванием идентификаторов или удалением информации отладчика. При чём изменение идентификаторов имеет место при работе как с исходным кодом программы, так и с Java байт-кодом. В случае с изменением байткода необходимо запустить некоторую утилиту, которая изменит папку со скомпилированными классами либо jar-файл.

А вот добиться изменения исходного кода можно даже простым рефакторингом в IDE. Например, двумя переименованиями можно превратить понятный класс:

public class Configuration {
    public String getHttpPort() {
        ...
    {
}

...
// место вызова
Configuration c = new Configuration();
String port = c.getHttpPort();

в следующую непонятную писанину:

public class a {
    public String b() {
        ...
    }
}

...
// место вызова
a c = new a();
String port = c.b();

При компиляции java-классов компилятор может сохранять отладочную информацию, которую можно использовать, например, для удалённой отладки приложения. По-умолчанию javac сохраняет информацию о номерах строк исходного файла и самом исходном файле, а имена локальных переменных не сохраняются.

Отключить сохранение debug-информации можно с помощью опции -g:none. Пример:

javac -g:none MyClass.java

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

Продвинутые способы обфускации

Второй вид шифраторов изменяет ход выполнения программы (flow obfuscation). Чаще всего при этом «страдают» конструкции выбора (например, if и switch) и циклов (например, for и while). Байткод стараются изменить так, чтобы он не имел прямых аналогов в языке Java, что значительно усложняет работу взломщиков.

Наконец, третий вид шифраторов изменяет структуры данных (structural obfuscators). Добиться этого можно изменением принципов наследования. Например, в иерархии можно создать несколько промежуточных классов. Популярным является разбиение классов на несколько частей. Кстати, разбиение на части можно применить и для массивов. В добавок можно кодировать символы строковых констант и переменных, чтоб уже наверняка всех запутать.

Шифраторы структур данных — наиболее надёжный вид шифраторов. Использование второго и третьего способа шифрования вместе настолько усложняет код программы, что восстановление оригинального кода становится практически невозможным.

На заметку

Кстати, обфускацию любят не только секретные службы, но и разработчики мобильных приложений. Казалось бы, а им зачем? Просто jar-файл после обфускации становится меньше в размере, ведь длинных имён классов и методов в нём нет.

А чем ещё может быть полезна обфускация? Пишите в комментариях!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться