5 1 1 1 1 1 1 1 1 1 1 Рейтинг 5.00 (1 Голос)

Модификация apk-файла

Вероятно, на пути создания своих форков приложений для Android придётся идти по пути не написания их "с нуля", а модификации уже готовых, зачастую системных приложений.

Постараюсь вкратце описать процесс такой модификации.

Состоит она из четырех этапов:

  1. Декомпилляция apk
  2. Внесение правок в код
  3. Компилляция в apk
  4. Подписывание apk

Что из себя представляет apk-файл

По своей сути apk-файл - это zip-архив, внутри которого хранятся исполняемые и служебные файлы.

Если Вы поменяете расширение на zip, то сможете увидеть его содержимое.

Но работать с этими файлами нельзя, так как они представлены в бинарном виде, даже XML.

Декомпиляция apk

Декомпиляция apk может быть выполнена с помощью утилиты apktool. bat файл для её запуска Вы можете скачать внизу статьи. Самую последнюю версию утилиты можно взять на сайте авторов.

В Ubuntu apktool устанавливается командами:

Код bash:
  1. export apktool_version=2.3.1
  2. sudo -E sh -c 'wget https://bitbucket.org/iBotPeaches/apktool/downloads/apktool_$apktool_version.jar -O /usr/local/bin/apktool.jar'
  3. sudo chmod +r /usr/local/bin/apktool.jar
  4. sudo sh -c 'wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool -O /usr/local/bin/apktool'
  5. sudo chmod +x /usr/local/bin/apktool

Утилита apktool написана на языке Java и требует установки на компьютер Java 8 (JRE 1.8).

После установки JRE необходимо переименовать файл утилиты в apktool.jar (убрать из имени версию, только в случае, если Вы скачивали файл с официального сайта) и перенести jar и bat файлы в папку, которая описана в системной переменной path.

По сути, после этого мы можем уже начать декомпилировать apk.

Способов получения файла APK много.

Кто-то использует для этого Android Device Bridge (ADB). 

Кто-то скачивает файл на компьютер непосредственно из Google Play.

Но лично я использую другой способ. Многие файловые менеджеры позволяют создавать резервные копии приложений. Я, например, использую "Cx Проводник", создаю резервную копию, а потом с его же помощью перебрасываю файл на компьютер через сеть, либо Яндекс диск.

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

Выполняем команду:

Код bash:
  1. apktool d <имя файла. apk>

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

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

Но в ней появилась директория smali, где лежит дезассемблированный код dex-файла, плюс в корне появился файл apktool.yml. Этот файл является служебным файлом apktool и понадобится утилите при обратной сборке проекта.

С этим всем нам и предстоит работать.

В данном способе есть один минус: исходный код получается в small (аналог ассемблера).

Чтобы получить более читаемый код, используют связку dex2jar и jd-gui (В качестве его альтернативы можно использовать Jad, а можно даже использовать облачную декомпиляцию).

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

Также могут пригодиться:

  • smali - ассемблер/дизассемблер smali / dex.
  • apksigner - программа для подписывания apk (входит в состав Android SDK и требует его установки)
  • Android Studio - не помешает, если мы планируем разрабатывать код для Android. Можно сказать, что это целый "комбайн".
  • uber-apk-signer - еще вариант для подписывания apk
  • Virtuous Ten Studio - программа, с функционалом, аналогичным apktool, но имеющая графический интерфейс и работающая под Windows.

Скачивание файла с помощью ADB

В Windows потребуется предварительно установить USB драйвера для вашего Андроид устройства (если Вы не устанавливали его ранее). В Linux этого скорее всего не потребуется.

Установите Android Device Bridge (ADB). Скачать установочный пакет для Windows можно здесь.

Для установки в Ubuntu используется команда:

Код bash:
  1. sudo apt install android-tools-adb

Подключите Android устройство к компьютеру через USB кабелю.

Вывести список всех установленных на устройстве пакетов можно командой:

Код bash:
  1. adb shell pm list packages

Естественно, если Вы используете Ubuntu, то можете использовать grep для фильтрации вывода и поиска искомого пакета (в Windows команда не сработает).

Код bash:
  1. adb shell pm list packages -f | grep <название_пакета>

Теперь мы можем узнать полный путь к пакету при помощи команды

Код bash:
  1. adb shell pm path <название_пакета (без приставки "package:") >

Теперь мы можем скачать файл с устройства на компьютер:

Код bash:
  1. adb pull <путь к пакету на устройстве> <имя файла на компьютере.apk>

Второй параметр является не обязательным.

Скачивание файла из Google Play

На сайте Google Play необходимо найти требуемое приложение и скопировать его адрес (в строке адреса браузера).

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

 Модификация кода

После декомпиляции мы получили папку со следующей структурой:

META-INF/  
META-INF/MANIFEST.MF

информация о программе:

  • версия
  • автор программы
  • цифровая подпись
  • другая информацию
META-INF/CERT.RSA  
META-INF/CERT.SF  
res/ ресурсы, используемые приложением (картинки, иконки и т.д.)
AndroidManifest.xml описание приложения ( разрешения, требуемая версия Android , необходимое разрешение экрана)
classes.dex исполняемый код виртуальной машины Dalvil, то есть, по сути, сам код приложения
resources.arsc файл ресурсов, , в основном строковых, в дополнение к папке

 

Также могут присутствовать папки 

  • assets — аналог папки ресурсов. Основным отличием ресурсов в этом папке является то, что для получения списка asset’ов можно использовать метод AssetManager.list() в коде приложения, получая их динамически;
  • lib — оригинальные статические библиотеки Linux, написанные с помощью NDK (Native Development Kit) на C/C++.

Основными объектами модификации являются:

  • Ресурсы - их можно напрямую заменять, не изменяя имён. Можно добавлять, удалять, переименовывать, но это потребует изменить файл описания ресурсов.
  • Исходный код программы - в зависимости от метода декомпиляции это может быть код на smali, или java.
  • Файл AndroidManifest.XML - если нужно изменить набор прав для приложения, ему название и т.д.

Компиляция apk

Сборка модифицированного нами кода выполняется командой

Код bash:
  1. apktool b <имя папки проекта>

После этого внутри директории  проекта появятся еще две директории:

  • build - в ней лежат скомпилированные файлы
  • dist - тут располагается сам готовый файл apk. Но установить его на устройство пока не получится, так как требуется этот файл подписать. Если Вы посмотрите, в этом apk просто отсутствует каталог META-INF, в котором хранится цифровая подпись.

Подписание apk-файла

Мне известно два способа подписания apk-файла:

Но хочу оговориться, что установить приложение сразу не получится. Дело в том, что Google Play блокирует установку приложений, у которых электронная подпись отличается от предыдущей версии. Сделано это в целях защиты от установки подложных приложений.

Поэтому "поверх" пересобранное приложение установить нельзя. Нужно предварительно удалить оригинальное и установить своё.

Либо изменить название и установить свой форк рядом с оригиналом.

Подписывание apk с помощью uber-apk-signer

Подписывание выполняется командой:

Код bash:
  1. java -jar uber-apk-signer.jar --apks <имя проекта>/dist/<имя проекта>.apk

В результате в директории с исходным apk появится файл с именем <имя проекта>-aligned-debugSigned.apk

Это и есть наш подписанный файл.

Подписывание apk с помощью apksigner

В отличии от uber-apk-signer в этом приложении можно указать свои параметры для генерации электронной подписи.

На первой вкладке программы (Key Generator) мы создаем ключи, на второй вкладке (APK Signer) производим подписывание apk.

Для создания цифровой подписи необходимо заполнить на первой вкладке следующие поля:

  • Target File — файл хранилища ключей;
  • Password и Confirm — пароль хранилища;
  • Alias — имя ключа в хранилище;
  • Alias password и Confirm — пароль секретного ключа;
  • Validity — срок жизни ключа (в годах).

Также подпись можно проводить и из командной строки.

Код bash:
  1. apksigner sign --ks <хранилище>.jks | --key <ключ>.pk8 --cert <сертификат>.pem [параметры] <имя приложения>.apk

Следующим шагом мы подписывем apk. На вкладке APK Signer нужно выбрать только что сгенерированный файл, ввести пароль хранилища, алиас ключа и пароль ключа, затем нужно выбрать файл apk и нажимаем кнопку «Sign».

Attachments:
URLFile sizeLast modified
Access this URL (https://www.rodina-ru.com/files/apk/apktool.bat)apktool.bat1 kB2022-04-15 20:06

Оставьте свой комментарий

Оставить комментарий как гость

0
  • Комментариев нет
Модификация apk-файла - 5.0 out of 5 based on 1 vote