2015-05-23 2 views
13

Я знаю, как извлечь APK файлы классов с использованием системы на основе ниже окна:Как я могу программно декомпилировать файлы dex в Android?

Шаг 1: Переименование .apk файла

Переименуйте .apk файл с расширением .zip (для пример пусть файл быть "demofile.apk", то после переименования становится "demofile.apk.zip")

Шаг 2: Получение файлов Java от APK

Теперь извлеките переименованный zip-файл в определенную папку, например, пусть эта папка будет «demofolder». Теперь загрузите dex2jar по ссылке для windows и извлеките этот zip-файл в папку «demofolder».

Теперь откройте командную строку и перейдите в папку, созданную в предыдущем шаге и введите команду «dex2jar classes.dex» и пресс-enter.This будет генерировать файл «classes.dex.dex2jar» в той же папке.

Теперь Загрузка Java Decompiler по ссылке и извлечь его и старт (двойной щелчок) Jd-gui.exe

С JD-GUI окно просмотра созданного файла "classes.dex.dex2jar" в demofolder, это даст все файлы классов по имени src.

Теперь в меню Файл выберите пункт «сохранить все источники» это создаст почтовый файл с именем «classes_dex2jar.src.zip», состоящий из всех пакетов и файлов Java.

Извлеките этот zip-файл (classes_dex2jar.src.zip), и вы получите все java-файлы приложения.

Вышеуказанные шаги будут генерировать java-файлы, но для получения файлов xml выполните следующих шагов.

Шаг 3: Получение XML-файлы APK

Скачать apktool и apktool установить по ссылке и извлечь оба файлы и поместить его в ту же папку (например, «demoxmlfolder»).

Поместите .apk файл в той же папке (т.е. demoxmlfolder)

Теперь откройте командную строку и пройдите в папку, где хранится apktool (здесь «demoxmlfolder») и введите команду «apktool если каркасных разрешении .apk «Выше команда должна привести к« Установленной платформе ... »Теперь в командной строке введите команду« apktool d filename.apk » (где filename - это имя файла apk). Это создаст папку имя файла имени в текущий каталог (здесь demoxmlfolder), где все файлы xml будут сохранены в папке res \ layout.

Но я хотел бы знать, как выполнить выше в Android программно. Поэтому мое приложение для Android может просто извлечь файл dex другого приложения.Я не возражаю, если файл Dex копируется в другом месте на телефоне, а затем декомпилирован (это просто декомпилируемый я застрял на)

В принципе, как показано ниже, что у меня есть доступ к дексу каждому приложения , просто не знание того, как декомпилировать его в Android.

Любая помощь будет фантастической.

final PackageManager pm = getPackageManager(); 
       PackageInfo packageInfo = null; 
       try { 
        packageInfo = pm.getPackageInfo("PACKAGE NAME HERE", PackageManager.GET_META_DATA); 
       } catch (NameNotFoundException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       File file = new File(packageInfo.applicationInfo.sourceDir); 
       Uri uri = Uri.fromFile(file); 
+1

Для этого потребуется root, так как вы не можете читать другие ресурсы процесса/приложения, а тем более их двоичные файлы, как uid вашего собственного приложения. Только мои два цента. PD: будьте готовы переопределить пару классов, Java API Java не реплицирует полный набор API рабочего стола – Machinarius

+0

@Machinarius, для этого потребуется только root для частных приложений. Проверьте https://play.google.com/store/apps/details?id=com.njlabs.showjava. Я работал над ним пару месяцев назад, но dex2jar работает на Android медленнее. –

+0

Я был совершенно уверен, что модель безопасности Android не позволит вам делать это без использования root. Я стою исправлено. Хорошая работа по достижению этого, Поздравляю. Что касается повышения производительности ... Это потребует особо вмешательства с кодом dex2java, чтобы сделать его многопоточным и тому подобное. – Machinarius

ответ

8

Вы можете просмотреть исходный код приложения ShowJava here. Похоже, он использует инструмент Dex2Jar. Декомпиляция начинается с BackgroundService, и всякая магия происходит в некоторых специальных классах Jar. Я не знаю, появился ли этот код из библиотеки или если весь этот код создан им. Посмотрите на метод ExtractJar и DecompileJar, чем не должно быть трудно понять, что происходит.

1

Вам необходимо выполнить несколько шагов для того, чтобы получить его работу:

  1. Got к dex2jar bitbucket site и загружать файлы. Добавьте файлы jar в свой проект.
  2. С помощью DexFileFactory вы можете загрузить apk, конвертировать его в dex (loadDexFile) и сохранить его в файле (writeDexFile).
  3. С другой библиотекой, которая преобразует банки в java-файлы, вы можете, наконец, прочитать содержимое. Я нашел Procyon, что кажется очень простым. Загрузите файл класса с помощью InputTypeLoader, а затем вызовите Decompiler.decompile().

Конечно, вы можете использовать другие библиотеки на шаге 3, но для шага 1 и 2 я не нашел альтернатив.

Смежные вопросы