Анализ трафика приложений на 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 делать не стоит.

image-loader.svgimage-loader.svg

Ставим галку:

Делаем сертификат доверенным

Для этого нам понадобится перенести его в хранилище доверенных сертификатов. Тут рут нам и нужен (не только тут, но это позже).

Для этого мы запускаем цепочку следующих команд:

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/*

После чего наблюдаем следующую картинку в системных сертификатах:

image-loader.svgimage-loader.svg

Наш сертификат стал системным, поэтому закроем еще один пункт:

И давайте сразу проверим наше приложение:

image-loader.svgimage-loader.svg

Отлично! Теперь мы можем слушать HTTPS-трафик любых (ли?) приложений с эмулятора. Давайте, чтобы закрепить результат, попробуем еще одно приложение — Avito (как говорили Ник и Майк — это крепкий орешек).

image-loader.svgimage-loader.svg

Кажется, тут что-то пошло не так. Впрочем вы и так все знаете, так как видели гигантский спойлер в самом начале, поэтому ставим еще одну галку:

SSL-Unpinning

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

  1. Благодаря наличию root установим Xposed

  2. Благодаря Xposed установим модуль для отвязки SSL-привязки

  3. Profit!!! (два пункта тут смотрелись бы уныло)

А теперь давайте по порядку.

Установка Xposed

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

  1. Скачиваем последнюю версию Magisk-модуля с интересным названием Riru и устанавливаем его посредством Magisk

  2. Закрываем эмулятор, а затем снова запускаем (данный шаг эмулирует перезагрузку, которая у меня, по каким-то причинам, не работает, если работает у вас — может быть достаточно и её)

  3. Находим в репозитории Magisk модуль с названием Riru - LSPosed и устанавливаем его

  4. Снова ребутим эмулятор

  5. Открываем приложение LSPosed, в котором необходимо установить уже Xposed-модуль SSLUnpinning

  6. Переключаем все галки в настройках данного модуля у всех приложений, которые хотим слушать и активируем сам модуль

  7. Ребутим эмулятор

После этого вы оказались в ситуации, когда у вас есть эмулятор с:

  • Полноценным рутом (Magisk)

  • Установленным MITM-сертификатом в User-space

  • Установленным Xposed (LSPosed)

  • Установленным модулем для SSL-Unpinning

В процессе имея следующий набор картинок:

image-loader.svgimage-loader.svgimage-loader.svgimage-loader.svg

Можно честно поставить галку:

  • ⚑ SSL Unpinning

Настал час проверить, работает ли этот паровоз:

image-loader.svgimage-loader.svg

Работает! Ник и Майк ошиблись! Можем ставить и последнюю галку:

  • ⚑ Profit!!!

Какие есть нюансы? Во первых — при каждом включении эмулятора будет необходимо снова делать сертификаты доверенными (в принципе, после всех этих процедур можно отключить Cold Boot, и тогда не придется, но рано или вам придется перезагрузить эмулятор «жестко», и тогда не придется поработать и с сертификатами). Возможно, тут есть постоянное решение или это можно, на худой конец, автоматизировать, но я устал. Во вторых — не все приложения в принципе хотят запускаться на эмуляторе. Самый надежный вариант — иметь набор выделенных телефонов на разных версиях Android, все из которых будут иметь весь арсенал инструментов из данного мануала (с небольшими изменениями), но он не всегда возможен.

Под конец — я еще раз продублирую всю инструкцию по пунктам, чтобы был понятен сам алгоритм:

  • Делаем приготовления (ставим Android Studio), чтобы иметь возможность установить / запустить эмулятор

  • Устанавливаем эмулятор с параметрами, определенными выше

  • Устанавливаем интересующие нас приложения на эмулятор методом перетаскивания курсором и убеждаемся, что они в принципе работают и все это будет не зря

  • Получаем root (Magisk) посредством инструкции, указанной выше

  • Перезагружаем эмулятор

  • Устанавливаем Riru

  • Перезагружаем эмулятор

  • Устанавливаем LSPosed

  • Перезагружаем эмулятор

  • Устанавливаем Xposed-модуль SSLUnpinning

  • Ставим все галки в модуле у интересующих нас приложений и у самого модуля (включаем его)

  • Закрываем эмулятор

  • Выключаем Cold Boot

  • Включаем эмулятор

  • Устанавливаем MITM CA-сертификат в User-space (считай — просто устанавливаем)

  • Делаем сертификат доверенным по инструкции выше

  • Настраиваем Proxy на эмуляторе согласно параметрам, указанным выше, или вашим собственным (в зависимости от того, каким инструментом для анализа трафика вы собираетесь пользоваться)

  • Анализируем работу приложения

Если будете устанавливать дополнительные приложения на эмулятор — то необходимо проставить галки напротив них в SSLUnpinning (через LSPosed) и жестко перезагрузить эмулятор, с последующим фиксом сертификатов после перезагрузки. На этом, собственно, все, до новых встреч!

© Habrahabr.ru