Как деобфусцировать JAR-файл с помощью map.txt, сгенерированного Proguard?

Это может показаться подозрительным, но мне нужно деобфускировать собственное приложение. Некоторое время назад я опубликовал свое приложение, которое я запутал с помощью Proguard. К сожалению, я не сохранил эту версию приложения и сильно изменил код.

Теперь мне нужен код этой старой версии. У меня все еще есть файл mapping.txt, сгенерированный Proguard.

Я преобразовал файл class.dex в jar (используя инструмент dex2jar), теперь мне нужно деобфусцировать его в соответствии с mapping.txt. Есть ли инструменты, которые могут мне помочь? Может сам Прогард?

УПД. Мне нужен инструмент, который может автоматически переименовывать все классы, функции и т. д., поэтому мне не нужно делать это вручную. Спасибо


person user2758776    schedule 27.03.2016    source источник
comment
Вероятно, это невозможно. Как только вы скомпилируете приложение, код уже запутан компилятором. Случай, когда вы снова запутываете приложение с помощью Proguard, означает двойную запутанность. Может быть способ деобфускировать и декомпилировать приложение. Я рекомендую вам сохранить и сделать резервную копию всего, прежде чем писать код в следующий раз.   -  person mob41    schedule 27.03.2016
comment
Это не поможет вам сейчас, но для предотвращения подобных проблем в будущем используйте систему контроля версий (VCS).   -  person F43nd1r    schedule 30.03.2016


Ответы (2)


Если у вас есть сопоставления, вы можете вернуть все имена классов, полей и методов. Вы можете использовать java-asm (библиотека модификации байт-кода), чтобы переназначить имена классов и членов. Большая часть работы будет заключаться в обновлении дескрипторов элементов.

Я сделал один для себя, и потребовалось около дня, чтобы заставить его работать надежно.

Редактировать: это не идеально, но чертовски близко. Ссылка. Снимок экрана  GUI Дайте ему защищенный jar-файл, сопоставления, и он переименует все, что сможет найти. Есть несколько проблем, но для простого просмотра источника он должен выполнять свою работу. Просто сбросьте полученный файл jar (FileName + "-Re.jar") в декомпилятор, такой как Luyten/JD-GUI. Также входные файлы меняются только с помощью кнопок. Текстовые поля предназначены только для визуальной обратной связи/подтверждения.

Редактировать 2: исправлено NPE, возникающее, когда запись класса в сопоставлениях не существует в данной банке.

Изменить 3: исправлено множество проблем, из-за которых методы не переименовывались.

Редактировать 4: загружен скомпилированный jar на github (релизы, в zip-файле он находится в утилите сопоставления), добавлена ​​поддержка нескольких типов сопоставления.

person Display Name    schedule 28.03.2016
comment
Это похоже на то, что я хочу, к сожалению, я получаю NPE, когда нажимаю кнопку «Отменить»: java.lang.NullPointerException в me.lpk.mapping.MappedClass.‹init›(MappedClass.java:38) в me.lpk. Mapping.ProguardLoader.readClass(ProguardLoader.java:121) в me.lpk.mapping.ProguardLoader.read(ProguardLoader.java:61) в me.lpk.mapping.ProguardLoader.read(ProguardLoader.java:41) в me.lpk .mapping.MappingGen.mappingsFromProguard(MappingGen.java:49) в me.lpk.ReProguard$4.actionPerformed(ReProguard.java:123) ... - person user2758776; 31.03.2016
comment
Похоже, он выбросил это, потому что имя класса, которое он пытался загрузить, не существовало в банке. Переработан класс ProguardLoader, чтобы проверить это. Если класс не существует в банке, сопоставление для этого класса будет проигнорировано. Перезалил инструмент с исправлением. - person Display Name; 31.03.2016
comment
Спасибо за ваши усилия, но я все равно получаю NPE: java.lang.NullPointerException в me.lpk.mapping.MappedClass.‹init›(MappedClass.java:38) в me.lpk.mapping.ProguardLoader.readClass(ProguardLoader.java :126) в me.lpk.mapping.ProguardLoader.read(ProguardLoader.java:61) в me.lpk.mapping.ProguardLoader.read(ProguardLoader.java:41) в me.lpk.mapping.MappingGen.mappingsFromProguard(MappingGen. java:49) at me.lpk.ReProguard$4.actionPerformed(ReProguard.java:123) Может быть, вы можете поделиться со мной исходным кодом вашего инструмента? Спасибо! - person user2758776; 31.03.2016
comment
Вот: github.com/LPK-Matt/SkidSuite2 Я пытаюсь воспроизвести NPE, но я не могу понять, как ваши сопоставления вызывают его сейчас. - person Display Name; 31.03.2016
comment
Ссылки больше не работают, вы сменили имя пользователя на github? - person beppe9000; 24.06.2018
comment
@ beppe9000 Я нашел это здесь: github.com/FireMasterK/SkidSuite2-Latest - person Oleksandr Albul; 21.12.2019
comment
Связанный репозиторий, похоже, не содержит рассматриваемого инструмента, но я нашел эту альтернативу: github.com/ SuspiciousActivity/ProGuard-Unmapper - person Avamander; 01.09.2020

Я предлагаю использовать инструмент proguard, как это предлагается в ответ выше вместе с Enigma. Решение вашей проблемы не может быть очень простым, и вам нужно использовать комбинацию доступных инструментов для ее решения.

person Akram    schedule 31.03.2016
comment
В дополнение к Proguard я также заставил его работать с картами Engima. Однако я не скомпилировал версию с активным графическим интерфейсом Enigma. Однако источник находится в репозитории: github.com/LPK-Matt/SkidSuite2/blob/master/SkidReob/src/me/lpk/ - person Display Name; 05.04.2016
comment
@DankVader этот URL дает 404 - person beppe9000; 08.10.2016
comment
@ beppe9000 Конкретный файл был удален в коммите, но репо все еще работает. github.com/LPK-Matt/SkidSuite2/releases После этого комментария скомпилированы и помещены под релизы. - person Display Name; 09.10.2016