Привет, меня зовут Даша, я работаю тестировщицей клиентского мобильного приложения в Ozon.

Сегодня поговорим о снифферах в тестировании мобильных приложений –– программах для перехвата, анализа и модификации трафика. Пожалуй, самый популярный сниффер, о котором я слышала, — Charles. Про него уже не раз писали на Хабре, есть довольно детальные разборы. Но не Charles-ом единым! 

Например, у нас в Ozon команда разработчиков в основном пользуется Proxyman, а тестировщики (в том числе и я) — Charles.

Не так давно у нас в команде разработки мобильного приложения случился холивар на тему “Charles vs Proxyman”. Я попыталась выяснить, почему некоторые люди пользуются Proxyman, а другие — Charles. Из разговоров с коллегами мне было не до конца понятно, какой из снифферов лучше (и чем именно). Поэтому я решила попользоваться Proxyman и разобраться самостоятельно. Давайте вместе посмотрим, какой из инструментов — Charles или Proxyman — выйдет победителем в битве снифферов.

Готовим поле для битвы снифферов: ключевое о тулинге

Снифферы позволяют видеть, что приходит с бэка, изменять или перезаписывать этот ответ; то же самое можно сделать с запросами на бэк. Это даёт нам отличные возможности для тестирования клиент-сервисного взаимодействия (особенно если основная логика зашита на сервере). 

Например, сегодня с бэка приходит заголовок страницы, состоящий из одного слова, и всё выглядит красиво и соответствует макетам. Но завтра бэк решает написать в заголовке пару предложений вместо одного (условно) — и то, как это будет выглядеть, как раз и помогает узнать сниффер.

В своей работе я чаще всего использую следующие функции: Rewrite, Map Local, Breakpoints и Throttling.

Rewrite

  • для замены URL — чтобы перенаправить трафик с тестовой среды на продакшен или наоборот (например, если фича готова только для тестовой среды); 

  • для подмены статус-кода, который приходит с бэка, — чтобы посмотреть, корректно ли будет вести себя приложение при ошибке сервера; 

  • для добавления или изменения заголовка в запросе — если фичу необходимо протестировать с определёнными хедерами.

Map Local — для полной замены ответа страницы с бэка на локальный файл. 

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

Breakpoints — с помощью этой функции можно поставить точку останова на любой URL; когда устройство будет его запрашивать, запрос к серверу откроется в формате редактирования. 

Запрос можно будет изменить или прервать; то же самое произойдёт с ответом от сервера. По сути, Breakpoints может заменить Rewrite и Map Local, но всё же эта фича больше подходит для единоразового использования. Постоянно выискивать ту самую строчку, которую необходимо изменить, довольно затратно по времени, да и запрос за это время может отвалиться по тайм-ауту.

Throttling — отличная фича для подмены скорости интернета. Можно увидеть, как поведёт себя приложение на медленной скорости, как при этом будут загружаться картинки, видео или карта.

Давайте сравнивать Charles и Proxyman на примере этих функций.

Начинаем битву снифферов: установка и настройка

Для начала давайте разберёмся, как установить наши снифферы.

Charles: можно бесплатно скачать с официального сайта

После инсталляции приложения устанавливаем сертификат на железо: Help -> SSL Proxying -> Install Root Certificate. Сниффер готов к работе.

Proxyman: скачиваем бесплатно с официального сайта

Устанавливаем сертификат: Certificate -> Install Certificate on this Mac ->

Install and trust. Сниффер готов к работе.

Сравнение основных фич Charles и Proxyman

Начнём с простого. 

Установка сертификата и подключение мобильного устройства к снифферу

Charles:

  1. Убедиться, что телефон и ноутбук подключены к одной сети.

  2. На мобильном устройстве: Настройки Wi-Fi -> Настройка прокси -> Вручную -> Сервер: ввести IP из Charles (Help -> Local IP Address) -> Порт: по умолчанию вводится 8888.

  3. Открыть браузер и перейти по ссылке chls.pro/ssl.

  4. Для Android: после загрузки сертификата необходимо его открыть и задать имя; после этого устройство будет готово к работе со сниффером.

  5. Для iOS: Настройки -> Основные -> Профили: установить только что скачанный сертификат.

  6. Для iOS: Настройки -> Основные -> Об этом устройстве -> Доверие сертификатам: включить для сертификата из п. 3.

Всё, вы великолепны! Можете запускать приложение и работать с трафиком.

Proxyman: процесс подключения реального устройства такой же, как в случае с Charles. Отличаются только место, где можно узнать IP, и адрес для скачивания сертификата.

Чтобы узнать IP, переходим в Certificate -> Install Certificate on iOS (Android) -> Physical  Devices. Здесь можно найти IP-адрес, который необходимо вводить в настройках, а также адрес, по которому можно скачать сертификат и подробную инструкцию по его установке.

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

Подключение симулятора к снифферу 

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

Charles:

  1. Сделать ресет симулятора: Device -> Erase All Contents and Settings.

  2. Help -> SSL Proxying -> Install Charles Root Certificate in iOS Simulators.

  3. Сделать рестарт симулятора: Device -> Restart.

  4. Убедиться, что вы слушаете трафик вашего компьютера: Proxy -> MacOS Proxy (должна стоять соответствующая галочка).

Proxyman:

1. Открыть Certificate -> Install Certificate on iOS -> Simulators. 

2. Поставить последовательно галочки в каждом пункте. 

Готово, вы великолепны!

В этом раунде тоже выигрывает Proxyman — это видно даже по количеству пунктов в списке. Несколько кликов — и всё готово, в отличие от замороченной настройки Charles.

Функции снифферов: Rewrite 

Charles:

  1. Tools -> Rewrite -> поставить чекбокс Enable Rewrite.

  2. Нажать на Add для создания правила для Rewrite. 

  3. В окне Location с помощью кнопки Add можно добавить один или несколько URL, для которых будет работать это правило. 

  4. В окне под Location с помощью кнопки Add можно задать правило, по которому будет работать Rewrite. 

Есть большой выбор типов Rewrite, которые можно задать в выпадающем меню Type. Например, можно добавить, изменить или удалить Header в Request, изменить Response Code или подменить URL запросов.

Например, вот так будет выглядеть правило для добавления Header в Request:

Proxyman:

  1. Scripting -> Script List (⌥⌘I).

  2. Нажать + в левом нижнем углу и задать правила, по которым будет работать скриптинг.

  3. В поле Name внести название шаблона.

  4. Указать URL, для которого будут работать эти правила.

Всё, после этого можно выбирать и заменять значения Request и Response.

Вот так будет выглядеть скрипт для добавления параметров Header и Query в Request:

В этом раунде для меня однозначно выигрывает Charles. Возможно, потому что я не фанат замороченных настроек и писать срипт для подмены хедера для меня слишком сложно по сравнению с нажатием нескольких кнопок.

Функции снифферов: Map Local

Следующая по порядку, но не менее важная функция — Map Local. С её помощью можно полностью подменить ResponseBody.

Charles:

  1. Запустить приложение, чтобы трафик пошёл через Charles.

  2. Щёлкнуть правой кнопкой по URL, ответ от которого необходимо изменить, и выбрать Map Local.

  3. В окне Edit Mapping нажать на кнопку Choose и выбрать файл, содержимое которого должно отображаться в ответе.

Proxyman:

  1. Tools -> Map Local.

  2. Нажать + в левом нижнем углу и заполнить поля Name (название правила) и URL (адрес, для которого будет выполняться правило).

  3. Нажать Select Local File и выбрать JSON-файл, которым будет подменяться ответ (запрос).

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

Функции снифферов: Breakpoints

Функция Breakpoints предназначена для изменения и прерывания запросов и ответов непосредственно в сниффере.

Charles:

  1. Нажать на кнопку Enable Breakpoints на верхней панели.

  2. Щёлкнуть правой кнопкой по URL, для которого необходимо использовать Breakpoints, и нажать на Breakpoints. 

Также можно задать правила Breakpoints в пункте меню Proxy -> Breakpoints Settings.

После перехода по указанному URL сработает Breakpoints — и запрос с ответом станут редактируемыми; по нажатию на кнопку Abort их можно будет прервать.

Proxyman

  1. Щёлкнуть правой кнопкой по URL, для которого необходимо использовать Breakpoints, и нажать на Breakpoints.

  2. В открывшемся окне можно задать правила, по которым будет работать Breakpoints. 

При желании можно изменить URL, а также использовать Breakpoints для чего-то одного: только для запроса или только для ответа. 

В этом раунде силы снифферов равны.

Функции снифферов: Throttling

Последняя функция из основного незаменимого арсенала снифферов — Throttling.

Charles:

  1. Proxy -> Throttle Settings.

  2. Выбрать опцию Enable Throttling. Если поставить чекбокс Only for selected hosts, кнопка Add станет активной и по нажатию на неё можно будет добавить те URL, для которых сработает изменение скорости интернета.

  3. Скорость интернета, которую будет симулировать Charles, можно выбрать из выпадающего списка или задать в соответствующих полях:

Proxyman

  1. Tools -> Network Conditions.

  2. Выбрать опцию Enable Network Conditions.

  3. По нажатию на + откроется окно, в котором можно настроить правила симуляции скорости интернета.

    В этом раунде соперники равны.

Charles vs Proxyman: выбираем победителя

Мы рассмотрели только четыре функции снифферов — из списка незаменимых. Понятно, что в целом функций гораздо больше (надеюсь когда-нибудь собраться с силами и написать более подробный гайд по Proxyman). 

Как видно из итогов раундов, у каждого сниффера есть свои плюсы и минусы. Мне нравится Charles за удобный интерфейс и более понятную настройку правил (нажал две кнопочки — и готово!), а Proxyman — за более гибкую настройку правил и подключения симуляторов (наверное, именно этим объясняется любовь разработчиков). 

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

Комментарии (26)


  1. Khrum
    23.09.2021 20:22
    +1

    Charles!


  1. GenkaOk
    23.09.2021 20:25

    В своё время пришлось отказаться от Charles в пользу Proxyman, потому что спустя некоторое время Charles требовал оплатить лицензию и не давал просто посмотреть трафик.

    Proxyman же просто ограничивает функционал и продолжает обновляться, причем так неявно, что я до сих пор не понимаю, в чем смысл ограничений. Брейкпоинты работают, прокси IOS работает.


    1. FunnyFox94
      27.09.2021 15:14

      На бесплатной версии ты можешь только:

      • создать 4 breakpoint

      • создать 4 maplocal

      • создать 4 скрипта

      и тд


  1. Danyatuna
    23.09.2021 20:31
    +3

    Спасибо, статья супер!

    Последнюю неделю стал пользоваться proxyman, пока всё нравится, особенно потребление памяти. Чарльз отжирал 1 гб в среднем, а проксимен 200мб

    К некоторым вещам ожидаемо пришлось привыкать, но теперь проксимен кажется даже удобнее


    1. dashakhme Автор
      24.09.2021 11:21

      спасибо за отзыв) да, нужно попользоваться обоими инструментами, чтобы для себя понять какой удобней


  1. JimDi
    23.09.2021 21:25
    +5

    Fiddler


    1. tundrawolf_kiba
      24.09.2021 00:35

      Новая версия Fiddler — Fiddler Everywhere — тоже стала платной, как и инструменты из статьи, последнее время стал посматривать в сторону бесплатной inProxy, но она пока что ещё сильно молодая.


      1. Vest
        24.09.2021 11:04
        +1

        Пока есть бесплатная, то пользуюсь ею. Выручала разными трюками, например, подмена ресурса.

        Самая классная вещь в Фидлере, это посмотреть количество соединений и какие запросы оказываются блокирующими. Например, можно увидеть, что какие-то запросы обслуживаются только одним соединением.


      1. vabka
        24.09.2021 14:17

        Я пользуюсь Mitmproxy — выглядит сыроватым, но по фичам вроде ок — можно фильтровать запросы, менять контент и запроса и ответа.
        Можно на питоне плагины писать, но ещё не пробовал.


  1. amarao
    23.09.2021 21:32
    +8

    Мне как админу, не понятно, почему это "сниффер"? Сниффер - это приложение для подслушивания трафика. То, что вы описываете, это прокси. Сквид умел менять содержимое страниц ещё когда я патч-корды подавал. С тех пор там появилось "всё" про SSL, но суть прокси-то не поменялась...


    1. semenovs
      24.09.2021 01:06
      +1

      Такой сленг почему то. Предлагаю потому что 99% времени их реально используют просто что бы смотреть какие запросы идут между беком и приложением. Изменение запроса это типа для хардкор чуваков :)


    1. catz_a
      24.09.2021 10:14

      Возможно потому, что в эпоху ssl трафика снифером много не подслушаешь и в данном случае границы прокси и снифера размываются. Хотя согласен, что немного притянуто.


      1. amarao
        24.09.2021 22:00
        +1

        Собственно, сквид умел переподписывать SSL с корпоративным сертификатом ещё до того, как я с ним познакомился. И это всё равно proxy. Сниффер не размещает себя между трафиком и пользователем.

        Сниффер (тот же tcpdump) вместе с серверным ключом позволяет дешифровать записанную сессию (в том же wireshark'е).


  1. semenovs
    24.09.2021 01:02

    Это же все очень не удобно. Да и по ресурсам они что то ппц систему грузят. Я обычно беру связки типа MITMProxy и Burp. Хотя если есть тонна времени что бы настраивать правила наверно можно себе позволить


  1. vmityuklyaev
    24.09.2021 10:09

    Наконец-то кто-то сравнил Чарльз и Проксимен, спасибо! Но все равно прокимен остается в сердечке)

    Единственно, что не удобно с проксименом - это ограничение в 4 map local и примерно в 10 url для просмотра трафика (SSL proxying List) для бесплатной лицензии.

    Понятно, чт это лечится банальной покупкой лицензии, но, кажется, в Чарльз этих ограничений нет? Если ошибаюсь - поправьте, пожалуйста)


    1. dashakhme Автор
      24.09.2021 11:16

      спасибо за отзыв)
      да, у Чарльз другие ограничения в работе без лицензии - каждые 30 минут приходится переподключаться


      1. novoselov
        24.09.2021 11:44

        Столкнулся в Charles с проблемой, не всегда работает SSL proxying:

        • есть BlueStacks эмулятор, в него установлен сертификат от Charles

        • в Charles включено SSL проксирование всех запросов (через *)

        • вижу два web socket подключения, одно secure через wss://host и внутри нормально расшифровывается траффик, а второе ws://ip и хотя внешне оно не secure, но похоже трафик внутри зашифрован

        Или Charles неправильно воспринимает второе подключение, или это какая-то специальная защита :)


  1. dimension7
    24.09.2021 22:11

    Статья - огонь! Спасибо, узнал для себя кое что новое и полезное


  1. Prituzhaloff
    25.09.2021 13:54
    +2

    Fiddler classic - полностью бесплатен, функционал тот же, настройка проще. До этого юзал Fiddler Everywhere, вот он вообще максимально был удобным. Жаль, что стал платным. На чарльзе учился, честно пытался привыкнуть к нему, но как то совсем не зашёл, ну лично мне. Еще эти переподключения каждые 30 мин. Из платных для меня топ - Fiddler Everywhere, из бесплатных - Fiddler classic.


  1. droidbishop
    27.09.2021 11:36

    Существенную роль по переходу на Proxyman для меня сыграло то, что он включен в подписку от Setapp.


  1. Crbn
    27.09.2021 11:38

    Charles с Fiddler было бы более удачное сравнение. Так как они чаще всего юзаются именно течтировшиками и просты в использовании. Особенно интересно сравнение rewrite, map local.


  1. cheterz
    27.09.2021 11:38

    разве для андройда 7 и выше не надо модить манифест, чтоб трафик виден был?


    1. vrnvorona
      29.09.2021 11:20

      В дебаг или QA сборках обычно это сделано заранее разработчиками.


  1. FunnyFox94
    27.09.2021 15:23

    У проксимена современный UI. Есть разные фишки, которые облегчат жизнь, например гибко настраиваемая фильтрация с возможностью выделять цветом запросы и писать в них комменты.

    Можно так же группировать запросы по разным цветам. Можно удобно кастомизировать поиск. Например not contains, с помощью этого фильтра вы можете убрать отображение запросов, которые содержат/не содержат искомую инфу для ускорения вашей работы.

    У чарлика 1 релиз за полгода, у проксимена раз в 2 недели и можно ознакомиться с графиком рилизов(когда уже будет винда?)


  1. Tibiamist
    06.10.2021 11:58

    В работе использую Fiddler, судя по комментам выше, про платность двух сниферов, кажется что фидлер это выход)


  1. Secondher0
    06.10.2021 11:58

    Действительно не хватает статейке сравнения с бесплатным Fiddler. Все таки любим халяву)))