как обфусцировать код java
Кручу, верчу, запутать хочу: обфускация в Java
Переходим к практике. Если набрать в любой серьезной поисковой системе «java obfuscation», то можно нарыть с десяток пакетов на эту тему. Я остановил свой выбор на пакете yGuard. Во-первых, потому что он оказался в начале списка результатов поиска. Значит развивается и пользуется спросом. Главной же причиной выбора стало то, что он легко встраивается в сборщик Ant, о котором я упоминаю почти в каждом своем практикуме. Ознакомиться с пакетом можно здесь. Вот кусок build.xml, позволяющий из обычного jar-архива, в который упакован некий java-продукт, сделать «затемненный» вариант.
Далее в задании идут элементы shrink, который убирает из кода все лишнее с точки зрения машинной логики и rename, который превращает имена из понятных в непонятные. Каждый из этих элементов указывает свой лог-файл, в котором подробно записывается что он делал и элемент keep, который отвечает за сохранность имен, которые никак нельзя подвергать обфускации. Например, в jad-файле мидлета указана точка входа в программу и ее нельзя переименовывать, а то получится как в анекдоте про психов: «Васька проснется, а голова-то в тумбочке». Ну вот, вкратце, и все. В остальном при желании разобраться нетрудно. Остается добавить, что лог-файлы неспроста делаются в формате xml: yGuard по ним может восстановить обфусцированный код в исходное состояние. И вот еще что: yGuard хоть и распространяется бесплатно, а под лицензию GNU не попадает. Поэтому здесь его и не выкладываю.
Stringer — новый подход к защите Java приложений
Обычно, для защиты Java-программ используются обфускаторы. Обфускаторы позволяют переименовать классы, методы, переменные, изменить поток управления (control flow) байт-кода. Эти функции умеют делать все обфускаторы включая бесплатные и платные.
Целью обфускации байт-кода является построение такого набора команд JVM из которого декомпилятор не мог бы построить корректный исходный код на языке Java.
Противостояние обфускаторов и декомпиляторов продолжается постоянно.
Классический обфускатор относительно хорошо справляется с защитой от второго типа атак. От реверс-инжиниринга он помогает слабо, потому что Java-программы используют Java API, которое публично и обфускатор не может его изменить. Есть одно исключение, но это даже не обфускатор, а полноценная виртуальная машина с нативной реализацией Java API — Excelsior JET.
Ни для кого не секрет, что в настоящее время наблюдается «бум» троянов, которые, используя уязвимости в JVM, проникают на компьютер пользователя для осуществления своих зловредных действий, в наибольшей степени по отношению к программам, которые работают с финансовой и другой ценной информацией.
Современные средства защиты Java кода должны скорее не защищать его от декомпиляции, а организовывать «песочницу» внутри «песочницы» Java 🙂
С этими проблемами мы столкнулись, разрабатывая систему лицензирования для Java/Java FX приложений — C3. И так родился Stringer.
Теперь вернемся к реальности. Большая часть логики которую хотели бы защищать раработчики коммерческих Java-приложений (в том числе и различные приложения для Android) завязана на строки… Ох уж эти java.lang.String’s.
Например. У нас есть графический клиент, который получает с интернет-ресурса данные в определенном формате, парсит и отображает их пользователю. Злоумышленнику достаточно получить доступ к констант-пулу Java класса и для него не составит никакого труда сделать программу-клон.
Обычно разработчики для защиты от этих атак используют свои функции шифрования строк или пользуются обфускаторами с поддержкой этих функций.
Фрагмент декомпилированного class-файла после встраивания защиты:
Плюс упомянутая выше возможность организации песочницы: защита от использования reflection, защита private-полей классов и методов, защита final-полей классов от модификации.
Мы считаем, что функция шифрования строк нужна практически каждому разработчику, а для компаний которые хотят защитить пользователей своих продуктов от кражи информации Stringer позволяет организовывать защищенную среду внутри Java-приложения, но эта тема достойна отдельного поста…
В настоящее время мы занимаемся разработкой Stringer для Android-приложений.
HackWare.ru
Этичный хакинг и тестирование на проникновение, информационная безопасность
Как обфусцировать JavaScript код
Нужно ли обфусцировать JavaScript
JavaScript код работает в веб браузерах пользователей и доступен им для изучения и других действий. Если вы задались вопросом «Зачем мне обфусцировать мой код JavaScript?», то существует множество причин, по которым рекомендуется защищать код, например:
Обфусцированный JavaScript медленнее!
В статье, ссылка на которую приведена выше, объясняется различие между минимизацией и обфускацией исходного кода. Кроме способа их выполнения и простоты восстановления в исходный вид, полученный результат также различается производительностью.
Минимизированный код: скачивается с сервера быстрее, так как имеет меньший размер, время выполнения (производительность) такая же, как и у кода в исходном варианте.
Обфусцированный код: обычно имеет больший размер и практически всегда является более медленным (на десятки процентов), поскольку кроме основной функции, выполняются сопутствующие действия, необходимые для запуска кода.
Итак, минимизированный код: легко восстановить в исходную форму, производительность не падает.
Обфусцированный код: (очень) трудно восстановить в исходную форму, производительность кода падает. В обфусцированный код можно добавить самозащиту и защиту от отладки, а также бессмысленные фрагменты кода, которые сильно усложнят его анализ.
Вывод: обфусцируйте только тот код, который вы хотите защитить. То есть имеет смысл обфусцировать свой код, но нет смысла обфусцировать код популярных JavaScript библиотек, которые и так общедоступны в исходном виде.
Программы для минимизации и обфускации JavaScript
В этой статье будут рассмотрены различные инструменты и способы защиты и оптимизации JavaScript скода.
Функции btoa и atob
В простых случаев для защиты от парсеров не нужны громоздкие инструменты обфускации и достаточно просто «спрятать» некоторые строки.
Чтобы было понятно, приведу практически пример. Мой сайт kali.tools стали проксировать на другом домене, т. е. выводится содержимое сайта и в нём заменены все ссылки на чужой домен, чтобы при переходе по ссылкам пользователь оставался на этом постороннем сайте.
Поскольку сайт копировался полностью, вместе со всеми скриптами, то достаточно добавить подобный код:
Этот код проверяет, на каком домене открыта страница, и если эта страница не на домене kali.tools, то делается переход на https://kali.tools.
Проблема в том, что при проксировании все упоминания kali.tools заменяются на ЧУЖОЙ_ДОМЕН.ru, и в результате код превращался в:
Код можно обфусцировать (но недостаточно просто минимизировать!). Но ещё проще спрятать строку «kali.tools» с помощью функций btoa и atob.
Функции btoa и atob являются встроенными функциями JavaScript и всегда доступны.
Функция btoa переводит указанную строку в набор символов (работает наподобие Base64), а функция atob выполняет обратную операцию.
Принцип действия в двух строках:
Итак, посмотрим, во что превратится строка «https://kali.tools»:
Теперь в моём простом коде делаем с помощью функции atob обратное преобразование этой строки, получаем:
Данные код делает именно то, что нужно — проверяет на каком домене сайт был открыт и в случае если это не kali.tools, то делает редирект на kali.tools. При этом при проксировании сайта, парсеры не видят строку kali.tools и не делают никаких изменений в этом фрагменте кода.
JavaScript Obfuscator
JavaScript Obfuscator — это мощнейший обфускатор с множеством опций. С помощью JavaScript Obfuscator будет получен код, в котором действительно трудно разобраться. Дополнительно JavaScript Obfuscator может встроить защиту от отладки (при открытии панели «Отладка» в Инструментах веб-мастера в браузере, браузер будет зависать), самозащиту кода (вставка бессмысленных фрагментов и пр.). У JavaScript Obfuscator множество тонкий опций подстройки процесса обфускации.
Данный инструмент имеет как графический интерфейс, так и интерфейс командной строки.
JavaScript Obfuscator онлайн
Вместо установки на компьютер, вы можете использовать онлайн сервис от авторов, он расположен по адресу: https://obfuscator.io/
Установка JavaScript Obfuscator
Установка в Kali Linux
Установка в BlackArch
Как установить графический интерфейс JavaScript Obfuscator
Установка веб интерфейса JavaScript Obfuscator в Kali Linux
После этого веб-интерфейс будет доступен по адресу http://localhost:3000/
Установка веб интерфейса JavaScript Obfuscator в BlackArch
После этого веб-интерфейс будет доступен по адресу http://localhost:3000/
Подробное описание опций и примеры запуска JavaScript Obfuscator вы найдёте на странице https://kali.tools/?p=5621
Чтобы в командной строке обфусцировать JavaScript код в файле script.js:
Например, с опциями по умолчанию код:
JSFuck
JSFuck это очень необычный обфускатор, любой JavaScript код он может представить записью всего из шести символов, а именно []()!+
Такая запись может поставить тупик сильнее, чем вывод рассмотренного выше JavaScript Obfuscator. Но, на самом деле, обфусцированный код может быть приведён к прежнему виду, например, инструментом JStillery.
Установка JSFuck
Установка в Kali Linux
После этого JSFuck будет доступен по адресу http://localhost:8181/
Установка в BlackArch
Установка в Windows
Откройте в веб-браузере файл index.html их архива.
Независимо от способа установки, в файле index.html рекомендуется заменить строку
В результате вы сможете вводить для обфускации не только отдельные строки, но и большие фрагменты кода.
Согласитесь, это очень необычно! Но это не всё! Автор JSFuck подготовил совершенно нереальные концепты, которые взрывают мозг:
Эти крайне занимательные примеры будут рассмотрены в конце этой статьи, поскольку имеют больше образовательное (чем практическое) значение.
Онлайн сервис обфускации кода
Получаемый код по стойкости к деобфускации является довольно слабым и может быть деобфусцирован инструментами, рассмотренными в статье «Деобфускация JavaScript кода».
Пример кода для обфускации:
Все онлайн сервисы обфускации JavaScript
UglifyJS
Инструмент UglifyJS отлично справляется с минимизацией кода JavaScript.
Установка UglifyJS
Установка в Kali Linux
Установка в BlackArch
Пример запуска (для сжатия кода в файле redir.js):
Пример исходного кода:
Пример полученного результата:
У данного инструмента много опций настройки, полный список вы найдёте на странице https://kali.tools/?p=5594
slimit и python-jsmin
Программы slimit и python-jsmin представляют собой модули Python для сжатия исходного кода JavaScript.
Установка slimit
В Kali Linux:
В BlackArch:
Установка python-jsmin в BlackArch:
Самая сложная обфускация JavaScript
Я уже упоминал, что автор JSFuck подготовил самые необычные формы и примеры JavaScript, их список вы найдёте на сайте http://aem1k.com/. Вот некоторые из них:
К примеру, код, написанный тайскими символами:
Код, написанный с помощью только исков:
Это рабочий код, который вы можете поместить в теги и открыть в веб-браузере.
В последнем примере вы не сможете украсть JavaScript код копипастой!
Обфускация JavaScript
В статье собраны всем известные методы и предельно извращенные. Эту статью я решил написать после недавнего прочтения поста в блоге Badass JavaScript и решил её дополнить своими находками.
Первый способ
Он всем известен — обфускация минимизаторами такими как JS Packer, JSmin, YUI Compressor, Closure compiler или можно просто пугуглить «JavaScript Obfuscator» и найдется ещё сто штук разных обфускаторов.
Они превращают существующий код
В какой-то такой вид:
Но ничего не стоит его восстановить с помощью jsbeautifier.org либо просто убрать eval и получить исходный код, многое потеряем, но смысл кода восстановим. Ну и с первого взгляда мы видим, что перед нами JavaScript.
Все это были цветочки под катом жесткие методы обфускации.
Способ второй
Изменение кода до неузнаваемости, который превратит наш мизерный скрипт:
alert(0)
Или вот в такой (код может не работать ибо хабрапарсер):
゚ω゚ノ= /`m´)ノ
Тут с первого раза и не скажешь, что перед нами работающий JavaScript.
Тулза делающая код вида один, код вида два. Vladson нашел ещё одну тулзу jjencode
Объяснение некоторых моментов способа два
Таким образом _/_ = 3/3 = 1
Таким образом первая строка станет ($ = [] [«s» + «o»+ «r»+ «t» ] )()
($=[][«sort»])()
Идем дельше
[__[_/_]+__[_+
Строка превращается…
[__[_/_]+__[_+
Превращается в
[ «a» + «l» + «e» + «r» + «t» ](1)
В конце мы получаем ($=[][«sort»])()[«alert»](1)
Разобьём по частям
a = [] // Создает массив
b = a[«sort»] // Получает ссылку на метод sort
c = b() // Выполяет метод вне контекста массива для получения ссылки на window
d = c[«alert»] // Получает ссылку на window.alert
d(1) // Выполняет window.alert с аргументом 1
Это, конечно, искусственный пример и никакой из обфускаторов так не сможет.
Способ третий
Первый способ делал код похожим на JavaScript, второй совершенно не похожим, а третий сделает код вообще невидимым.
Готовых решений не видел, концепт, подсмотренный с одного из видео JS конференций.
Код будет состоять из двух частей: видимая честь — можно использовать что-нибудь описанное выше для её обфускации и невидимая часть.
Если с видимой все ясно, то секрет невидимой вот в чем: Имеющийся «плохой код» (иначе зачем его прятать) мы пропускаем через наш обфускатор-изчезатор, который превращает видимый скрипт в невидимый т.е. в строку состоящую из знаков табуляции (бит 1) и пробелов (бит 0).
В итоге мы получим в 8 раз больше кода чем имели. Видимая часть будет декодировать невидимую часть и её выполнять: декодирует биты в число, а число переделает в символ String.fromCharCode() ну а дальше eval
В конце получается что-то такое (невидимую часть не обязательно скрывать в элементе)
decodeAndEval(document.getElementById(«evilCode»).innerHTML);
Буду рад ответить на ваши вопросы и увидеть способы обфускации известные вам.
PS Представленный код может не работать, ибо хабрапарсер©, ссылки на тулзы имеются — в случае чего сделайте свой код.
UPD В комментариях ещё несколько раз писали про способ обфускации в png подробнее
X-files в Java: обфускация и виды шифраторов
Давайте рассмотрим базовые способы обфускации
Первый вид шифраторов изменяет структуру программы переименовыванием идентификаторов или удалением информации отладчика. При чём изменение идентификаторов имеет место при работе как с исходным кодом программы, так и с Java байт-кодом. В случае с изменением байткода необходимо запустить некоторую утилиту, которая изменит папку со скомпилированными классами либо jar-файл.
А вот добиться изменения исходного кода можно даже простым рефакторингом в IDE. Например, двумя переименованиями можно превратить понятный класс:
в следующую непонятную писанину:
При компиляции java-классов компилятор может сохранять отладочную информацию, которую можно использовать, например, для удалённой отладки приложения. По-умолчанию javac сохраняет информацию о номерах строк исходного файла и самом исходном файле, а имена локальных переменных не сохраняются.
Вы, наверное, уже догадались: перечисленные выше способы, объеденённые вместе, — это самый простой способ шифровки. Он во многом затрудняет понимание кода взломщиком, но логика работы приложения абсолютно никак не скрывается.
Продвинутые способы обфускации
Второй вид шифраторов изменяет ход выполнения программы (flow obfuscation). Чаще всего при этом «страдают» конструкции выбора (например, if и switch) и циклов (например, for и while). Байткод стараются изменить так, чтобы он не имел прямых аналогов в языке Java, что значительно усложняет работу взломщиков.
Наконец, третий вид шифраторов изменяет структуры данных (structural obfuscators). Добиться этого можно изменением принципов наследования. Например, в иерархии можно создать несколько промежуточных классов. Популярным является разбиение классов на несколько частей. Кстати, разбиение на части можно применить и для массивов. В добавок можно кодировать символы строковых констант и переменных, чтоб уже наверняка всех запутать.
Шифраторы структур данных — наиболее надёжный вид шифраторов. Использование второго и третьего способа шифрования вместе настолько усложняет код программы, что восстановление оригинального кода становится практически невозможным.
На заметку
Кстати, обфускацию любят не только секретные службы, но и разработчики мобильных приложений. Казалось бы, а им зачем? Просто jar-файл после обфускации становится меньше в размере, ведь длинных имён классов и методов в нём нет.
А чем ещё может быть полезна обфускация? Пишите в комментариях!