Декомпиляция 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
А мне было полезно, плюсану
===== UPDATE =====
Сейчас 2022 год, актуальная верзия API 32, и здесь sdkmanager переехал в cmdline-tools\latest\bin\sdkmanager.bat
@moderator, добавьте пожалуйста эти простые, но в то же время полезные слова в конец поста.
думаю тут будет актуален тег "реверс-инжиниринг".
на 4пда, этих памяток ...