Реверс Андроид приложений

Приложения для анализа Андроид приложений

Реверс-инжиниринг позволяет не только разобраться в существующих приложениях, но и модифицировать их. В этом смысле приложения на Андроид — клад для начинающего реверсера. Сегодня мы разберем несколько приложений, чтобы потренироваться в реверс-инжиниринге и узнать о подлинных возможностях вашего смартфона.

Какое приложение мы будем реверсить? Я выбрал для этой статьи VK Admin — приложение для управления сообществами «ВКонтакте» со смартфона. В нем к сожалению не предусмотрен ночной режим, поэтому мы с вами путем реверса попробуем это дело исправить.

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

Собираем и разбираем

Сначала извлечем все ресурсы приложения, используя утилиту apktool — она распаковывает и запаковывает файлы пакетов APK, которые хранятся в сжатом, бинарном виде, и дизассемблирует программный код, заключенный в них.

Чтобы получить установочный пакет, можно воспользоваться Android Debugging Bridge — системой для отладки программ на устройстве. В *nix-подобных системах ADB ставится стандартно, с помощью пакетного менеджера, а в Windows — идет в составе Android Studio или Android SDK Platform Tools.

В первую очередь установим приложение из Google Play Store на смартфон, подключим его к компьютеру с помощью USB, затем воспользуемся ADB для переноса пакета приложения на компьютер и извлечем его содержимое.

После этого мы получим папку com.vk.admin/, внутри которой хранится все содержимое исходного .apk, только в декодированном виде. Чтобы применить изменения, необходимо будет снова воспользоваться рядом утилит.

  1. Сначала соберите приложение обратно в пакет .apk.

  1. Затем необходимо подписать приложение. Это нужно, чтобы и Google Play Store, и устройство не обновляли приложение, если подписи не совпадают. Поэтому не забудьте удалить приложение с телефона, прежде чем установить свое, подписанное своим ключом.

Для создания подписи в первый раз нужно воспользоваться утилитой keytool (входит в Java Development Kit):

  1. Когда вы уже создали ключ, подпишите приложение.

  1. После этого установите приложение на смартфон.

РЕКОМЕНДУЕМ:
Взлом приложений для Андроид с помощью отладчика

Меняем цветовые схемы

Цвета в приложении можно настроить несколькими способами:

  • использовать встроенные цвета, к примеру @android:color/white;
  • создать палитру собственных цветов в файле colors.xml, которые затем используются в виде @color/text_primary;
  • задать цвет шестнадцатеричным кодом, главное — не забудьте, что цвета в приложении записаны в формате #AARRGGBB — прозрачность на первом месте;
  • воспользоваться параметрами setTextColor, setBackgroundColor внутри кода Java или Kotlin.

Все эти способы жизнеспособны и постоянно используются.

colors.xml

Цветовая палитра приложения содержится в файле com.vk.admin/res/values/colors.xml. Структура файла выглядит так:

Каждый цвет, который в дальнейшем используется в статичных экранах приложения, записан здесь. Наша цель — изменить цвета, самый простой способ это сделать — инвертировать. Для записи цвета в формате hex можно отнять из 255 каждый компонент: R, Gи B, то есть 255 - R, 255 - G, 255 - B. Параметры @android:color/white и @android:color/black можно изменить вручную.

styles.xml

В файле com.vk.admin/res/values/styles.xml заданы цвета, но только некоторые. Этот файл используется самими разработчиками, когда они хотят сделать несколько цветовых схем приложения. Если же этих схем нет, работать приходится нам с вами.

Некоторые цвета текста и фона заданы именно здесь, поэтому их нужно изменить аналогично с colors.xml.

Layout

В папке com.vk.admin/res/ находятся описания экранов приложения.

  • com.vk.admin/res/layout/ — универсальное хранилище экранов для всех смартфонов. Если нет каких-то специальных указаний, то будут использованы эти ресурсы;
  • com.vk.admin/res/layout-v``XX (где XX — версия SDK смартфона, зависит от версии Android на устройстве) используются для работы с самыми передовыми элементами UI;
  • остальные com.vk.admin/res/layout-... задают специфичные экраны приложения для ориентации устройства, разрешения и так далее.

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

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

Smali

Внутри приложений на Android используется собственный формат файлов — .dex, или Dalvik EXecutable, и собственная виртуальная машина, чтобы эти файлы исполнять, — Dalvik.

Как и с любым компилируемым языком, для .dex есть байт-код — smali — человекочитаемый и понятный с первого взгляда.

Машина Dalvik, в отличие от JVM, — регистровая, а не стековая. Регистры не имеют типов и могут хранить всё: числа, строки, экземпляры классов. При этом язык smali строго типизирован.

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

  1. const-string v1, "MyTag" — записать в регистр v1 строку "MyTag".
  2. invoke-static {v0}, Ljava/lang/String;->valueOf(I)Ljava/lang/String; — вызвать функцию String.valueOf(v0). Здесь static означает, что функция встроена в виртуальную машину; {v0} — список аргументов; L показывает, что сразу за ним идет название объекта, класса и так далее; java, lang, String; — тип строки; I — тип числа, Integer; а все вместе ( ->valueOf(I)Ljava/lang/String;) говорит нам о том, что вызывается функция valueOf от одного аргумента и возвращает она строку.
  3. move-result-object v2 — записать результат предыдущей операции в v2.
  4. invoke-static {v1, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I — залогировать содержимое v2 под тегом из v1.

Если не удается понять, что значит тот или иной регистр или что делает та или иная функция, используйте декомпилятор smali в Java — Jadx.

Интуитивно понятный интерфейс Jadx
Интуитивно понятный интерфейс Jadx

Использовать Jadx просто — нужно лишь выбрать файл и открыть его, код будет автоматически декомпилирован и показан.

Рекомендую ознакомиться с документацией по байт-коду Dalvik VM.

setBackgroundColor

Для некоторых экранов приложения используется параметр setBackgroundColor(I)V, который устанавливает цвет фона. Часто это не статичные экраны, а динамические: с поддержкой скролла, различные списки и карточки.

Эта строка занимается изменением. Чтобы изменить цвет, нужно его записать в регистр, а затем передать в функцию вместо настоящего.

Теперь пройдитесь по всем файлам и замените цвет.

Бывают случаи на порядок проще.

Нужно просто изменить -0x1 на -0x1000000, и приложение погрузится во тьму.

Стоит быть внимательным и пытаться разобраться в коде: иногда оптимизатор кода будет перемещать инструкции const вверх, и вы можете их не заметить.

setTextColor

Иногда текст, который меняется в ходе работы с приложением, может менять свой цвет. За это отвечает параметр setTextColor(I)V, второй аргумент которого можно подменить на нужный, в нашем случае — белый.

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

Реверс Андроид приложений. Результат изменений
Результат изменений

Меняем функциональность приложения

Чтобы ощутить всю мощь smali, давайте попробуем изменить какую-то часть приложения. Например, обойдем проверку на внутренние покупки.

Возьмем другое приложение — ISS Detector. Оно показывает положение МКС над Землей. В нем можно купить расширения: показ комет, планет, Луны, телескопа «Хаббл».

При копировании приложения на компьютер может возникнуть проблема: в составе приложения не один и не два, а целых три файла apk!

Копируем все. При переустановке приложения файлы split_config.en.apk и split_config.xxhdpi.apk потеряются, а без них приложение будет вылетать. Поэтому их нужно будет переподписать: зайти в них как в архивы ZIP, удалить папку META_INF и прогнать через стандартную процедуру утилиты jarsigner. Основной же файл мы будем препарировать с помощью apktool.

РЕКОМНДУЕМ:
Инструменты Android-разработчика

Покупками в приложении занимается интерфейс IInAppBillingService. Для него прописана обертка com.runar.issdetector.util: IabHelper, IabResult, Purchase, Security, Inventory.

В этом приложении можно не идти напролом, обманывая сервис покупок. Проще заставить приложение думать, что все уже куплено. В этом нам поможет Inventory.smali.

В особо сложных случаях такой трюк провернуть не удается, и тогда приходится подменять данные, заставляя сервис ложно сообщать о совершенных покупках. Подробнее об этом можно почитать в материале компании Securing Apps (PDF).

Открыв файл, вы увидите поле mPurchaseMap<String; Purchase>, которое содержит в себе все покупки: номер товара, сопоставленный с покупкой, которую совершил пользователь.

Далее в коде мы видим строку hasPurchase(String sku) -> boolean, которая проверяет, совершал ли пользователь покупку. Для этого делается проверка на существование ключа sku в mPurchaseMap.

А что будет, если в любом случае отдавать true?

Собираем приложение и устанавливаем его.

Реверс Андроид. Результат изменения кода
Результат изменения кода

С этого можно начать свой путь в реверс-инжиниринг. Я рассказал вам основы реверса Андроид приложений, с которых начинал сам. Небольшие изменения могут улучшить вашу жизнь — надеюсь, я смог вам это показать.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий