Анализ трафика приложений на Android Emulator. Причем здесь Root?
Я есть root
Мне кажется, что наступил момент рассказать, для чего нам вообще рут? Все дело в том пресловутом изменении Android 7, после которого пользовательские сертификаты перестали быть доверенными. Посему — нам необходимо сделать что-то с нашим установленным сертификатом, чтобы мы смогли использовать его для изучения трафика нашего рабочего приложения. И сделать это можно, только если ваш девайс рутован. Тут же заключается и причина использования эмулятора, да и связанные с этим особенности: без эмулятора вам придется иметь постоянно рутованное устройство, если это отдельный выделенный смартфон — то проблем с этим особенно и нет (ну, кроме зарядки, постепенного устаревания и ограничений конкретной модели), однако, если у вас свой личный аппарат — то минусы от root могут быть существенными — не работающая система безопасности, сломанный Google Pay или отвалившиеся камеры… Ну и помимо всего прочего — эмулятор позволяет легко изменить версию Android (правда, придется повторить все действия, перечисленные тут, но у вас уже будет эта статья, а я вот это все пишу её не имея).
А теперь приступим. Благодаря прекраснейшему проекту весь процесс сводится к запуску всего лишь одного скрипта, с небольшими подготовительными работами. Также, обращайте внимание на то, что выводится в консоль и если вы пользуетесь Windows — то запускайте не .sh
, а .bat
. Возможно, WSL будет тут как раз кстати, но моя система, скажем так, с некоторыми особенностями, которые WSL использовать не позволяют (если вы знаете, как завести на Ryzen 5000-серии и WSL и Android Emulator — то прошу написать об этом комментарий).
А вот и сами работы:
./rootAVD.sh ~/Library/Android/sdk/system-images/android-30/google_apis/x86_64/ramdisk.img
Плюс, нужно перезагрузить эмулятор. Ну и, у пользователей Windows путь до образа будет примерно таким:
C:\Users\Me\AppData\Local\Android\Sdk\system-images\android-30\google_apis\x86_64\ramdisk.img
На выходе мы получаем рут, который сохраняется при перезагрузке эмулятора, но wipe делать не стоит.
Ставим галку:
Делаем сертификат доверенным
Для этого нам понадобится перенести его в хранилище доверенных сертификатов. Тут рут нам и нужен (не только тут, но это позже).
Для этого мы запускаем цепочку следующих команд:
adb shell
su
mkdir -m 700 /data/certs
cp /system/etc/security/cacerts/* /data/certs/
mount -t tmpfs tmpfs /system/etc/security/cacerts
cp /data/misc/user/0/cacerts-added/* /system/etc/security/cacerts/
mv /data/certs/* /system/etc/security/cacerts/
chown root:root /system/etc/security/cacerts/*
chmod 644 /system/etc/security/cacerts/*
chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*
После чего наблюдаем следующую картинку в системных сертификатах:
Наш сертификат стал системным, поэтому закроем еще один пункт:
И давайте сразу проверим наше приложение:
Отлично! Теперь мы можем слушать HTTPS-трафик любых (ли?) приложений с эмулятора. Давайте, чтобы закрепить результат, попробуем еще одно приложение — Avito (как говорили Ник и Майк — это крепкий орешек).
Кажется, тут что-то пошло не так. Впрочем вы и так все знаете, так как видели гигантский спойлер в самом начале, поэтому ставим еще одну галку:
SSL-Unpinning
На данную тему есть множество решений, но, как правило, все они крутятся вокруг одной идеи — пересборки приложения, которое вы хотите изучить. Данный подход весьма громоздкий, сложный и может сподвигнуть к прокрастинации, поэтому нужно что-то такое, что позволит сделать все намного проще и универсальнее. И рецепт этого чего-то прямо тут, бесплатно и без СМС:
Благодаря наличию root установим Xposed
Благодаря Xposed установим модуль для отвязки SSL-привязки
Profit!!! (два пункта тут смотрелись бы уныло)
А теперь давайте по порядку.
Установка Xposed
С учетом нашего изначального плана слушать всё и вся на эмуляторе на этом шаге появляются некоторые сложности — нужно подобрать удачную комбинацию программных решений, которые будут работать и на эмуляторе. Благодаря этой статье вам совершенно точно не придется тратить несколько часов на поиски этих решений и будет достаточно следовать простой инструкции:
Скачиваем последнюю версию Magisk-модуля с интересным названием Riru и устанавливаем его посредством Magisk
Закрываем эмулятор, а затем снова запускаем (данный шаг эмулирует перезагрузку, которая у меня, по каким-то причинам, не работает, если работает у вас — может быть достаточно и её)
Находим в репозитории Magisk модуль с названием
Riru - LSPosed
и устанавливаем егоСнова ребутим эмулятор
Открываем приложение LSPosed, в котором необходимо установить уже Xposed-модуль SSLUnpinning
Переключаем все галки в настройках данного модуля у всех приложений, которые хотим слушать и активируем сам модуль
Ребутим эмулятор
После этого вы оказались в ситуации, когда у вас есть эмулятор с:
Полноценным рутом (Magisk)
Установленным MITM-сертификатом в User-space
Установленным Xposed (LSPosed)
Установленным модулем для SSL-Unpinning
В процессе имея следующий набор картинок:
Можно честно поставить галку:
⚑ SSL Unpinning
Настал час проверить, работает ли этот паровоз:
Работает! Ник и Майк ошиблись! Можем ставить и последнюю галку:
⚑ Profit!!!
Какие есть нюансы? Во первых — при каждом включении эмулятора будет необходимо снова делать сертификаты доверенными (в принципе, после всех этих процедур можно отключить Cold Boot, и тогда не придется, но рано или вам придется перезагрузить эмулятор «жестко», и тогда не придется поработать и с сертификатами). Возможно, тут есть постоянное решение или это можно, на худой конец, автоматизировать, но я устал. Во вторых — не все приложения в принципе хотят запускаться на эмуляторе. Самый надежный вариант — иметь набор выделенных телефонов на разных версиях Android, все из которых будут иметь весь арсенал инструментов из данного мануала (с небольшими изменениями), но он не всегда возможен.
Под конец — я еще раз продублирую всю инструкцию по пунктам, чтобы был понятен сам алгоритм:
Делаем приготовления (ставим Android Studio), чтобы иметь возможность установить / запустить эмулятор
Устанавливаем эмулятор с параметрами, определенными выше
Устанавливаем интересующие нас приложения на эмулятор методом перетаскивания курсором и убеждаемся, что они в принципе работают и все это будет не зря
Получаем root (Magisk) посредством инструкции, указанной выше
Перезагружаем эмулятор
Устанавливаем Riru
Перезагружаем эмулятор
Устанавливаем LSPosed
Перезагружаем эмулятор
Устанавливаем Xposed-модуль SSLUnpinning
Ставим все галки в модуле у интересующих нас приложений и у самого модуля (включаем его)
Закрываем эмулятор
Выключаем Cold Boot
Включаем эмулятор
Устанавливаем MITM CA-сертификат в User-space (считай — просто устанавливаем)
Делаем сертификат доверенным по инструкции выше
Настраиваем Proxy на эмуляторе согласно параметрам, указанным выше, или вашим собственным (в зависимости от того, каким инструментом для анализа трафика вы собираетесь пользоваться)
Анализируем работу приложения
Если будете устанавливать дополнительные приложения на эмулятор — то необходимо проставить галки напротив них в SSLUnpinning (через LSPosed) и жестко перезагрузить эмулятор, с последующим фиксом сертификатов после перезагрузки. На этом, собственно, все, до новых встреч!