Деобфускатор Java поддерживает переименование переменных?

Я пытаюсь реконструировать файл .jar (в основном это группа файлов .class). Однако есть две трудности:

  1. В именах некоторых переменных, методов и классов используются символы Юникода, которые не могут быть правильно отображены. Это делает редактирование исходников очень неудобным.

  2. В именах некоторых классов используются ключевые слова Java (например, if). Поэтому компилятор Java будет жаловаться при перекомпиляции реконструированных исходных файлов.

Существуют ли какие-либо деобфускаторы Java, которые могут преодолеть эти трудности?


person Cyker    schedule 05.11.2016    source источник
comment
Состояние декомпиляторов в Java — печальная история. Я предполагаю, что прошу декомпиляторы, которые даже пытаются сломать обфускаторы вдобавок к этому ... удачи с этим. Кроме того: ваш вопрос явно не по теме. Вы запрашиваете рекомендации для внешних ресурсов.   -  person GhostCat    schedule 05.11.2016
comment
@GhostCat Я не прошу декомпиляторы. Я ищу способ изменить имена переменных в файлах JAR. Работающий деобфускатор Java, поддерживающий переименование переменных, очевидно, лучший способ решить эту проблему. Если у декомпилятора есть такая функция, это тоже решение, но не сам вопрос. Кстати, все вопросы являются рекомендательными. Я ищу ответ, чтобы решить мою проблему, но не сравнение между инструментами. Это не выглядит очень субъективно, верно?   -  person Cyker    schedule 05.11.2016
comment
вы пробовали jd-gui?   -  person Pradeep Pati    schedule 06.11.2016
comment
@PradeepPati Да. Он просто не может правильно отображать символы Юникода. И это не касается ключевых слов Java. Я уже упоминал об этих проблемах в вопросе.   -  person Cyker    schedule 06.11.2016


Ответы (2)


Есть несколько инструментов, которые могут переименовывать идентификаторы Java. Например, вы можете просто запустить на нем Proguard, чтобы все переименовать.

При этом я бы предложил пересмотреть ваш подход. Компиляция и декомпиляция Java - это процессы с потерями. Декомпиляция полезна для обратного инжиниринга, но, как правило, вы не сможете перекомпилировать декомпилированный код. Если он ранее был запутан, вы также можете забыть об этом.

Лучший способ изменить запутанный код — использовать ассемблер и дизассемблер Krakatau. Сборка Krakatau может быть обратимо преобразована в байт-код и обратно, что означает, что вы можете редактировать произвольные классы, не нарушая правил, независимо от того, как они были запутаны. Единственным недостатком является то, что вы должны быть знакомы с байт-кодом Java.

person Antimony    schedule 05.11.2016
comment
Этот ответ выглядит хорошо. На самом деле я только что разработал конфигурацию Proguard, которая работает с моим приложением. Результат выглядит намного лучше, даже несмотря на то, что есть еще некоторые общедоступные переменные, имена которых должны быть сохранены. Также спасибо за указание на Кракатау. На самом деле я работаю на Android, и есть smali/baksmali, похожие на это. Я бы продолжил работать, чтобы посмотреть, получится ли что-то наконец. - person Cyker; 06.11.2016

Enigma Кучаза поддерживает переименование локальных переменных. Он больше не обновляется и работает на BCEL, который также больше не обновляется. Пока вы не декомпилируете что-то, с чем BCEL не может справиться, все должно работать нормально.

person Display Name    schedule 15.01.2017