Как закриптовать apk файл

Обновлено: 05.07.2024

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

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

В настоящий момент, выпускаются APK для четырёх архитектур: armeabi-v7a (arm), arm64-v8a (aarch64), x86 (i386) и x86_64. Многие разработчики выпускают и комплексный установочный файл, включающий поддержку нескольких архитектур, но имеющий больший размер. Если открыть страницу приложения в Play Маркете, вы увидите номер версии и размер приложения для вашего устройства. На устаревших устройствах могут предлагаться более старые версии приложения, если обновление не поддерживается или ещё не выпущено для вашего устройства.

Зачем устанавливать приложения с помощью APK файлов?

Иногда, установка с использованием APK является единственным способом получить приложение или игру на своё устройство. Например, приложение не соответствует правилам Google и не доступно в магазине Play Маркет. В таких случаях, их можно скачать на сайтах и форумах, на которых их разместил автор, и установить вручную.

В некоторых случаях, вы захотите использовать более старую версию приложения, например, если в новейшей версии отсутствуют или некорректно работают некоторые функции, или вам не нравится новый дизайн. Или же после обновления приложения оно вовсе не запускается, и вам понадобится откатиться на предыдущую версию, в то время, как в Play Маркете предлагается только новая.

Также, некоторые приложения могут быть не доступны в вашем регионе, и вы не сможете установить их из Play Маркета.

APKPure для Android

У опытных пользователей или мастеров по ремонту мобильных устройств, может возникнут необходимость установить антивирус на заражённое устройство, и часто APK файл может быть единственным вариантом запустить проверку и лечение системы. Многие вирусы для Android могут заполнять экран рекламными баннерами или блокировать интернет, и в таком случае, чтобы не прибегать к сбросу или перепрошивке устройства и потере всех данных, установка антивируса для Android с помощью APK файла будет хорошим вариантом лечения системы.

Как устанавливать приложения и игры с помощью APK файлов?

Поскольку APK является стандартным форматом приложений в операционной системе Android, их установка проста и не требует дополнительных программ. Вам нужно просто скачать файл на смартфон или планшет, найти его расположение в любом файловом менеджере, нажать по нему и выбрать "Установить".


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

В Android 7 и ниже:

  1. В любом файловом менеджере нажмите по файлу APK.
  2. В окне предупреждения "Установка заблокирована", нажмите "Настройки".
  3. В открывшемся окне настроек, найдите пункт "Неизвестные источники" и активируйте ползунок.
  4. В окне подтверждения, нажмите "OK".
  5. Вернитесь к файлу APK и нажмите "Установить".


В Android 8 и выше:

  1. В файловом менеджере или браузере нажмите по файлу APK.
  2. В окне предупреждения, нажмите "Настройки".
  3. В открывшемся окне настроек, активируйте ползунок "Разрешение для этого источника" или "Разрешить установку приложений".
  4. Вернитесь назад и нажмите "Установить".


Обратите внимание, что после разрешения установки из неизвестных источников, ваше устройство может быть уязвимо. Рекомендуем отключать эту опцию каждый раз после установки приложений с помощью APK файлов.

Что такое файлы XAPK и APKM?

Из-за некоторых ограничений, введённых Google для публикации приложений в Play Маркет, размер приложения для Android не может превышать определённый размер. Разработчики больших приложений, например мобильных игр, могут использовать дополнительные файлы с ресурсами, которые необходимы для работы приложения или игры и будут скачиваться после её установки и первого запуска.


Как устанавливать приложения и игры с помощью XAPK файлов?

Есть несколько способов установки мобильных приложений и игр с помощью XAPK файлов. Рассмотрим три варианта.

Вариант 1 – использование мобильных приложений. Для установки XAPK можно использовать мобильное приложение APKPure для Android.

Для установки XAPK с помощью APKPure для Android:

  1. Откройте приложение APKPure для Android.
  2. Перейдите в главное меню, щелкнув по значку в правом верхнем углу.
  3. Переключитесь на вкладку "Управление APK / XAPK".
  4. Приложение просканирует память устройства и отобразит список найденных установочных файлов APK и XAPK. Нажмите "Установить" напротив нужного вам приложения и дождитесь распаковки и копирования файлов кэша.
  5. После этого начнётся установка извлечённого APK установщика. Подтвердите действие, нажав "Установить" и следуйте инструкции по установке AKP, написанной выше.


Также, после установки приложения APKPure для Android, файлы .xapk будут ассоциированы с приложением APKPure, что позволит устанавливать их в несколько кликов, щёлкнув по ним в любом файловом менеджере.

Вариант 2 – использование USB кабеля и компьютера. Для установки XAPK можно использовать приложение Pure APK Install для Windows.

Для установки XAPK с помощью Pure APK Install:


Вариант 3 – извлечение APK файла из XAPK. Скачайте нужный вам файл XAPK и откройте его архиватором, например WinRAR или 7-Zip. Для удобства, можно предварительно изменить расширение файла с .xapk на .zip.


Извлеките из него файл с расширением .apk и установите его, следуя выше написанной инструкции. Также, скопируйте содержимое папки "Android", в которой находится кэш приложения, в соответствующую папку на вашем устройстве.

Как устанавливать приложения и игры с помощью APKM файлов?

Для установки мобильных приложений и игр с помощью файлов APKM доступно официальное мобильное приложение от разработчиков этого формата – APKMirror Installer.

Установите мобильное приложение APKMirror Installer и скачайте нужные файлы формата APKM в любую папку на устройстве или установленной карте памяти. Приложение APKMirror Installer просканирует ваше мобильное устройство и отобразит список найденных установочных файлов APK и APKM. Для большинства установочных файлов APKM доступны опции установки, такие как архитектура, включённые языки и разрешения экрана.



Сегодня у нас насыщенная программа (еще бы, столько областей кибербезопасности за раз!): рассмотрим декомпиляцию Android-приложения, перехватим трафик для получения URL-адресов, пересоберем apk без исходного кода, поработаем криптоаналитиками и многое другое:)

1. Реверсим apk

Итак, перед нами то немногое, что удалось извлечь из полуразобранного робота – apk-приложение , которое каким-то образом должно помочь нам получить ключ. Сделаем самое очевидное: запустим apk и посмотрим на его функционал. Более чем минималистичный интерфейс приложения сомнений не оставляет – это кастомный файловый клиент FileDroid, позволяющий скачать файл с удаленного сервера. Окей, выглядит несложно. Подключаем телефон к Интернету, делаем пробную попытку скачивания (сразу key.txt – ну а вдруг?) – безуспешно, файл на сервере отсутствует.


Переходим к следующему по уровню сложности мероприятию – декомпилируем apk c помощью JADX и анализируем исходный код приложения, который, к счастью, совсем не обфусцирован. Наша текущая задача – понять, какие файлы предлагает удаленный сервер для скачивания, и выбрать из них тот самый, с ключом.

Начинаем с класса com.ctf.filedroid.MainActivity, содержащего пока самый интересный для нас метод onClick(), в котором обрабатывается нажатие на кнопку «Download». Внутри этого метода дважды происходит обращение к классу ConnectionHandler: cперва вызывается метод ConnectionHandler.getToken(), а только затем – ConnectionHandler.getEncryptedFile(), в который передается имя файла, запрошенного пользователем.


Ага, то есть сначала нам нужен токен! Разберемся чуть подробнее с процессом его получения.
Метод ConnectionHandler.getToken() принимает на вход две строки, а затем отправляет GET-запрос, передавая эти строки в качестве параметров «crc» и «sign». В ответ сервер присылает данные в JSON-формате, из которых наше приложение извлекает токен доступа и использует его для скачивания файла. Это всё, конечно, хорошо, но что за «crc» и «sign»?


Чтобы понять это, двигаемся дальше в сторону класса Checks, любезно предоставляющего методы badHash() и badSign(). Первый из них подсчитывает контрольную сумму от classes.dex и resources.arsc, конкатенирует эти два значения и оборачивает в Base64 (обратим внимание на флаг 10 = NO_WRAP | URL_SAFE, вдруг пригодится). А что же второй метод? А он делает тоже самое с SHA-256 fingerprint’ом подписи приложения. Эх, похоже, что FileDroid не очень-то жаждет быть пересобранным :(


Окей, допустим, что токен получили. Что дальше? Передаем его на вход метода ConnectionHandler.getEncryptedFile(), который присовокупляет к токену имя запрошенного файла и формирует еще один GET-запрос, на этот раз с параметрами «token» и «file». Сервер в ответ (судя по названию метода) отправляет зашифрованный файл, который сохраняется на /sdcard/.

Ладно, будем решать проблемы по мере их поступления, а сейчас наша основная проблема состоит в том, что мы всё еще не знаем, какой файл нам нужно скачать. Однако в процессе изучения класса ConnectionHandler мы не могли не заметить, что прямо между методами getToken() и getEncryptedFile() разработчики FileDroid забыли еще один очень соблазнительный метод под говорящим названием getListing(). Значит, сервер такой функционал поддерживает… Кажется, это то, что нужно!


Для получения листинга нам потребуются уже известные «crc» и «sign» – не проблема, мы уже знаем, откуда они берутся. Считаем значения, отправляем GET-запрос и … Так, стоп. А куда мы GET-запрос собираемся отправлять? Неплохо было бы сначала получить URL-адрес удаленного сервера. Эх, возвращаемся в MainActivity.onClick() и смотрим, как формируются аргументы netPath для вызова методов getToken() и getEncryptedFile():


Странные буквосочетания «fnks» и «qdmk» вынуждают нас обратиться к результату декомпиляции метода wat.getSecure(). Спойлер: этот результат у JADX так себе.


При более пристальном рассмотрении становится понятно, что всё это не слишком приятное содержимое метода можно заменить на привычный switch-case такого вида:


Так как «fnks» и «qdmk» уже используются для получения токена и скачивания файла, то «tkog» должен давать URL, необходимый для запроса листинга доступных файлов на сервере. Кажется, появляется надежда дешево получить требуемый путь… В первую очередь посмотрим, как хранятся URL’ы в приложении. Открываем функцию com.ctf.filedroid.x37AtsW8g.rlieh786d() и видим, что каждый URL сохранен в виде закодированного массива байтов, а сама функция формирует из этих байтов строку и возвращает её.


Хорошо. Но далее строка передается в функцию com.ctf.filedroid.wat.radon(), реализация которой вынесена в нативную библиотеку libae3d8oe1.so. Реверсить arm64? Хорошая попытка, FileDroid, но давай в другой раз?

2. Получаем URL-адреса сервера

Попробуем подойти с другой стороны: перехватить трафик, получить URL-адреса в открытом виде (а в качестве бонуса – еще и значения контрольной суммы и подписи!), сопоставить их байтовым массивам из com.ctf.filedroid.x37AtsW8g.rlieh786d() – может быть шифрование окажется обычным шифром Цезаря или XOR. Тогда не составит труда восстановить третий URL-адрес и выполнить листинг.

Для перенаправления трафика можно использовать любой удобный прокси ( Charles , fiddler , BURP и т.п.). Выполняем настройку переадресации на мобильном устройстве, устанавливаем соответствующий сертификат, проверяем, что перехват осуществляется успешно, и запускаем FileFroid. Пытаемся скачать произвольный файл и … видим «NetworkError». Вызвана эта ошибка наличием certificate-pinning (см. метод com.ctf.filedroid.ConnectionHandler.sendRequest): файловый клиент проверяет, что «зашитый» в приложение сертификат соответствует серверу, с которым осуществляется взаимодействие. Теперь понятно, почему контролируется целостность ресурсов приложения!


Однако в перехваченном трафике мы можем увидеть хотя бы доменное имя сервера, к которому обращается файловый клиент, а значит, надежда расшифровать URL-адреса остается!


Вернемся к функции com.ctf.filedroid.x37AtsW8g.rlieh786d() и отметим, что во всех массивах совпадают первые несколько десятков байт:

Кроме того, последний байт третьего массива намекает, что без base64 дело не обошлось. Попробуем декодировать и поксорить получившиеся байты с известной частью URL:


Кажется, никто никогда еще так не радовался ARMag3dd0n’у! Дело за малым: последовательно декодируем из base64 URL-адреса и ксорим с найденным ключом. Но… а если бы это был не XOR, а самопальный перестановочный шифр, который не подберешь и со ста попыток?

3. Пересобираем apk с помощью Frida

В рамках этого write-up’а рассмотрим более безболезненный (и, на наш взгляд, более красивый) способ решения – с помощью фреймфорка Frida , который позволит в run-time исполнить произвольные методы apk-приложения с нужными нам аргументами. Для этого потребуется телефон с root-правами или эмулятор. Предполагаем следующий план действий:

  1. Установка компонентов Frida на ПК и подопытный телефон.
  2. Восстановление URL-адресов, соответствующих запросам на получение токена или листинга, и скачивание файла (с помощью Frida).
  3. Извлечение значений контрольной суммы и подписи оригинального приложения.
  4. Получение листинга файлов, хранящихся на сервере, и выявление нужного файла.
  5. Скачивание и расшифрование файла.


Вновь обращаемся к классу MainActivity и обнаруживаем, что в onCreate() вызывается метод doChecks(), который и вывел в лог приведенные ошибки:


Кроме того, в onResume() также проверяется, открыт ли типичный для Frida порт:


Наш файловый клиент оказывается немного нетолерантным к отладке, руту и самой Frida. Такое противодействие абсолютно не входит в наши планы, поэтому получаем smali-код приложения с помощью утилиты apktool , открываем в любом текстовом редакторе файл MainActivity.smali, находим метод onCreate() и превращаем вызов doChecks() в безобидный комментарий:


Затем лишаем метод suicide() возможности действительно завершить работу приложения:


Далее снова соберем наше слегка улучшенное приложение с помощью apktool и подпишем его, выполнив следующие команды (могут понадобиться права Администратора):


Переустанавливаем приложение на телефоне, запускаем его – ура, загрузка проходит без происшествий, лог чист!


Переходим к установке фреймворка Frida на ПК и мобильное устройство:

Запускаем сервер фреймворка Frida на мобильном устройстве:


Подготавливаем простой скрипт get-urls.js, который вызовет wat.getSecure() для всех поддерживаемых серверов запросов:


Запускаем FileDroid на мобильном устройстве и «цепляемся» нашим скриптом к соответствующему процессу:


4. Получаем листинг файлов на сервере

Наконец-то удаленный сервер стал для нас чуть ближе! Теперь нам известно, что сервер поддерживает запросы по следующим путям:

Вручную тоже можно. Любым удобным инструментом считаем CRC32 от classes.dex и resources.arsc (например, для Linux – стандартной утилитой crc32), получаем значения ‭1276945813‬ и 2814166583 соответственно, конкатенируем их (выйдет 12769458132814166583) и кодируем в base64, например, тут :‬‬


Для того, чтобы выполнить аналогичную процедуру для подписи приложения, в окне JADX переходим в раздел «APK Signature», копируем значение «SHA-256 Fingerprint» и кодируем его в base64 как байтовый массив:


Важно: в оригинальном apk base64-кодирование осуществляется с флагом URL_SAFE, т.е. вместо символов «+» и «/» используются «–» и «_» соответственно. Необходимо убедиться, что при самостоятельном кодировании это будет тоже соблюдаться. Для этого при кодировании онлайн можно заменить используемый алфавит с «ABCDEFGHIJKLMNOPQRSTUVWXYZabcde fghijklmnopqrstuvwxyz0123456789+/» на «ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijkl mnopqrstuvwxyz0123456789–_», а при использовании скрипта на python3 – просто вызвать функцию base64.urlsafe_b64encode().
Наконец-то у нас есть все составляющие успешного получения листинга файлов:

Далее запросим одноразовый токен доступа и скачаем файл:


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


5. Добавим щепоточку криптографии.

Эх, рановато мы отложили FileDroid. Снова вернемся в JADX и посмотрим, не оставили ли разработчики файлового клиента чего-нибудь полезного для нас. Да, это тот случай, когда code cleanup явно не популярен: неиспользуемый метод decryptFile() спокойно ждет нашего внимания в классе ConnectionHandler. Что мы имеем?


Помещаем зашифрованный файл 0p3n1fuw4nt2esk4p3.jpg на /sdcard/, запускаем FileDroid и инжектим скрипт decrypt.js с помощью Frida. После того, как скрипт отработает, на /sdcard/ появится файл plainfile.jpg. Открываем его и … just solved!


Это непростое задание требовало от участников знаний и навыков сразу в нескольких сферах инфобеза, и мы рады тому, что большинство соревнующихся успешно с ним справилось! Надеемся, что те, кому чуть-чуть не хватило времени или знаний до получения ключа, теперь тоже успешно пройдут аналогичные таски в любом CTF :)

Обновлено 2015-09-17: исправлены ссылки на программы

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

Вот этим мы и займёмся. Традиционно здесь всё рассказывается в контексте линукса, с остальными операционками разбирайтесь сами, хотя принцип ровно такой же.

Предварительная подготовка

Нам понадобится телефон с андроидом, дата-кабель к нему, настроенный для работы с ADB компьютер 1 , установленный Android SDK (каталоги tools и platform-tools должны быть вынесены в переменную окружения PATH ).

Также на телефоне необходимо разрешить отладку через USB.

Ещё необходимо добавить какой-нибудь каталог, в который вы можете писать, в переменную окружения $PATH, у меня туда добавлен каталог

Получение apk-файла приложения

Есть несколько способов добыть файл с пакетом приложения:

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

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

Допустим, нас интересует приложение Google+, очевидно, что где-то в названии приложения должно быть слово plus , ищем:

Что мы только что сделали? Мы выполнили команду на стороне девайса ( adb shell ), команда называется pm (т.е. package manager), опция команды list packages говорит сама за себя, опция -f включает отображение связанных с пакетом файлов; а plus — это фильтр.

Видим, что интересующее нас приложение лежит в файле /data/app/com.google.android.apps.plus-1.apk , вытаскиваем его на компьютер:

Разбор apk-файла на части

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

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

Для этого есть замечательный инструмент android-apktool, полная инструкция по установке описана на официальном сайте. Нас интересует версия 2.X, скачиваем jar-файл в каталог

/bin , туда же скачиваем скрипт-обёртку, примерно так:

Проверяем в терминале, что команда apktool работает, просто набираем и смотрим. Если выдаётся ошибка, фиксим, например, пермиссии на файл. Когда всё заработает, можно приступать к декодированию, всё просто:

После завершения процесса внутри каталога gplus будут лежать декодированные (в некоторой степени) внутренности пакета. К примеру, там уже можно смотреть в нормальном виде xml-файлы (макеты интерфейса или манифест). Там даже можно увидеть слегка декодированные исходники приложения, но не в виде java-кода, а в виде smali-файлов, об этом формате подробнее можно тут прочитать, при желании их можно даже редактировать и затем собрать назад в apk-пакет (это также можно сделать при помощи apktool ).

Дизассемблирование до java-кода

Следующий шаг — попытаться добраться до близкого к оригинальному java-кода приложения. В этом нам поможет программа dex2jar, качаем с сайта проекта архив с программой (файл вида dex2jar-0.0.9.8.tar.gz), она тоже написана на java, внутри каталог с кучей файлов, из которых нам понадобится каталог lib (скопируем его целиком в

и dex2jar.sh , скопируем его туда же в

/bin . Запускаем на примере нашего пакета (на большом пакете программа может долго работать):

После выполнения получим в этом же каталоге jar-файл (в нашем случае — com.google.android.apps.plus-1_dex2jar.jar ).

Это самый обычный java jar archive, содержащий обычные class-файлы со скомпилированным java-кодом.

Декомпиляция class-файлов в java-файлы

Финальный этап — это получение более-менее читабельного java-кода из class-файлов с байткодом. Эта задача частично решается программой из предыдущего раздела: скопируем в каталог

/bin скрипт d2j-jar2jasmin.sh . Результатом работы скрипта является каталог с файлами в формате jasmin, что, однако, вовсе не java-код, но тоже может оказаться полезным для анализа:

Но можно получить и java-код! Для этого можно попробовать воспользоваться вот этим дизассемблером. Не факт, что сработает на вашем пакете, плюс не гарантируется извлечение компилируемого кода, но какие-то данные вы всё же получите.

Что осталось за кадром

Я не рассматриваю вопрос преобразования odex-файлов в dex-файлы. Об этом можно самому прочитать вот тут, например.

Аналогично вопрос обратной сборки файлов в apk-пакет тоже не рассматривается. Так же как и подписывание/выравнивание apk-пакета.

Ссылки

Комментарии

Тут со своим кодом разобраться бы, а потом только за чужие файлы браться. Я что в ЯВЕ написал более двух месяцев назад, если код более 1000 строк уже с переводчиком должен смотреть.

Да чё вы так всё усложнили?! Тут проще чем написать слово "молоко"! Просто поменяйте расширение "apk" в "rar". И всё!

P.S. Написано на Си.)

Читай статью повнимательней:

APK-файл фактически является обычным ZIP-архивом, внутри которого лежат скомпилированные исходники приложения, ресурсы и манифест.Однако просто распаковать и дальше ковыряться в этом всём, к сожалению, не получится: эти файлы там лежат в бинарном оптимизированном для использования на девайсе формате, их нужно сначала декодировать в пристойный вид.

Обновлено 2015-09-17: исправлены ссылки на программы

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

Вот этим мы и займёмся. Традиционно здесь всё рассказывается в контексте линукса, с остальными операционками разбирайтесь сами, хотя принцип ровно такой же.

Предварительная подготовка

Нам понадобится телефон с андроидом, дата-кабель к нему, настроенный для работы с ADB компьютер 1 , установленный Android SDK (каталоги tools и platform-tools должны быть вынесены в переменную окружения PATH ).

Также на телефоне необходимо разрешить отладку через USB.

Ещё необходимо добавить какой-нибудь каталог, в который вы можете писать, в переменную окружения $PATH, у меня туда добавлен каталог

Получение apk-файла приложения

Есть несколько способов добыть файл с пакетом приложения:

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

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

Допустим, нас интересует приложение Google+, очевидно, что где-то в названии приложения должно быть слово plus , ищем:

Что мы только что сделали? Мы выполнили команду на стороне девайса ( adb shell ), команда называется pm (т.е. package manager), опция команды list packages говорит сама за себя, опция -f включает отображение связанных с пакетом файлов; а plus — это фильтр.

Видим, что интересующее нас приложение лежит в файле /data/app/com.google.android.apps.plus-1.apk , вытаскиваем его на компьютер:

Разбор apk-файла на части

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

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

Для этого есть замечательный инструмент android-apktool, полная инструкция по установке описана на официальном сайте. Нас интересует версия 2.X, скачиваем jar-файл в каталог

/bin , туда же скачиваем скрипт-обёртку, примерно так:

Проверяем в терминале, что команда apktool работает, просто набираем и смотрим. Если выдаётся ошибка, фиксим, например, пермиссии на файл. Когда всё заработает, можно приступать к декодированию, всё просто:

После завершения процесса внутри каталога gplus будут лежать декодированные (в некоторой степени) внутренности пакета. К примеру, там уже можно смотреть в нормальном виде xml-файлы (макеты интерфейса или манифест). Там даже можно увидеть слегка декодированные исходники приложения, но не в виде java-кода, а в виде smali-файлов, об этом формате подробнее можно тут прочитать, при желании их можно даже редактировать и затем собрать назад в apk-пакет (это также можно сделать при помощи apktool ).

Дизассемблирование до java-кода

Следующий шаг — попытаться добраться до близкого к оригинальному java-кода приложения. В этом нам поможет программа dex2jar, качаем с сайта проекта архив с программой (файл вида dex2jar-0.0.9.8.tar.gz), она тоже написана на java, внутри каталог с кучей файлов, из которых нам понадобится каталог lib (скопируем его целиком в

и dex2jar.sh , скопируем его туда же в

/bin . Запускаем на примере нашего пакета (на большом пакете программа может долго работать):

После выполнения получим в этом же каталоге jar-файл (в нашем случае — com.google.android.apps.plus-1_dex2jar.jar ).

Это самый обычный java jar archive, содержащий обычные class-файлы со скомпилированным java-кодом.

Декомпиляция class-файлов в java-файлы

Финальный этап — это получение более-менее читабельного java-кода из class-файлов с байткодом. Эта задача частично решается программой из предыдущего раздела: скопируем в каталог

/bin скрипт d2j-jar2jasmin.sh . Результатом работы скрипта является каталог с файлами в формате jasmin, что, однако, вовсе не java-код, но тоже может оказаться полезным для анализа:

Но можно получить и java-код! Для этого можно попробовать воспользоваться вот этим дизассемблером. Не факт, что сработает на вашем пакете, плюс не гарантируется извлечение компилируемого кода, но какие-то данные вы всё же получите.

Что осталось за кадром

Я не рассматриваю вопрос преобразования odex-файлов в dex-файлы. Об этом можно самому прочитать вот тут, например.

Аналогично вопрос обратной сборки файлов в apk-пакет тоже не рассматривается. Так же как и подписывание/выравнивание apk-пакета.

Ссылки

Комментарии

Тут со своим кодом разобраться бы, а потом только за чужие файлы браться. Я что в ЯВЕ написал более двух месяцев назад, если код более 1000 строк уже с переводчиком должен смотреть.

Да чё вы так всё усложнили?! Тут проще чем написать слово "молоко"! Просто поменяйте расширение "apk" в "rar". И всё!

P.S. Написано на Си.)

Читай статью повнимательней:

APK-файл фактически является обычным ZIP-архивом, внутри которого лежат скомпилированные исходники приложения, ресурсы и манифест.Однако просто распаковать и дальше ковыряться в этом всём, к сожалению, не получится: эти файлы там лежат в бинарном оптимизированном для использования на девайсе формате, их нужно сначала декодировать в пристойный вид.

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