Блог программиста
не только о программировании

Дружественные ресурсы:

IntSystem.org | Веб-разработка, все о ней

DevOps-заметки |

22.07.2015

Как декомпилировать приложение на Android и зачем?

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

Кому это нужно

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

Теория

В большинстве случаев декомпиляция приложения не вызывает особых проблем. Для каждой задачи, которую нужно проделать, написаны программы, работающие на любой платформе где можно установить Java Runtime. Итак, суть декомпиляции заключается в следующем: Вы можете либо просматривать декомпилированный код виртуальной машины Dalvik, а также все файлы ресурсов приложения (манифест, разметка и т.д.). А можете преобразовать код Dalvik в код Java. В первом случае программе передается путь к apk-файлу. Во втором из apk-файла (который по сути обычный архив) нужно вытащить файл. Этот файл содержит весь исполняемый код для машины Dalvik (да, весь код объединен в один файл). Специальная программа преобразует код Dalvik в код Java, который потом можно открыть любым java-декомпилятором. Казалось бы, второй способ предпочтительнее, но есть одна хитрость. И заключается она в том, что некоторые участки кода невозможно конвертировать, либо логика кода становится далека от того, как писал разработчик. Для простых программ этого конечно достаточно, но для понятия всего кода конечно обращать внимание стоит и на Java, и на Dalvik. Давайте же наконец поговорим о том, что конкретно нам нужно делать для декомпиляции Android приложений.

Решение

Прежде всего поговорим о полной декомпиляции приложения. То есть, вместе с распаковкой всех вложенных в apk xml-файлов. Для этого потребуется утилита apktool. Все что нужно - это запустить утилиту с правильными параметрами:** java -jar apktool.jar d app.apk**. Флаг d означает, что приложение будет декомпилировано. Последний параметр – путь к apk-файлу. Для удобства я создал bat-скрипт и положил его рядом с программой.

java -jar apktool.jar d app.apk
pause

Теперь достаточно просто скопировать интересующее Вас приложение в папку с программой под именем app.apk и запустить скрипт. Консоль покажет вывод работы программы, а после Вы увидите папку, в которой все разложено по своим местам: ресурсы, манифест, код. Также, как и проект во время разработки. За исключением, конечно же, того, что код будет выглядеть в виде опкодов для Dalvik.

Что касается второго способа, то для этого нам потребуется две другие утилиты: dex2jar и jdgui. Они обе также бесплатные и с открытым кодом. Вам необходимо открыть apk-файл с помощью архиватора (7zip, например) и извлечь в папку с dex2jar файл classes.dex.

apk_opened_in_7zip

После чего запустить утилиту следующей командой. Это преобразует код машины Dalvik в код Java. Если преобразование завершилось успешно, Вы получить файл classes.jar. Этот файл открываем в jdgui.

(decompiled_classes_dex

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

Дело остается за малым: исследовать код программы. Если целью декомпиляции было внесение каких-либо изменений в программе, то после всех действий необходимо все файлы собрать в apk и подписать его. О том, как это сделать, читайте в продолжении.