Введение

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

Если мы говорим о веб-приложении, проверить сетевой запрос к серверу довольно просто. Для Chrome или Firefox просто перейдите в инструменты разработчика и посмотрите вкладку сети. Мы можем отслеживать тип запроса, такой как метод, URL-адрес, заголовки, тело, а также ответ.

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

Прокси

Ответ заключается в том, что мы можем использовать такой инструмент, как прокси, чтобы помочь нам захватить сеть между устройством и сервером. Этот метод называется Man-In-The-Middle, потому что мы ставим прокси в среднее соединение. Дополнительные изображения см. на диаграмме ниже.

Для примера есть куча прокси-сервисов:

Я лично выберу Proxyman, потому что я пользователь Mac и он основан на графическом интерфейсе. Если вам больше нравится CLI, вы можете попробовать mitmproxy. Оба они не ваши любимые? Возможно, вы можете использовать другой подходящий для вас прокси. Просто погуглите об этом. Вот некоторый вид прокси, о котором я упоминал.

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

Конфигурация Android

После этого следующим шагом будет настройка на телефоне Android. Если у нас нет телефона Android, мы можем использовать эмулятор, такой как Genymotion (https://www.genymotion.com).

Убедитесь, что сеть между телефоном и прокси-сервером находится в одной сети. Перейдите к конфигурации SSID, выберите ручной прокси и добавьте имя хоста + порт прокси в качестве информации о прокси.

Закончив с настройкой прокси, нам нужно настроить SSL для телефона Android. Поскольку я использую Proxyman, нам нужно открыть URL-адрес http://proxy.man/ssl и загрузить сертификат. В реальном телефоне Android просто откройте сертификат и выполните установку. Но для случая с эмулятором шаг немного отличается. Нам нужно установить из Настройки->Безопасность->Установить с SD-карты.

Тестирование

Попробуйте захватить сеть, открыв веб-сайт с помощью мобильного браузера. В этом случае я пытаюсь перехватить сетевой запрос для веб-сайта Yahoo. Как мы видим на картинке ниже, сеть будет захвачена, и если нам нужно увидеть ответ, нам нужно нажать «Включить только этот домен» и попытаться применить тот же запрос. Подробности смотрите на Рисунке 4 и 5.

Если с захватом сети в браузере вроде проблем нет, то как насчет мобильного приложения? Ну, я пытаюсь использовать простое приложение для получения информации о валюте. И как «Картинка 6», она все еще работает!

Проблема с реальным устройством

Предыдущий шаг проводился на Genymotion. Как, если использовать реальное устройство? Потому что это удобнее делать на реальном устройстве, чем на эмуляторе. Но, похоже, у реального устройства есть проблема с ошибкой рукопожатия SSL. На рисунке 7 показано, как сеть становится красной из-за какой-то ошибки.

apk-mitm

Что мы можем сделать, чтобы решить проблему с ошибкой рукопожатия SSL на реальном устройстве? Одним из решений может быть использование этого инструмента под названием apk-mitm (https://github.com/shroudedcode/apk-mitm)

Что такое apk-митм? С их официального сайта github:

Приложение CLI, которое автоматически подготавливает файлы Android APK для проверки HTTPS.

apk-mitm автоматизирует весь процесс. Все, что вам нужно сделать, это предоставить ему APK-файл, и apk-mitm будет:

Как видно из описания выше, нам нужен необработанный APK. Мы можем получить его с APKPure или аналогичного сайта или экспортировать с помощью SAI. Затем нам просто нужно запустить эту установку + выполнить команду, и весь процесс будет как на рисунке 8.

$ npm install -g apk-mitm
$ npx apk-mitm <path-to-apk>

После завершения установки пропатченного APK попробуйте открыть приложение и увидеть перехваченный запрос. Вуаля! Запрос от исправленного APK не имеет проблемы с SSL-рукопожатием!

Проблема закрепления сертификата

К сожалению, в моем случае у меня возникла проблема с приложением, в котором реализовано закрепление сертификата. Если вы впервые слышите об этом, то можете указать подробности здесь. Хотя apk-mitm сказал, что у них есть логика для отключения закрепления сертификата, у меня это не работает. Ошибка SSL Handshake Failed по-прежнему возникает на консоли Proxyman.

Вывод

Резюме для этого эксперимента можно перечислить по пунктам ниже:

  • Proxyman хорошо работает для захвата сетевых запросов браузера и приложений для Android (Genymotion).
  • Захват сетевого приложения на реальном устройстве Android требует дополнительной обработки с использованием apk-mitm .
  • Proxyman хорошо работает для захвата сетевых запросов браузера и приложений для iOS (Real Device). Я не делюсь подробностями для iOS из-за тематической области, но я пробовал.
  • Приложение Android, в котором реализовано закрепление сертификата, может дать сбой из-за сбоя рукопожатия SSL, хотя мы используем исправленный APK.

Надеюсь, эта статья окажется полезной и до встречи на другой теме! Спасибо!