14.08.2014

Отладка приложений в Android

image

Использование отладчика для манипуляции переменными Android-приложения во время его выполнения может быть полезно во время пентестов.

Автор: Навин Радраппа (Naveen Rudrappa)

Использование отладчика для манипуляции переменными Android-приложения во время его выполнения может быть полезно во время пентестов. Для того чтобы получить доступ к коду программы, ее можно распаковывать, модифицировать, пересобирать и конвертировать. Хотя понимание логики работы приложения (чтобы, к примеру, узнать, какие переменные особо важны) – совершено другая история, и весь этот процесс может занять весьма продолжительное время. В этой статье мы на простом примере рассмотрим преимущества, которые можно получить от отладки приложения во время его выполнения.

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

Утилиты, необходимые для работы

  1. Установочный пакет приложения.
  2. Java SDK.
  3. Android SDK.

Реверс-инжиниринг играет основополагающую роль во время пентеста приложений на базе Android. Возможны два варианта работы:

Создание отлаживаемого приложения

В файле AndroidManifest.xml, находящегося внутри пакета приложения (файл с расширением .apk), есть опция android:debuggable, установив которую вы сделаете приложение отлаживаемым. Распакуйте установочный пакет приложения при помощи APK Manager и добавьте строчку android:debuggable="true".

Рисунок 1: Установку соответствующей опции, чтобы приложение стало отлаживаемым

Подсоединение к процессу

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

Рисунок 2: Выделен идентификатор последнего запущенного процесса

Далее нам нужно пробросить (forwarding) отладочную сессию на порт, к которому будет подключен отладчик.

adb forward tcp:8000 jdwp:498

Подцепляемся отладчиком к процессу:

jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8000

Теперь мы можем устанавливать точки останова на нужных функциях и анализировать приложение в режиме реального времени. Чтобы выявить имена функций можно воспользоваться утилитой android-apktool (информация о функциях будет полезна во время отладочной сессии).

Некоторые команды, которые будут полезны во время отладки:

  1. stop in [function name] – установить точку останова
  2. next – выполнить одну инструкцию
  3. step – зайти внутрь функции
  4. step up – пройти всю функцию
  5. print obj – вывести информацию об объекте
  6. dump obj – выгрузить класс
  7. print [variable name] – вывести значение переменной
  8. set [variable name] = [value] – изменить значение переменной

Домашнее задание

Скачайте следующее приложение:

· https://github.com/OpenSecurityResearch/AndroidDebugFun/raw/master/runtime.apk

Логика программы довольно проста. Если ввести правильный PIN (1234) приложение выведет сообщение «correct PIN entered». В противном случае будет выведено сообщение «Invalid PIN». Задача: сделать так, чтобы при вводе неправильного кода приложение вывело сообщение «correct PIN entered». Решение этой задачи показано на рисунке ниже.

Рисунок 3: Изменение логики работы тестового приложения