Использование отладчика для манипуляции переменными Android-приложения во время его выполнения может быть полезно во время пентестов.
Автор: Навин Радраппа (Naveen Rudrappa)
Использование отладчика для манипуляции переменными Android-приложения во время его выполнения может быть полезно во время пентестов. Для того чтобы получить доступ к коду программы, ее можно распаковывать, модифицировать, пересобирать и конвертировать. Хотя понимание логики работы приложения (чтобы, к примеру, узнать, какие переменные особо важны) – совершено другая история, и весь этот процесс может занять весьма продолжительное время. В этой статье мы на простом примере рассмотрим преимущества, которые можно получить от отладки приложения во время его выполнения.
Во время отладки мы цепляемся к запущенному процессу и выставляем точку останова в определенном месте программы. После остановки выполнения приложения мы можем анализировать локальные переменные, выгружать значения классов, модифицировать значения и в целом полностью взаимодействовать с программой. После всех необходимых манипуляций приложение продолжает свою работу.
Утилиты, необходимые для работы
Реверс-инжиниринг играет основополагающую роль во время пентеста приложений на базе 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 (информация о функциях будет полезна во время отладочной сессии).
Некоторые команды, которые будут полезны во время отладки:
stop
in
[
function
name
]
– установить точку остановаnext
– выполнить одну инструкциюstep
– зайти внутрь функцииstep up
– пройти всю функциюprint
obj
– вывести информацию об объекте dump obj
– выгрузить классprint
[
variable
name
]
– вывести значение переменнойset
[
variable
name
] = [
value
]
– изменить значение переменнойДомашнее задание
Скачайте следующее приложение:
· https://github.com/OpenSecurityResearch/AndroidDebugFun/raw/master/runtime.apk
Логика программы довольно проста. Если ввести правильный PIN (1234) приложение выведет сообщение «correct PIN entered». В противном случае будет выведено сообщение «Invalid PIN». Задача: сделать так, чтобы при вводе неправильного кода приложение вывело сообщение «correct PIN entered». Решение этой задачи показано на рисунке ниже.
Рисунок 3: Изменение логики работы тестового приложения