Как декомпилировать apk файл в android studio
Полная декомпиляция Android приложений, декомпиляция приложений в исходный Java код
Порой при разработке не понимаешь как реализовать определенную функцию, которую видел в чужом приложении, или просто изучить стороннее приложение охота, для этого существует декомпиляция приложений.
В данной статье я покажу как декомпилировать Андроид приложения из *.apk файла в исходный код.
Все приложения являются бесплатными, мультиплатформенными и открытыми (кроме Java Decompiler, у него закрыт исходный код).
Их можно скачать с официального сайта.
Инструкцию буду проводить для ОС Windows.
- Качаем dex2jar-0.0.9.8.zip (номер версии может изменяться) и извлекаем все файлы в желаемую папку, например D:\Decompile .
- Качаем Java Decompiler, я использовал JD-GUI и извлекаем файлы для удобства в ту же папку, куда и dex2jar.
- Качаем apktool и apktool-install-windows-r04-brut1.tar.bz2 и извлекаем файлы уже в системную папку. По умолчанию C:\Windows. (Не забываем скачать второй архив)
- Берем нужный apk файл и кладем в папку с dex2jar и Java Decompiler. В примере приведу декомпиляцию приложения Calculator.zip ( 66.18 КБ )
. (надо извлечь из архива). - Открываем Командную строку (Обработчик команд Windows) в вышеупомянутой папке (В папке по пустому месте при зажатой кнопке Shift нажимаем правую кнопку мыши и выбираем Обработчик команд Windows).
- Вводим команду dex2jar Calculator.apk и если все прошло хорошо, в той же папке появится файл Calculator.apk.dex2jar.jar
- Запускаем jd-gui и открываем полученный на предыдущем шаге файл. (На Windows 7 открывать с правами администратора и с совместимостью Windows XP SP3)
- Выбираем пункт меню File-Save All Sources и сохраняем.
- Извлекаем полученный zip архив.
- Помещаем полученную папку в папку src (надо предварительно создать).(Что бы получилась примерно такая структура D:\Decompile\Calculator\src\com\android)
- Опять же в командной строке вводим команду apktool d Calculator.apk Calculator, где Calculator.apk-имя пакета, Calculator-папка для декомпиляции
- Если все хорошо, тогда в указанной папке будут исходники в двух форматах (java и smali), ресурсы и файлы AndroidManifest.xml, apktool.yml
- Все готово, исходники получены. Правда после декомпиляции в коде есть, можно сказать, ошибки, я заметил пока только что вместо true и false стоят 1 и 0 соответственно.
P.S. Если хочется импортировать полученный код в IDE Eclipse (File-Import), тогда положите содержимое этого архива(Eclipse.zip ( 1.44 КБ )
) в папку с проектом, предварительно изменив на третьей строке
P.P.S. Если apk файл был пропущен при компиляции через обфускатор (proguard), тогда полученный код будет плохо читаем.
Источник: http://boomik.ru/polnaya-dekompilyaciya-android-prilozhenij
Сообщение отредактировал KEEPERekb — 09.06.15, 14:51
Причина редактирования: ссылка
Скрыть шапку
22.05.15, 16:48 | #342
●
Постоянный
Реп: ( 30 )
Ребят подскажите как собрать исходники java в apk ?
У меня есть приложение, которое я декомпилировал. Там есть файлы java и smali. Мне нужно в исходниках добавить вывод некоторых переменных на экран.
Подскажите такой способ сработает System.out.println(«Hello world»); ? Или как лучше это сделать ?
И как потом собрать это все снова в apk ?
apktool пробовал, декомпилирует, но не собирает даже без изменений.
22.05.15, 17:23 | #343
●
Разработчик
Реп: ( 1576 )
roman91276,
Вам нужен android sdk для сборки java приложений. Но помните — декомпилированая java обратно НЕ СОБИРАЕТСЯ.
Все изменения вносите только в smali.
22.05.15, 17:42 | #344
●
Постоянный
Реп: ( 30 )
Azathtot @ 22.05.2015, 17:23
Все изменения вносите только в smali.
А подскажите простой вывод переменной на экран в smali как сделать ?
И так как вносить изменения в smali, то декомпилятор какой использовать ? Я раньше использовал decompileandroid.com, но он делает java файлы. Тогда получается aptools надо использовать, чтобы smali получать ?
И еще вопрос вот скачал android studio, а как в ней собрать все эти smali в apk ?
22.05.15, 22:20 | #345
●
Разработчик
Реп: ( 1576 )
roman91276,
1. Что бы правит smali вам ничего кроме apttool, текстового редактора и мозга не нужно.
2. Вывод текста на экран?
sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
const-string v2, «Hello!»
invoke-virtual , Ljava/io/PrintStream;->println(Ljava/lang/String;)V
Например так, это вывод в stdout
22.05.15, 22:53 | #346
●
Постоянный
Реп: ( 30 )
Azathtot,, спасибо за код, хотел еще уточнить, прочитав ваше сообщение.
У меня в приложении такие строки:
.line 94
invoke-virtual , Landroid/nfc/tech/Kub;->registration(I[B)Z
Я хочу перехватить, что программа передает в эту функцию, как я понял надо перехватывать только v5 и v7 ?
Поэтому вот так преобразовываю данный кусок кода, правильно ли написал код ?
.line 94
sget-object v1, Ljava/lang/System;->out:Ljava/io/PrintStream;
invoke-virtual , Ljava/io/PrintStream;->println(Ljava/lang/String;)V
22.05.15, 22:58 | #347
●
Разработчик
Реп: ( 1576 )
roman91276,
Нет конечно.
1. Убедитесь, что переменная, в которую вы помещаете PrintStream (в примере v1 ) не занята, или объявите свою
2. println получает только один параметр, соответственно у invoke-virtual их должно быть 2.
3. Убедитесь, что все параметры — строки, а у вас это совсем не так, registration получает int, и byte []. Соответственно, вам нужно String.valueOf для int и написать какой-нибудь визуализатор для byte []
Сообщение отредактировал Azathtot — 22.05.15, 23:06
Небольшая заметка по декомпиляции Android приложений
Вскрываем, модифицируем и запаковываем Android-приложения
Иногда некоторые приложения на Android чем-то не устраивают пользователя. В качестве примера можно привести назойливую…
здесь описан более свежий софт
Инструменты для взлома и реверсинга Android-приложений
Сегодня у взломщиков приложений для Android нет недостатка в инструментах. Все уже написано до нас, осталось только…
из личного опыта удобней всего jadx, хотя бы потому, что он с UI
Восстановление утерянного Android-приложения из APK-файла
Экспертиза СКЭНД по восстановлению утерянного Android приложения, принадлежащего нашему клиенту, из APK файла.
Технологии и платформы: Мобильные технологии, Java, apktool, Dex2jar, Jd-gui, Jad, Fiddler, Charles, Root Explorer Услуги: Разработка мобильных приложений, Android Разработка
Задача
Поставленная задача состояла в улучшении работы Android приложения нашего клиента, а также добавлении к нему дополнительного функционала.
- Улучшена работа приложения.
- Обеспечена совместимость приложения с разными платформами.
- Устранены баги.
Подход
Сложность состояла в том, что отсутствовала документация по разработке приложения, а также большая часть исходного кода. Код, который был предоставлен нам для работы заказчиком, состоял из небольшого куска первоначального кода на Java, написанного несколько лет назад. Нам было бы намного проще написать приложение с нуля, но такая возможность даже не обсуждалась, так как одним из главных приоритетов была экономия средств. Поэтому, наш отдел мобильных разработок решил восстановить код приложения используя APK.
Этап 1
Сперва, был выкачан APK файл приложения. APK (Пакет Приложений Android) – это архив, который можно распаковать, например, с помощью Linux unzip, тогда содержимое файла доступно для анализа:
- META-INF/ электронный сертификат приложения, в котором содержится информация о создателе и контрольная сумма пакета;
- res/ содержит различные ресурсы приложения (изображения и т.д.);
- AndroidManifest.xml это описание приложения. Здесь находятся запрашиваемые разрешения и целевая версия приложения;
- classes.dex компилированный байт-код приложения для виртуальной машины Dalvik;
- resources.arsc то различные ресурсы, в большинстве случаев, строки кода;
- assets это аналог репозитория ресурсов. Для их получения необходим идентификатор;
- lib нативные библиотеки, в большинстве реализованные с помощью NDK.
Существует несколько путей выкачивания файла APK из Android приложения на личный компьютер:
- используя расширение APK Downloader for Chrome;
- используя application Real APK Leecher или его аналоги;
- с помощью файлообменников;
- используя онлайн сервисы, например, apk-dl.com или apps.evozi.com/apk-downloader/;
- получив root доступ на устройство, с помощью Android application root explorer из папки: data/app.
Так как в наличии имелось устройство с root правами, мы решили воспользоваться последней возможностью.
Этап 2
2) Как только файл выкачан на компьютер, нужен декомпилятор APK. Так как мы не планировали работать со smali кодом, который обычно используется для внесения небольших изменений в APK и последующий его возврат в исходное состояние, то мы просто декомпилировали dex код в Java код. Полученный Java код, конечно же, не являлся оригинальным и компиляция его в APK уже была невозможна, но нам это было и не нужно. Полученный Java формат читался и можно было установить логику работы приложения.
Были использованы два основных декомпилятора APK:
- Dex2jar переводит байт-код Dalvik в JVM байт-код. Полученный код является основой перевода в Java код;
- Jd-gui – это еще один декомпилятор, работающий с JVM байт-кодом.
Этап 3
Полученный Java код был тщательно проанализирован и большая его часть была изменена. Восстановленные ресурсы и код приложения были перенесены в новый проект Android Studio.
Этап 4
Следующим шагом явилось установление логики работы серверной части, при отсутствии технической документации. Мы использовали два прокси сервера: Fiddler ставился на Windows и Charles (триальная версия) на MacOS. Эти два инструмента немного отличаются по функционалу, потому и дают возможность видеть больше деталей. По мере изучения принципов работы первоначального APK мы смогли понять серверное API и задокументировать на будущее.
Этап 5
Большая часть времени ушла на вычитку кода, устранение ошибок и его восстановление, а также обеспечение надежной работы, так как это и являлось основной целю. Затем, к приложению был добавлен новый функционал.
Оригинал кода приложения был восстановлен за 14 рабочих дней. Последующие пару недель ушли на улучшение приложения и добавление нового функционала в соответствии с требованиями заказчика. Весь отрезок времени, потраченного на выполнение поставленной задачи можно привести в графическом виде:
Time Spent on Reverse Engineering part, %% (14 full days)
Модификация исходного кода android-приложения с использованием apk-файла
Так уж получилось, что приложение для чтения комиксов и манги, которое я использую на своем android-смартфоне, после обновления стало показывать рекламу в конце каждой главы комикса. Данное приложение пару лет назад было доступно на Google Play (платная версия которого и была мной куплена), но было удалено в силу «нарушения авторских прав», после чего ушло в подполье и стало распространятся через сайт разработчика. Увы, достойных альтернатив этому приложению на android и iOS я не нашел, но и смотреть рекламу особо не было желания, тем более я уже покупал версию без рекламы. Сам разработчик почему-то не сделал возможности отключить ее, а на просьбы добавить такую возможность не отозвался. Поэтому пришлось искать альтернативные методы ее отключения. Первое, что пришло в голову, это то, что android-приложения пишутся на java, а значит есть вероятность, что автор не обфусцировал свое приложение и его можно попытаться декомпилировать. Немного подумав, я приступил к работе.
Для начала был загружен сам apk-файл приложения. Затем недолгий поиск по интернету привел меня на сайт http://www.decompileandroid.com/. С его помощью можно было загрузить apk-файл с приложением и на выходе получить набор исходников. Увы, декомпиляция в java-классы происходит не совсем идеально и поэтому восстановить полностью сам проект приложения в IDE(Idea) у меня не получилось, но это позволило проанализировать саму структуру проекта и разобраться как он примерно работает. После проведения анализа, было найдено два перспективных метода в классе BaseReaderFragment.java – placeAdViewIfNeeded и removeAdViewIfNeeded.
Код метода placeAdViewIfNeeded:
if (adViewPlaced || adView == null) < return; >else
Самое простое, что пришло на ум после чтения кода, это убрать все лишнее, и оставить лишь вызов return;
Но, как уже было сказано, даже если бы я изменил в java-классе что-либо, я бы не смог в итоге скомпилировать приложение в IDE. Поэтому пришлось искать альтернативу. Оказалось, что smali-файлы, которые создаются в процессе декомпиляции, позволяют также после внесения нужных изменений, вновь собрать модифицированное приложение. Увы, сайт, что был приведен выше, позволял лишь получать исходники, но не собирать новые. Поэтому пришлось искать способы сделать это самостоятельно.
Была найдена утилита ApkTools, которая позволяла декомпилировать и компилировать apk-файлы. Кроме того, потребовалась утилита aapt.exe, которая была взята мной из стандартного SDK под андроид в папке android-sdk\build-tools\20.0.0.
Для удобства вызова утилиты из под windows был создан скрипт apktool.bat:
@echo off set PATH=%CD%;%PATH%; java -jar "%~dp0\apktool.jar" %1 %2 %3 %4 %5 %6 %7 %8 %9
Для декомпиляции приложения были выполнены команды:
apktool if .apk apktool d .apk
После чего, в полученных исходниках был найден файл BaseReaderFragment.smali и нужные нам методы были изменены следующим образом:
.method protected placeAdViewIfNeeded(Landroid/view/ViewGroup;)V .locals 3 .param p1, "layoutAds" # Landroid/view/ViewGroup; .prologue const/4 v2, -0x2 return-void .end method .method protected removeAdViewIfNeeded(Landroid/view/ViewGroup;)V .locals 1 .param p1, "layoutAds" # Landroid/view/ViewGroup; .prologue .line 149 const/16 v0, 0x8 return-void .end method
Далее пришла очередь сборки apk-файла из исходников.
Сделать это можно cледующей командой:
apktool b
Но это еще не все. Чтобы приложение можно было установить, его нужно было подписать цифровой подписью. Самый простой способ сделать это – это скачать архив в котором находится утилита для подписи приложений и цифровые сертификаты к ней.
Распаковываем архив, выполняем команду:
java -jar signapk.jar certificate.pem key.pk8 .apk .apk
Полученный apk-файл можно загружать на телефон, чтобы проверить наше модифицированное приложение. Однако в процессе тестирования изменений оказалось, что объявления больше не показываются, однако сама страница для их показа создается, что не очень приятно. Снова был проанализирован код приложения, найден класс BaseSeamlessReaderFragment, а в нем метод appendPages.
В нем было видно, что строчка:
addPage(new MangaPage(i - 1, null, chapteritem, true), false);
создает дополнительную страницу, помимо тех, что есть в главе манги, с параметром, отвечающим за показ объявлений. Было решено удалить эту строчку и посмотреть результат. Снова заглядываем в аналогичный smali-файл(BaseSeamlessReaderFragment$4) и удаляем строчку:
invoke-virtual , Lorg/mangawatcher/android/fragments/BaseSeamlessReaderFragment;->addPage(Lorg/mangawatcher/android/fragments/BaseSeamlessReaderFragment$MangaPage;Z)V
Снова проводим сборку apk-файла из исходников и подписываем наше приложение. После установки и тестирования приложения экран с рекламой окончательно исчез, что и было конечной целью.
Данный пример показывает, что в случае необходимости можно довольно просто и быстро модифицировать уже существующие android-приложения, чтобы добавить в них недостающий функционал или наоборот удалить некоторые нежелательные возможности в тех ситуациях, когда доступа к исходникам нет. Надеюсь он поможет людям, которые попали в похожую ситуацию и не хотят мирится с ней, найти решение проблемы.
- android
- декомпиляция
- разработка под android
- reverse engineering
- Информационная безопасность
- Разработка под Android
