Программа для разбора apk приложения. Нюансы редактирования системных APK

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

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

Во-первых, нужно произвести процесс деодексирования системных APK-файлов. О том, как это сделать, мы расскажем в .

Итак, .apk-файл был деодексирован и декомпилирован. Разбираем интересующее нас приложение, пускай оно будет носить название, для наглядности примера, framework - res . apk . В голове запоминаем его как оригинальное приложение.

Допустим, все нужные изменения в приложение мы внесли. Подробнее о всех аспектах APK-файлов мы поговорим в . Теперь нужно упаковать его обратно. Готовое упакованное приложение запомним в уме как модифицированное приложение 2.

Теперь мы объясним, зачем нужно было в уме запоминать приложения как оригинальное и модифицированное 2. Собранное программой ApkTool (или с помощью графического расширения пользовательского интерфейса вроде SmartApkTool) приложение работать не будет, но это не проблема. Выполняем следующие действия:

Я упоминал о приложении SmartAPKTool. Оно может распаковывать, запаковывать и подписывать изменённые apk-файлы. Её достоинством является наличие графического интерфейса. Однако есть и серьёзный недостаток. SmartAPKTool давно не обновлялся, и программа некорректно распаковывает и запаковывает приложения для свежих версий Android. Поэтому здесь я попытаюсь объяснить, как пользоваться для этих целей приложением apktool .

Замечание 1.
Программу SmartAPKTool по-прежнему удобно использовать для подписи собранных apk-файлов.
Замечание 2.
Ссылки на упомянутые в статье программы находятся ↓

Программа apktool не имеет графического интерфейса. Это является минусом для тех, кто не привык работать с командной строкой. Но есть и плюс: в отличие от SmartAPKTool, мы будем видеть все ошибки, а значит будем знать, что исправить.

Ссылки на упомянутые программы:

Важное замечание по apktool версий 2.x

В версии 2.0.0-Beta7 нужно применять ключ --output , чтобы указать директорию при декомпиляции и результирующий файл при сборке:

apktool decode orig.apk -- output orig
apktool build orig -- output result.apk

О том, как декомпилировать приложения для Android, то Вы знаете, что остановился я на том, как собрать все файлы, которые получились при разборке приложения, обратно в APK.

Лирическое отступление

К сборке рекомендуется папка с файлами, полученная в результате декомпиляции с помощью apktool. Файлы кода, которые представляют из себя набор инструкций для виртуальной машины Dalvik, собираются обратно в архив классов без каких-либо проблем. В то время как преобразование из Dalvik в Java и обратно может привести к проблемам несовместимости. Как следствие, программа будет работать некорректно. Поэтому для успешной модификации программ, а не только ради исследования, Вам необходимо изучить инструкции Dalvik .

Сборка

Собрать такие файлы обратно в APK достаточно просто. Для этого необходимо запустить apktool с соответствующим флагом сборки и передать ему путь к папке с декомпилированным приложением внутри. Например, если у нас есть папка app, которая размещена в том же каталоге, что и apktool, то команда будет выглядеть так:

Shell

java -jar apktool.jar b app

java - jar apktool .jar b app

После сборки готовый APK файл будет лежать в каталоге app/build . Далее необходимо подписать APK. Делается это для того, чтобы приложение работало на устройствах, где запрещена отладка. То есть, запуск неподписанных приложений на таких устройствах запрещен. Подробнее, о цифровых сертификатах и процедуре подписывания файлов можно прочитать здесь.

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

Shell

java -jar signapk.jar testkey.x509.pem testkey.pk8 *.apk apk_signed.apk

java - jar signapk .jar testkey .x509 .pem testkey .pk8 * .apk apk_signed .apk

Где же взять такой сертификат, спросите Вы? Сертификаты можно найти в Интернет. Либо сгенерировать самому. Подробную инструкцию о настройке и генерации всех необходимых файлов можно найти, например, .

Заключение

Как видите, декомпиляция и сборка APK файлов достаточно простой процесс, который вдобавок можно автоматизировать, облегчая работу исследователю. Сама виртуальная машина Dalvik также проста в освоении и открыта, что, с одной стороны, снижает порог вхождения для разработчиков, с другой – является основной причиной столько большого процента пиратства именно на платформе Android. Отчасти поэтому разработчики, например, игр в основном не заинтересованы в выпуске интересных игр с сюжетом. Намного выгоднее при нынешнем отношении пользователей клепать поразительно похожие друг на друга фермы с донатом. Поэтому, покупаем приложения, поддерживаем разработчиков и в итоге получаем интересный контент. А вот донатить совершенно не нужно!

Всем спасибо, до новых встреч.

APK – это формат, который используется в операционной системе Android для архивных исполняемых файлов-приложений. Аналогом, например, в Windows, является.msi, в Symbian - .sis, в Linux - .rpm или.deb. В данной статье мы максимально детально разберемся во всех вопросах касаемо данного файлового формата.

Процесс разборки, редактирования и сборки по «правильному» называется reverse-engineering («реверс-инжиниринг»). Что для этого нужно? Необходимы следующие инструменты:

Apktool. Удобнее использовать с оболочкой SmartApktool, можно также использовать уже готовые batch-файлы, например ApktoolBAT.

Notepad++ - не обязательно, но настоятельно рекмоендуется.

7zip или WinRar, либо же любая другая программа-архиватор, но рекомендуется именно одна из этих.

Деодексированная прошивка.

Устанавливать приложения в операционной системе Android можно несколькими способами. Первый, он же основной – это напрямую через Google Play (Android Market), то есть с официального источника, для чего потребуется учетная запись Google. Многие приложения платные, если вы не хотите искать взломанную версию на пиратских сайтах, то придется оплатить покупку. Но о том, как это сделать, мы поговорим в . Второй – из неофициальных источников, отличных от Google Play, для чего придется включить параметр «Разрешить установку приложений из неофициальных источников» в настройках смартфона или планшета, после чего установочный файл APK нужно записать на карту памяти.

Возможно также массово устанавливать приложения APK. Для этого потребуется Astro File Manager – специальный файловый менеджер. После его установки перемещаем приложения:

Со смартфона/планшета: в mntsdcardackupsapp (иными словами, карта памяти, далее папака backups, папка app)

С персонального компьютера (не забываем включить подключение Adroid-устройства в режиме простого USB-накопителя): sdcard backups app

После чего открываем нужное приложение, в контекстном меню выбираем «Менеджер приложений» и переходим во вкладку «Резервные копии», где выбираем «Сделайте долгий клик или проверьте приложение, чтобы проинсталлировать». Нажимаем кнопку «Инсталлировать» - все приложения будут установлены на ваше устройство.

Что из себя представляет структура APK-файла, посмотреть достаточно легко. Открываем нужный APK при помощи программы-архиватора, например, WinRar. Вот что мы видим внутри:

AndroidManifest.xml – это своеобразный «паспорт», который описывает, что находится в приложении, в том числе: системные требования к приложению, его структура и версия.

META-INF – папка, содержащая файл MANIFEST.MF (его можно открыть практически любым текстовым редактором, рекомендуется использоваться Notepad++), открыв который видно контрольные суммы SHA-1 и пути к данным, версию стандарта Manifest-Version, файлы сертификата RSA или DSA, файл SF содержит пути к различным ресурсам и их контрольные суммы. Вообще, META-INF – это файлы метаданных, то есть данные о данных.

res – папка, которая содержит все ресурсы «программной начинки», рассортированные по подпапкам. Например, в папке ~drawable~ находятся графические элементы приложений (разные статусы, иконки и такое прочее), в директории layout – XML-файлы, в которых указано размещение элементов графического пользовательского интерфейса (GUI).

classes.dex – программный код, выполняемый виртуальной машиной Dalvik VM. Напомним, что операционная система Android – это смесь ядра Linux с виртуальной машиной Java.

resources.arsc – скомпилированный файл XML. Он содержит данные о всех ресурсах, которые используются программой.

assets – папка, также содержащая различные ресурсы, её может не быть вовсе в APK.

lib – папка, которая содержит «либы» или, проще говоря, нативные библиотеки, если программа написана с использованием NDK, например с элементами когда С++. Данной директории может не быть в APK.

com – может отсутствовать в APK.

org – может отсутствовать в APK.

udk – может отсутствовать в APK.

С содержимым APK-приложения мы разобрались, теперь приступим к детальной его разборке. Для декомпиляции понадобятся Apktool и Java, а также собственно сам APK-файл. Apktool рекомендуется распаковывать в директорию C: WINDOWS (это не обязательно, но так будет удобнее. Почему – читайте немного ниже).

Для запуска Apktool необходимо войти в меню «Выполнить» компьютера. На Windows XP нажимаем Пуск -> Выполнить , на Windows 7: Диспетчер задач (Ctrl+ Alt+ Del ), сверху в выпадающем меню Файл -> Новая задача (Выполнить…) , или просто вызываем его сочетанием клавиш Win+R .

Вызываем командную строку – пишем cmd , после чего запускаем Apktool – пишем apktool (для этого и нужно было поместить его в папку WINDOWS). Далее всё управление происходит через командную строку с использованием параметров.

Если нет желания заморачиваться с постоянным вводом текстовых команд, можно использовать графический интерфейс – например, упомянутый SmartApkTool. Запускаем SmartApkTool.exe, после чего во вкладке Распаковать/Запаковать выбираем нужное приложение APK (важно, чтобы имя файла не содержало пробелов, кириллицы, спецсимволов и знаков препинания).

После распаковки программа создаст папку с таким же названием, как файл APK. Внутри неё будет находиться всё содержимое приложения.

APK также можно локализировать. Прежде чем начать это делать, запускаем предварительно установленный Notepad++, и настраиваем его следующим образом. Открываем Настройки -> Конфигурация -> Новый документ .

После проделанных действий открываем распакованное (декомпилированное) приложение, папку res/ values .

Все локализации зачастую находятся в файле strings. xml , но иногда часть из них может содержаться в arrays. xml . Копируем данные файлы, создаем в папке res папку values- ru и вставляем их в неё.

Теперь можно открыть strings. xml при помощи Notepad++, произвести перевод, и сохранить измененный файл.

В файле AndroidManifest. xml можно указать, куда устанавливать APK-приложения. Внимание, это актуально только для версии Android 2.2 и более новых. Итак, открываем указанный файл при помощи Notepad++. Почти в самом начале видно параметр:

android:installLocation=

Здесь можно указать следующие варианты (после символа «=»):

internalOnly – приложение будет устанавливаться только во внутренней памяти устройства

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

preferExternal – программа будет устанавливаться на карту памяти. Нужно учитывать, что не все приложения будут корректно работать, если установлены на внешнем накопителе, или же вообще окажутся не работоспособными. К ним относятся:

Services – то есть, сервисы

Alarm Services – сервисы, которые используют время, например будильники

Input Method Engines – приложения для ввода, в том числе разные клавиатуры

Live Wallpapers – «живые» анимированные обои

Live Folders – соответственно, анимированные директории

App Widgets – различные «виджеты»

Account Managers – менеджеры разных учетных записей, в том числе ICQ-клиенты, клиенты для социальных сетей и так далее

Sync Adapters – программы, которые требуют постоянной синхронизации

Device Administrators – приложения, которые используются для администрирования

Copy Protection – приложения, которые защищены от копирования.

В приложении можно редактировать и заменять на свои различные иконки и графические элементы пользовательского интерфейса. Для этого открываем папку res в папке с декомпилированным приложением APK, здесь можно увидеть папки:

drawable-hdpi

drawable-ldpi

drawable-mdpi

В данных папках находятся все иконки и другие графические элементы программы. Буква перед «dpi» означает размер графических элементов, соответственно:

hdpi – высокая плотность точек на дюйм, размер 72х72 пикселя

mdpi – средняя плотность точек на дюйм, размер 48х48 пикселя

l dpi – низкая плотность точек на дюйм, размер 36х36 пикселя

Для того, чтобы изменить, например, иконку приложения, открываем файл AndroidManifest. xml при помощи программы Notepad++, ищем строчку, в которой указана иконка, смотрим точное её название (обратите внимание, расширение файла не прописывается, только имя файла).

Открываем соответствующую папку drawable-* dpi, вставляем отредактированную или новую иконку, не забываем перепроверить исходное название в AndroidManifest. xml . Картинка обязательно должна быть в формате.png и иметь точно такую же плотность точек, как исходный файл, например для hdpi это 72х72 пикселя.

Если есть желание заменить название иконки на своё, то сохраняем картинку с желаемым именем файла в drawable-* dpi , после чего указываем точно такое же имя в AndroidManifest. xml (например android:icon=»@drawable/ test» ). Таким же образом можно изменить любые другие графические элементы, но требования те же – обязательно расширение.png и плотность точек на дюйм, как у исходного файла.

В распакованном приложении можно перепроверить, какие права есть у него. Это полезно, если APK было установлено с неизвестного источника, и чтобы не произошло ситуации, что фонарик или красивый календарь вдруг начнет рассылать платные SMS-сообщения на неизвестный номер. Открываем AndroidManifest. xml программой Notepad++ и ищем соответствующие строки. За отправку текстовых сообщений, например, отвечает параметр SEND_SMS . Подробнее обо всех правах, которые могут быть доступны приложению, вы можете почитать в .

Установленные APK приложения можно извлечь из системы. Это можно сделать несколькими способами. Во-первых, можно установить Astro File Manager. Открываем приложение, после чего в контекстном меню выбираем пункт «Менеджер приложений». Ищем необходимое приложение, помечаем его галочкой и делаем резервную копию. После проведенной обработки выбранное приложение будет находится по пути:

mntsdcardackupsapp

sdcardackupsapp

Далее, можно использовать программу Root Uninstaller. После запуска приложение самостоятельно определит все установленные APK и автоматически сделает резервную копию всех их. Соответственно, можно, при желании, скопировать для дальнейшей декомпиляции эти резервные копии, они находятся по пути:

mntsdcardRootUnistallerautobackups (при просмотре напрямую с Android-устройства)

sdcardRootUnistallerautobackups (при просмотре через компьютер, при этом Android-девайс подключен как USB-накопитель).

Еще один способ заключается в использовании Root Browser Lite, естественно для этого понадобятся Root-права. Открываем данное приложение, проходим по пути:

system app (если интересуют системные приложения).

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

Также можно скачать интересующие вас приложения APK с Google Play (Android Market) напрямую на персональный компьютер. Для этого понадобится браузер Google Chrome (версия не ниже 17-й), и плагин для него – APK Downloader. После скачивания и установки указанного плагина, создаем копию ярлыка браузера Google Chrome, где прописываем следующую строчку после пробела:

-ignore-certificate-errors

При стандартном установочном пути браузера, в строчке должно получиться вот что:

«C:Program FilesGoogleChromeApplicationchrome.exe» -ignore-certificate-errors

После этого, в номеронабирателе смартфона вводим:

*/*/8255/*/*

Переписываем Device ID, который состоит из 16 знаков. Открываем Google Chrome при помощи созданного ярлыка с указанным параметром -ignore-certificate-errors , заходим в Инструменты -> Расширения (можно также ввести в адресную строку «chrome://settings/extensions»), открываем настройки плагина APK Downloader. В опциях вводим адрес почты и пароль вашей учетной записи Google, а также полученный Device ID. Теперь заходим на Google Play (Android Market), открываем страницу с нужным приложением, ждем полной её загрузки. Появится значок APK Downloader – после его нажатия приложение будет скачано на компьютер.

Второй способ – при помощи Real APK Leecher. В окне опций также нужно ввести основные данные учетной записи Google – почтовый адрес, пароль и Device ID. После чего можно найти и скачать любое приложение, доступное в Google Play (Android Market).

Как произвести упаковку приложения и его подпись? Для этого запускаем SmartApkTool, открываем вкладку Распаковать/Запаковать, выбираем опцию «Запаковать», ставим галку напротив «Подписать приложение», выбираем (путем нажатия на «Обзор») директорию с распакованным приложением и выбираем файл apktool. yml . Наконец, кликаем на «Запаковать и подписать».

После выполненной подписи приложение будет размещено в папке sign директории с программой SmartApkTool, с названием sign_name.apk . Или же можно просто нажать «Запаковать», тогда приложение будет упаковано. В папке с декомпилированным приложением будут созданы директории build и dist , в последней будет находится собранный APK, то есть готовое приложение, а в build – содержимое данного APK.

Если изначально вы не подписывали приложение, но после решили это сделать, то APK-файл закидываем в папку sign , после чего подписываем программой SmartApkTool на вкладке «Подписать».