Перехват сетевых запросов из мобильного приложения

Иногда возникает необходимость протестировать мобильное приложение и просмотреть все связанные с ним сетевые запросы. В среде интернета эта задача решается довольно просто: нажимаете Ctrl + Shift + I, чтобы открыть инструменты разработчика. Оттуда можно перейти на вкладку “Сеть” и просмотреть все HTTP-запросы, связанные с веб-страницей, следующим образом:

Сетевые запросы в браузере

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

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

Использование прокси-сервера позволяет перехватывать, проверять и анализировать все входящие сетевые запросы. Это открывает широкие возможности для отладки, оптимизации производительности и анализа безопасности приложений.

Для удобства изложения разделим данное руководство на пять шагов:

  1. Установка эмулятора Android
  2. Установка прокси-сервера
  3. Подготовка сертификата
  4. Развертывание сертификата
  5. Настройка прокси на эмуляторе Android

Рассмотрим подробно каждый шаг.

1. Установка эмулятора Android

  • Для начала необходимо установить программу Android Studio. Скачать ее можно на загрузочной странице Android Studio.
  • После успешной установки запустите Android Studio. На панели инструментов в верхней части окна найдите меню Tools и кликните на него. Затем в выпадающем меню выберите Device Manager:
Выберите Device Manager из выпадающего списка
  • После клика на Device Manager появится новая панель:
Панель Device Manager
  • Кликните Create Device (Создать устройство):
Выбор Create Device

Теперь необходимо выбрать из списка устройство, на котором отсутствует логотип Play Store:

Выбор устройства

На следующем этапе, после выбора устройства без логотипа Play Store, необходимо выбрать уровень API, соответствующий требованиям тестирования. Уровень API представляет собой версию платформы Android, которую будет имитировать устройство или эмулятор:

Уровень API

При переходе к следующему этапу появляется возможность настроить параметры AVD (Android Virtual Device), включая имя устройства, распределение оперативной памяти и объем хранилища.

Настройка параметров AVD

После завершения настройки параметров AVD можно приступать к запуску устройства. Кликните “Run”, чтобы запустить эмулятор и виртуальное устройство:

Запуск устройства

Если хотите применить командную строку для запуска эмулятора, можно воспользоваться альтернативным способом. Откройте командную строку или терминал на своем компьютере и выполните несколько команд.

Для начала воспользуйтесь командой emulator -list-avds, чтобы вывести на экран список всех установленных в системе эмуляторов. Эта команда предоставит вам названия доступных устройств. В списке укажите название устройства, которое вы хотите запустить.

После определения необходимого устройства можно воспользоваться командой emulator -avd deviceName. Замените в команде deviceName реальным названием необходимого устройства. Эта команда запустит эмулятор с указанным устройством.

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

Список устройств

После установки эмулятора Android можно загрузить и установить APK-файл желаемого приложения с APKMirror. APKMirror  —  это авторитетный сайт, предлагающий широкий спектр APK-файлов для различных приложений Android. После загрузки APK-файла приступайте к его установке на эмулятор Android. Можно либо перетащить загруженный APK-файл в окно эмулятора, либо использовать механизм передачи файлов эмулятора для импорта APK-файла.

2. Установка прокси-сервера

Прежде чем приступать к установке прокси, необходимо убедиться, что OpenSSL и Android Debug Bridge (ADB) правильно настроены. Ниже приведены шаги, которые необходимо выполнить.

  • Начните с установки OpenSSL в системе, если это еще не было сделано. Процесс установки см. в документации по конкретной операционной системе. Затем можно проверить правильность установки, выполнив команду openssl version в терминале или командной строке. Если вы все сделали правильно, будет показана версия OpenSSL.
Проверка версии OpenSSL
  • Теперь необходимо убедиться в наличии доступа к ADB из терминала или командной строки. Для проверки доступности и правильности настройки ADB используйте команду adb version. Если команда возвращает версию ADB, настройка выполнена правильно.
Версия ADB

После успешной настройки OpenSSL и подтверждения доступа к ADB можно приступать к установке прокси-сервера. В этом руководстве мы будем загружать и использовать Proxyman в качестве примера. Однако те же принципы можно применить и к другим подобным инструментам, таким как Charles Proxy и mitmProxy.

3. Подготовка сертификата

Для расшифровки запросов приложения Proxyman генерирует собственный SSL-сертификат. Чтобы получить этот сертификат и настроить его для использования в ОС Android, выполните следующие действия.

  • Откройте веб-браузер и перейдите по следующей ссылке, чтобы загрузить SSL-сертификат Proxyman. После загрузки сертификата найдите папку, в которой он был сохранен:
Переход в папку, в которую загружен файл

Чтобы файл сертификата имел формат, поддерживаемый ОС Android, необходимо переименовать его. Откройте командную строку и перейдите в папку, в которой находится сертификат. После этого выполните данную команду:

hashed_name=`openssl x509 -inform PEM -subject_hash_old -in proxyman-ca.pem | head -1` && cp proxyman-ca.pem $hashed_name.0This command uses OpenSSL to generate a hashed name for the certificate and then renames the file accordingly. By following these steps, you obtain the custom SSL certificate from Proxyman and rename it to the format expected by Android OS. This certificate is essential for decrypting app requests and enabling Proxyman to intercept and analyze the network traffic.

Эта команда не будет работать в Windows Powershell, поэтому я выполнил ее в терминале Git Bash:

Выполнение команды на Git Bash

Команда выполнилась успешно. Она сгенерировала файл с расширением .0 в той же папке:

Получение сертификата Android

4. Развертывание сертификата

Файл .0, который был сгенерирован на предыдущем этапе, является сертификатом, который нужно добавить в эмулятор Android. Чтобы сделать это, начните с открытия терминала со списком доступных AVD:

emulator -list-avds

Запустите нужный из доступных AVD с помощью следующей команды:

emulator -avd <avd_name_here> -writable-system

Обратите внимание на использование флага -writable-system для запуска AVD с перезаписываемыми системными разрешениями, что позволяет вносить изменения. После этого нужно открыть другой терминал и выполнить следующую команду:

adb root

Эта команда перезапускает демон (системную службу) ADB с правами root. Затем запустите эту команду, чтобы отключить подтверждение безопасной загрузки на устройстве:

adb shell avbctl disable-verification

Теперь перезагрузите устройство с помощью команды:

adb reboot

Как только устройство перезагрузится, запустите следующую команду, чтобы снова перезапустить ADB как root:

adb root

Выполните перемонтирование разделов как read/write с помощью следующей команды:

adb remount

Если ADB предложит вам перезагрузить устройство, снова запустите adb reboot, затем adb root и adb remount. Теперь можно отправить переименованный файл SSL-сертификата  —  файл .0, сгенерированный ранее,  —  на устройство, используя следующую команду, заменив <path_to_certificate> на фактический путь к файлу сертификата:

adb push <path_to_certificate> /system/etc/security/cacerts

Эта команда копирует файл сертификата в соответствующий каталог на устройстве. Теперь нужно установить правильные разрешения для файла сертификата, выполнив следующую команду:

adb shell chmod 664 /system/etc/security/cacerts/<name_of_pushed_certificate>

Перезагрузите устройство в последний раз, используя следующую команду:

adb reboot

Устройство перезагрузится, и SSL-сертификат будет развернут. Вы успешно внедрили SSL-сертификат в эмулятор Android. Это позволит эмулятору распознавать сертификат и доверять ему, позволяя Proxyman перехватывать и анализировать сетевой трафик с устройства.

Теперь, чтобы проверить наличие сертификата на своем устройстве Android, перейдите в раздел Trusted Credentials в настройках Encryption & Credentials и найдите сертификат Proxyman LLC на вкладке System. Так вы удостоверитесь в том, что сертификат был успешно установлен и распознан устройством:

Проверка наличия сертификата

5. Настройка прокси-сервера на эмуляторе Android

Заключительный шаг предполагает настройку эмулятора Android для использования настроенного прокси-сервера Proxyman. Для этого запустите Proxyman на компьютере. В Proxyman перейдите в меню Certificate. Выберите Install Certificate on Android из выпадающего списка. Выберите Physical Devices в подменю. Обратите внимание на то, что вам не нужно изучать инструкции Physical Devices, поскольку мы не будем им следовать. Нам понадобятся лишь несколько важных деталей из этого меню:

Physical Devices в Proxyman

В Android setup guide обязательно скопируйте как IP-адрес, так и номер порта. Эти детали понадобятся для последующих этапов:

Скопируйте IP-адрес и номер порта

Далее нужно зайти в эмулятор Android и кликнуть на иконку с многоточием, как показано на скриншоте:

Кликните на иконку с многоточием

Кликните на опцию Settings, указанную на боковой панели. После этого можете перейти на вкладку Proxy:

Переход к настройкам

На вкладке Proxy установите флажок Manual proxy configuration. Затем вставьте IP-адрес и номер порта, скопированные на этапе Android setup guide, и нажмите кнопку apply:

Настройка IP-адреса и номера порта

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

Перехват сетевых запросов с помощью Proxyman

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Rabi Siddique: Intercepting Network Requests from a Mobile App

Предыдущая статьяRefs в React: от доступа к DOM до императивного API
Следующая статьяЗаменят ли потоки данных циклы в Java?