Как дизассемблировать файл apk, изменить и собрать заново

Обновлено: 20.11.2024

Мне нужно изменить существующий APK, изменить исходные коды, а затем перекомпилировать его.

  • Я могу декомпилировать его с помощью dex2jar или apktool, он отлично работает
  • Из файла jar я могу получить исходные коды Java (используя jd-gui)
  • Затем я могу изменить файлы Java

Но теперь я хотел бы знать, как перекомпилировать файлы Java и поместить их обратно в файл jar! (часть jar должна быть простой, основная проблема, похоже, заключается в том, как перекомпилировать файлы Java для Android)

Я знаю, что другим решением является использование apktool, а затем изменение файлов smali, но это кажется очень сложным, когда мы хотим добавить много кода!

Мое приложение является базовым приложением HelloWorld без обфускации.

8 ответов 8

Благодаря Крису Джестер-Янгу у меня все получилось!

Думаю, то, что у меня получилось, сработает только на очень простых проектах:

  • С помощью Dex2jar я получил банку.
  • С помощью jd-gui я конвертирую свой Jar обратно в файлы Java.

С помощью apktool я получил манифест Android и файлы ресурсов.

В Eclipse я создаю новый проект с теми же настройками, что и у старого (проверив всю информацию в файле манифеста)

/!\ убедитесь, что вы удалили старый apk с устройства, будет выдано сообщение об ошибке о том, что подпись apk не совпадает со старой!

это не будет работать со сложными приложениями (Dex2jar не идеален - также некоторым разработчикам удается заблокировать свои приложения с помощью методов proguard или подобных). Но для некоторых это может сработать

Да, вы правы, поэтому я сказал: "Я думаю, то, как я это сделал, будет работать только на очень простых проектах"

Мне удалось использовать этот способ в очень большом приложении, я думаю, что он отлично работает и для некоторых сложных приложений

@loveisbug да, приложение было не моим, и таким образом удалось декомпилировать apk, но его код был пропущен, поскольку приложение закодировано с использованием гибридной техники, а не нативного кодирования, поэтому преобразование его в нативное не даст мне идеальный результат, но, по крайней мере, я мог видеть классы и методы, которые хотел видеть

Я знаю, что на этот вопрос все еще есть ответ, я хотел бы передать информацию о том, как получить исходный код из apk без dexjar.

  1. Загрузить apk с локального компьютера
  2. Подождите немного
  3. Загрузить исходный код в формате zip

Я не знаю, насколько это надежно.

@darkheir Answer — это ручной способ декомпиляции apk. Это помогает нам понять различные этапы создания Apk.

Получив исходный код, выполните действия, указанные в принятом ответе

Все еще стоит. Снимаю шляпу перед создателями.

Но теперь я хотел бы знать, как перекомпилировать файлы Java и поместить их обратно в файл jar! был ли основной вопрос правильным? Это не ответ.

Ответы уже устарели или не полны. Это может работать для незащищенных apk (без Proguard), но в настоящее время никто не развертывает незащищенный apk. То, как я смог изменить (мой) хорошо защищенный apk (Proguard, проверка безопасности, которая проверяет наличие «инструментов взлома», проверка безопасности, которая проверяет, переупаковано ли приложение в режиме отладки.) через apktool, как уже упоминалось другие здесь. Но никто не объяснил, что нужно заново подписывать приложение.

В моем тесте исходный выпуск apk не вел журнал. После декомпиляции с помощью apktool я заменил файл с полным байтовым кодом без ведения журнала на файл с полным байтовым кодом с ведением журнала, перекомпилировал и подписал его, и я смог установить его на свое устройство. После этого я смог просмотреть журналы в Android Studio, подключив к нему приложение.

По моему мнению, декомпиляция с помощью dex2jar и JD-GUI полезна только для лучшего понимания того, что делают классы, просто для чтения. Но так как все защищено, я не уверен, что вы когда-нибудь сможете перекомпилировать этот полусырой Java-код в рабочий apk. Если это так, пожалуйста, дайте мне знать. Я думаю, единственный способ — манипулировать самим байт-кодом, как указано в этом примере.

Сегодня я хотел бы поделиться с вами своими выводами о том, как можно изменить существующий файл .apk.

Файл .apk представляет собой мобильное приложение, установленное на мобильном устройстве, таком как смартфон, планшет, носимое устройство и т. д.

Такой файл .apk представляет собой простой архив, который можно открыть с помощью любого упаковщика, например, WinRAR

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

… но это совсем другая история.

В любом случае вы можете открыть архив, а затем изменить любой файл ресурсов и сохранить изменения в архиве.

Но если вы впоследствии попытаетесь установить .apk на смартфон (планшет и т.п.), вы получите сообщение об ошибке.

На следующем снимке экрана показана ошибка при установке измененного примера приложения myApp.apk на устройство Android:

Причина в том, что после модификации контрольная сумма и подпись больше недействительны.

Поэтому простое изменение файла .apk невозможно.

Однако существует допустимый вариант использования для изменения или замены файлов внутри существующего .apk.

– файлы, которые находятся в папке с ресурсами

– файлы свойств, содержащие данные конфигурации

– изображения, которые можно заменить

– информационные ресурсы по стилю

Мой личный вариант использования:

Я создал приложение для Android с помощью SAP Netweaver Gateway Productivity Accelerator

Мне пришлось доставить приложение пользователям в виде файла .apk.

Но было требование, чтобы они хотели модифицировать готовое приложение (изменить данные конфигурации).

Поэтому мне пришлось придумать, как этого добиться: модифицировать приложение, не имея доступа к исходному коду.

Ниже я делюсь с вами необходимыми шагами.

Описание основано на следующем программном обеспечении и версиях:

Текущий API 19 для Android

Ява 7

Windows 7

Если вы не знакомы с Android, но хотели бы познакомиться, вы можете проверить документы [1] и [2]

Здесь объясняются все предпосылки для понимания этого блога.

Для выполнения команд, описанных ниже, вам необходимо иметь Java в вашей переменной PATH вашей системы Windows (см. объяснение в [1]).

Обзор

Чтобы изменить существующий файл .apk, необходимо выполнить 3 шага:

<р>1. Внесите нужные изменения в файл .apk

<р>3. Установите .apk на устройство

<р>1. Сменить ресурс в .apk

Откройте файл .apk с помощью WinRAR (если это не сработает, переименуйте файл с расширением .apk в .zip)

Измените ресурс в архиве по желанию (инструменты упаковщика позволяют изменять файлы без необходимости распаковки архива)

После внесения изменений необходимо позаботиться о файлах подписи, являющихся частью .apk:

Внутри архива перейдите в папку META-INF

Удалите существующие файлы *.RSA и *.SF

На следующем снимке экрана показано содержимое папки META-INF в файле .apk:

Теперь архив можно закрыть.

Если вы изменили расширение файла раньше, теперь вам нужно изменить его обратно на .apk

<р>2. Подпишите .apk

Android не позволяет установить приложение (apk), которое не подписано.

При разработке приложения в Eclipse ADT ("Инструменты разработчика Android", расширение Eclipse, поддерживающее разработку для Android) заботится о подписании приложения с помощью сертификат по умолчанию перед установкой на устройство.

Это удобно, но со следующим описанием каждый может подписать приложение.

Подписание .apk выполняется в два этапа:

а) создать сертификат

b) подписать .apk созданным сертификатом

Оба шага выполняются с помощью команд в командной строке

а) Создать сертификат

Если вы работаете в среде Java, у вас есть JDK в вашей файловой системе.

JDK поставляется с инструментом для управления сертификатами: keytool.

Вы можете найти его в папке …/bin вашей установки JDK.

Теперь вы можете сгенерировать сертификат, используя приведенную ниже команду.

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

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

хранилище ключей

Здесь вы можете указать произвольное имя для вашего хранилища ключей.

Имя, которое вы укажете здесь, будет именем файла keystore, который будет создан.

Файл будет создан в текущем каталоге.

(Я не пробовал, но, возможно, вы можете ввести имя существующего файла хранилища ключей, чтобы сохранить там новый сертификат)

псевдоним

Здесь вы также можете указать произвольное имя для алиаса.

Он предназначен для того, чтобы вы его узнали.

Псевдоним – это удобочитаемое имя сертификата, которое будет создано и сохранено в хранилище ключей.

действительность 1000

Это желаемое количество дней.

Вы можете ввести любое число.

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

Обратите внимание, что параметры sigalg и keyalg являются обязательными для JDK 7, поэтому в их добавлении нет необходимости, если вы используете JDK 6

При выполнении команды вы получите несколько запросов в командной строке с запросом пароля, имени пользователя, организации, города и т. д.

Вы можете ввести здесь любые произвольные данные, вам нужно только помнить пароль.

После выполнения команды вы увидите сгенерированный файл keystore в вашей файловой системе в текущем каталоге (откуда вы выполнили команду)

Теперь вы можете приступить к подписанию .apk, используя только что созданный сертификат.

Прежде чем подписывать файл .apk, необходимо убедиться, что в .apk нет доступных сертификатов.

Это описано в шаге 1 выше.

Для подписания архива мы используем инструмент jarsigner, который входит в состав JDK и находится в том же месте, что и keytool.

Следующая команда используется для подписи apk.

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

хранилище ключей

Здесь вам нужно ввести имя, которое вы указали на предыдущем шаге а)

Чтобы командная строка была короткой, я рекомендую временно скопировать файл хранилища ключей в то же место, где вы выполняете команду.

Здесь вам нужно ввести имя apk-файла, который вы хотите подписать

Чтобы командная строка была короткой, я рекомендую временно скопировать файл .apk в то же место, где вы выполняете команду.

Здесь вам нужно ввести имя псевдонима, который вы указали при создании сертификата

Обратите внимание, что параметры sigalg и Digestalg необходимы для JDK 7, поэтому нет необходимости добавлять их, если вы используете JDK 6

После того, как вы выполнили команду, вы можете проверить результат в файле .apk:

Откройте архив, перейдите в папку …/META-INF и проверьте наличие файлов CERT.RSA и CERT.SF. создано.

<р>3. Установите APK на устройство

Теперь, когда файл .apk подписан, вы можете установить его на свое устройство.

Кстати: эта процедура также называется боковой загрузкой.

Для приложений Android установка выполняется из командной строки с помощью команды adb.

adb означает Android Debug Bridge

adb.exe – это программа, которая соединяет ПК с устройством Android.

Он разрешает доступ к устройству, позволяет запускать операции, передавать файлы и т. д.

Чтобы установить .apk на устройство, вам необходимо подключить устройство к компьютеру через USB-кабель,

затем выполните следующую команду

Чтобы командная строка была короткой, вы можете временно скопировать файл apk в то же место, где вы выполняете команду.

Результатом должно быть сообщение об успешном выполнении в командной строке.

Если нет, возможно, какой-либо из предыдущих шагов завершился неудачно.

Вы можете найти приложение в папке приложений вашего смартфона.

Эта процедура работала для меня на WIN7 и JDK 7.

Не требовалось ни пересобирать приложение, ни генерировать новую контрольную сумму или что-то подобное.

Ссылки

Дополнительную информацию для начинающих см. в следующих документах.

- Все функции интегрированы в контекстное меню Windows.
- Декомпилировать классы APK в исходные коды Java.
- Разберите APK на smali-код и расшифруйте его ресурсы.
- Установите APK на телефон, щелкнув правой кнопкой мыши.
- Перекомпилируйте APK после редактирования кода и/или ресурсов smali.

ТРЕБОВАНИЯ

КАК УСТАНОВИТЬ ПАКЕТ

* Распакуйте прикрепленный архив на жесткий диск.
* Откройте извлеченную папку.
* дважды щелкните файл shellext-add.cmd

КАК УДАЛИТЬ ПАКЕТ

Элементы, добавленные в контекстное меню правой кнопкой мыши

КАК РАЗБИРАТЬ APK

Предположим, вы хотите разобрать файл yourapp.apk. Все, что вам нужно сделать, это:
* щелкнуть правой кнопкой мыши файл yourapp.apk
* выбрать -> "Разобрать APK и декодировать ресурсы"

Папка с именем 'yourapp-disasm' будет создана в той же папке, что и
apk.Он будет содержать smali дизассемблированные и декодированные ресурсы.
Вы можете изменить smali-код и/или ресурсы внутри этой папки.

Для мгновенного доступа к методам и полям, а также для лучшего понимания
дизассемблирования smali вы можете просмотреть иерархию реконструированного
исходного кода Java в JD-GUI Java Decompiler. Исходные коды Java
будут отображаться в среде IDE как проект Java.
* щелкните правой кнопкой мыши файл yourapp.apk
* выберите -> «Просмотреть Java-код APK»

КАК ПЕРЕКОМПИЛИНИРОВАТЬ APK ИЗ РАЗБОРКИ

Чтобы собрать, подписать и заархивировать в новый APK, независимо от того, изменили ли вы
исходный код и/или ресурсы или нет:
* щелкните правой кнопкой мыши папку «yourapp-disasm»
* выберите -> 'Перекомпилировать APK из дизассемблированного'

КАК УСТАНОВИТЬ APK НА ТЕЛЕФОН

Чтобы установить несистемный apk с ПК (с сохранением его данных, если он уже был
установлен на телефоне)
* подключите телефон Android к ПК через usb-кабель
* щелкните правой кнопкой мыши APK в проводнике Windows
* выберите -> «Установить APK на телефон»

ПРИМЕЧАНИЯ О СИСТЕМНЫХ APK-файлах

ИНСТРУМЕНТЫ ВКЛЮЧЕНЫ

КАК ОБНОВИТЬ ВКЛЮЧЕННЫЕ ИНСТРУМЕНТЫ

* Периодически проверяйте наличие обновлений для включенных инструментов.
* Веб-ссылки также находятся внутри папки «tools».
* Когда доступно обновление, загрузите и извлеките его в
соответствующую папку в папке «Инструменты».​

ОБНОВЛЕНИЕ ПАКЕТА v3 — АВГУСТ 2012

ОБНОВЛЕНИЕ ПАКЕТА v4 — ЯНВАРЬ 2013 Г.

* android-apktool 1.5.1
* dex2jar-0.0.9.12-a
* jd-gui-0.3.5.windows
* Изменено: названия пунктов меню для большей ясности
* Добавлено: оптимизация изображений png, подпись и zipalign во время перекомпиляции.
* Добавлено: установка APK на телефон​

ОБНОВЛЕНИЕ ПАКЕТА v4.1 — 27 ЯНВАРЯ 2013 Г.

* Исправлено: пакет не устанавливается должным образом, если расширение APK назначено другому приложению.
* Исправлено: мелкие исправления при выборе «Перекомпилировать APK из разборки»

ОБНОВЛЕНИЕ ПАКЕТА версии 4.2 — 2 ФЕВРАЛЯ 2013 Г.

* Обновлено: android-apktool 1.5.2
* Исправлено: сценарии установки и удаления стали более удобными для UAC.

Итак, я хочу разобрать MCPE apk, отредактировать активы и часть кода, собрать их обратно. Как ты это делаешь? Когда я редактирую apk, собираю его обратно и устанавливаю, пишет "приложение не установлено"

У меня Android

Я думаю, вам нужно установить приложение под названием ES File Explorer. Затем выполните следующие действия.

переименуйте .apk в .zip

Измените папку ресурсов.

Переименуйте его в .apk

Используйте приложение для подписи apk, чтобы подписать файл.

Что касается изменения самого кода, я не уверен. Все сжатие и переименование можно выполнить с помощью проводника файлов ES

Что вы используете для подписи?

Я обнаружил, что часто приложение не устанавливается, потому что где-то все еще существуют остатки предыдущей версии, обычно за пределами системного раздела. Теперь это становится немного рискованным, потому что вам нужен root-доступ, чтобы изменить эту часть вашей памяти. Я использую рут эксплорер. То, что вы хотите удалить, это /data/app/com.mojang.minecraftpe-1.apk, который является фактическим приложением, и /data/data/com.mojang.minecraftpe, который является файлом данных для mcpe. После того, как я вручную удалил и приложение, и его файл сохранения, я часто могу переустановить приложения. Сообщение «возникла проблема при синтаксическом анализе пакета» означает, что приложение несовместимо с используемой версией ОС Android. Сообщение об ошибке «приложение не установлено из-за конфликтующей подписи» или что-то подобное означает, что у вас есть ненужные остатки от предыдущей версии, обычно это файл данных.

Я НЕ НЕСУ НИКАКОЙ ОТВЕТСТВЕННОСТИ ЗА ЛЮБОЙ УЩЕРБ, КОТОРЫЙ МОЖЕТ БЫТЬ ПРИЧИНЕН ЛЮБЫМИ ДЕЙСТВИЯМИ ЧИТАТЕЛЯ. Я даю только те советы, которые сработали для меня в прошлом. Прежде чем рутировать, проведите исследование! Знайте, что вы делаете! И убедитесь, что вы знаете, что вы удаляете за пределами системного раздела, поскольку я заблокировал устройство, возясь с тем, что мне не следовало делать.

Читайте также: