Декомпиляция apk: туда и обратно

Скорее памятка для себя, чем пост для общественности.


С офсайта https://developer.android.com/studio/index.html забираем Android SDK Tools (ссылка внизу страницы). На данный момент там выложена версия 3859397.


Распаковываем и устанавливаем platform-tools и build-tools для последнего релиза Android. Соответствие имени релиза, версии Android и значению Android API можно посмотреть на https://source.android.com/source/build-numbers


> tools\bin\sdkmanager.bat --list

...

build-tools;25.0.2 | 25.0.2 | Android SDK Build-Tools 25.0.2

build-tools;25.0.3 | 25.0.3 | Android SDK Build-Tools 25.0.3

cmake;3.6.3155560 | 3.6.3155560 | CMake 3.6.3155560

...


> tools\bin\sdkmanager.bat "build-tools;25.0.3" "platform-tools"


Далее получаем на руки apk-шку, которую будем препарировать. Название пакета можно взять из адресной строки браузера, открыв страницу с программой на Play Market. Далее ищем и вытаскиваем архив через adb (root не требуется).

Пусть например, для программы "Sample Foobar" имя пакета будет com.example.foobar


> adb devices

List of devices attached

1234567890abcdef device


> adb shell "pm list packages -f -3 | grep com.example.foobar"

package:/data/app/com.example.foobar-1.apk=com.example.foobar


> adb pull /data/app/com.example.foobar-1.apk

/data/app/com.example.foobar-1.apk: 1 file pulled. 3.0 MB/s (39955506 bytes in 12.719s)


С сайта https://ibotpeaches.github.io/Apktool/ забираем и устанавливаем apktool, который умеет декомпилировать архив apk в набор файлов и обратно.


> java -jar apktool_2.2.2.jar d -o foobar_src com.example.foobar-1.apk


Декомпилированный код будет в формате smali - синтаксис и краткая справка на офсайте https://github.com/JesusFreke/smali/wiki. Описание команд можно посмотреть на http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html или на официальном сайте Android https://source.android.com/devices/tech/dalvik/dalvik-bytecode


Уже можно изучать исходный код. В Notepad++ можно добавить подсветку синтаксиса smali с https://forum.xda-developers.com/showthread.php?t=2760141, а для IntelliJ Idea недавно вышел плагин https://github.com/JesusFreke/smali/wiki/smalidea, который, по заявлению автора, даже позволяет отлаживать приложение на телефоне через ddms (проверять это я, конечно, не буду.)


Можно облегчить себе изучение кода, попробовав декомпилировать apk в исходный код на Java, но надо иметь в виду, что с вероятностью в 99.5% код получится нерабочий и его невозможно будет скомпилировать обратно в apk. В зависимости от фазы Луны и погоды на Марсе, в таком коде будут присутствовать совершенно дикие конструкции типа for (;;) {return; /* и дальше код */ } и тому подобное. Но общую структуру кода можно посмотреть, посравнивать с тем, что есть в файлах smali. Для этого нам потребуется dex2jar отсюда: https://sourceforge.net/projects/dex2jar/ и jd-gui отсюда: http://jd.benow.ca/


> dex2jar-2.0\d2j-dex2jar -os -ts -r com.example.foobar-1.apk


На выходе имеем com.example.foobar-1-dex2jar.jar. Запускаем jd-gui и открываем в нем этот jar:


> java -jar jd-gui-1.4.0.jar


Можно изучать код прямо в jd-gui, а можно экспортировать весь Java-код через меню File -> Save all sources.


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


> java -jar apktool_2.2.2.jar b -o foobar_unaligned.apk foobar_src


Выравниваем запакованные файлы по 4-байтовой границе:


> build-tools\25.0.3\zipalign 4 foobar_unaligned.apk foobar_fixed.apk


Если ещё нет своего keystore, то его можно сделать с помощью программы keytool.exe, которая входит в состав JRE:


> keytool -keystore android_keystore.jks -genkey -alias recompile


Далее подписываем apk, используя сертификат из своего keystore. Указываем такое же значение min-sdk-version, как указано в исходнике foobar_src\apktool.yml, в параметре minSdkVersion:


> build-tools\25.0.3\apksigner sign --ks android_keystore.jks --min-sdk-version 14 foobar_fixed.apk


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

===== UPDATE =====

Сейчас 2022 год, актуальная верзия API 32, и здесь sdkmanager переехал в cmdline-tools\latest\bin\sdkmanager.bat

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества