Восстановление утерянного Android-приложения из APK-файла

Экспертиза СКЭНД по восстановлению утерянного Android приложения, принадлежащего нашему клиенту, из APK файла.

Задача

Поставленная задача состояла в улучшении работы 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 файла.

По истечению 14 рабочих дней отдел мобильных разработок СКЭНД сумел выполнить весь перечень необходимых операций по декомпиляции APK, получению исходного кода, его последующему анализу и восстановлению коммуникации с серверной частью приложения.

В итоге, нам удалось обновить код приложения, а также привнести в него новый функционал. Несмотря на сложность поставленной задачи, команда была увлечена процессом прорабатывания новых, креативных и индивидуальных решений, работа которых и обеспечила успех выполненного заказа.

Нуждаетесь в разработке похожего проекта?

Свяжитесь с нами

Мы любим новые проекты! Напишите нам, и мы ответим вам в ближайшее время.

Спасибо, что написали нам! Ваше сообщение было успешно отправлено. Мы обязательно ответим на него в ближайшее время. Пожалуйста, проверьте, получили ли Вы от нас письмо-подтверждение на указанную Вами почту.