Декомпиляция 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

2
Автор поста оценил этот комментарий

===== UPDATE =====

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


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

показать ответы