как посмотреть какие http(s) запросы и куда делает android-приложение?

powermouse

есть приложение на андроиде, нужно посмотреть куда и какие http(s) запросы оно делает.

carusya

Увы, никогда не слышал о том, что можно дампить сеансовые ключи на андроиде, так что, или искать, как это сделать, или поднимать MitM прокси.
Charles, Fiddler, Mallory Proxy, MITMPROXY, WebScarab, Burp Proxy, Zaproxy - их тысячи.

psm-home

или поднимать MitM прокси
А я правильно понимаю что MITM не прокатит, если разработчики сделали certificate pinning?

powermouse

а как же работают всякие фаерволы? или для андроида не существует фаероволлов?

YUAL

Фаервол очевино работает на несколько уровней ниже - tcp/ip.

powermouse

фаер волл видит только IP адрес?

Marinavo_0507

http://isecpartners.github.io/Introspy-Android/
вот эта штука может? (я не спец, просто набрал поиск в гугле)

Marinavo_0507

Фаервол очевино работает на несколько уровней ниже - tcp/ip.
это устаревшие лет на 15 сведения, сейчас есть отдельная категория ПО - "персональные файрволы"

YUAL

В плане? персональный фаервол просто кроме адреса и порта ориентируется на приложение, которое взаимодействует с сетевым сокетом. Режет оно по-прежнему на уровне пакетов, но не лезет внутрь http запроса и на основании урла решает пускать или не пускать пакет.
Точнее такие штуки тоже конечно есть, но в первый слышу чтобы их кто-то фаерволом называл - обычно прокси.

YUAL

А я правильно понимаю что MITM не прокатит, если разработчики сделали certificate pinning?
в общем случае - да не сработает. а такие параноики правда бывают?

zya369

не лезет внутрь http запроса и на основании урла решает пускать или не пускать пакет.
:facepalm:

YUAL

сможешь расшифровать свой фейспалм?
P.S. Я наверное криво сформулировал. НЕ лезет внутрь http запроса и НЕ решает ничего на основании урла.

nikola1956

есть приложение на андроиде, нужно посмотреть куда и какие http(s) запросы оно делает.

Если исходного кода нет, как посмотреть? Запросы ведь шифруются при использовании https.
Если же это нужно сделать с т.з. хакера, то стяните apk с устройства (это всегда можно сделать) и декомпилируйте код, в надежде, что он не обфусцирован. Дальше ищите запросы в Java-коде.

Temach

Если исходного кода нет, как посмотреть? Запросы ведь шифруются при использовании https.
вышеж написали как - прокси. только использование своего прокси вызовет ошибку сертификата даже в браузере Chrome в стиле "ваше соединение не защищено". Как в такой ситуации внедрить свой сертификат в хранилище андроида?

YUAL

Как в такой ситуации внедрить свой сертификат в хранилище андроида?
Ты не поверишь, но в настройках есть тычка Security -> Install from SD card. Жмёшь и ставишь сертификат.

nikola1956

 
вышеж написали как - прокси. только использование своего прокси вызовет ошибку сертификата даже в браузере Chrome в стиле "ваше соединение не защищено". Как в такой ситуации внедрить свой сертификат в хранилище андроида?
  

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

Dasar

В системных настройках указать, чтобы все запросы шли через прокси.
Прокси - своё внешнее устройство, которое перехватывает создание https-соединения к домену A. Инициирует запрос от своего имени к домену A, ответ подписывает своим сертификатом для домена A и отдаёт андроиду.
В андроид добавляется сертификат, который говорит что стоит доверять сертификату, который был сгенерен для домена A.

powermouse

я тоже пока не очень понял что они предлагают.
видимо установить эмулятор андроида BlueStack и сделать так чтоб весь трафик из эмулятора шёл через наш прокси, который будет переподписывать HTTPS своим сертификатом, который надо будет установить в корень хранилища bluestack. Ну а наш прокси уже будет просто весь трафик писать на диск в файл.
я прав?

nikola1956

С эмулятором не считается. В приложениях часто запрещена установка на рутованные устройства и на эмуляторы. То есть apk-то вы стянете с нормального Android-устройства, но установить его на эмулятор не сможете.
Но это не значит, что решение задачи в случае эмулятора найдено, по крайней мере я не понял пока, что имеется в виду.

zya369

зачем эмулятор-то? просто wi-fi роутер + комп

Dasar

видимо установить эмулятор андроида BlueStack
Эмулятор не нужен. Достаточно в настройках wifi-соединения указать в качестве прокси свою программу. Которая и будет выполнять перехват https-соединений и подписывать ответы своими сгенеренными сертификатами.

nikola1956

В системных настройках указать, чтобы все запросы шли через прокси.
Прокси - своё внешнее устройство, которое перехватывает создание соединения к домену A. Инициирует запрос от своего имени к домену A, ответ подписывает своим сертификатом для домена A и отдаёт андроиду.
В андроид добавляется сертификат, который говорит что стоит доверять сертификату, который был сгенерен для домена A.

Вы уже пробовали так делать? Получилось?

nikola1956

 
Эмулятор не нужен. Достаточно в настройках wifi-соединения указать в качестве прокси свою программу. Которая и будет выполнять перехват https-соединений и подписывать ответы своими сгенеренными сертификатами.

Теперь идея стала вроде бы понятнее. Спасибо, что разъяснили! Дело в том, что мобильные приложения (особенно имеющие отношение к финансовой сфере) часто имеют свои собственные сертификаты, которым их сервер только и доверяет.
Получается, что такой подход к перехвату запросов не проходит.

Dasar

Вы уже пробовали так делать? Получилось?
"Один мой знакомый" пробовал. Получилось.

nikola1956

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

yroslavasako

В приложениях часто запрещена установка на рутованные устройства и на эмуляторы.
А как это достигается?

nikola1956

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

powermouse

Достаточно в настройках wifi-соединения указать в качестве прокси свою программу.
скинь скриншот плз. не могу понять где эта тычка находится в 4м андроиде.

Dasar

> скинь скриншот плз. не могу понять где эта тычка находится в 4м андроиде.
Так находится?
1.Connect to WIFI network (e.g. 'Alex')
2.Settings->WIFI
3.Long tap on connected network's name (e.g. on 'Alex')
4.Modify network config-> Show advanced options
5.Set proxy settings
http://stackoverflow.com/questions/21068905/how-to-change-pr...

YUAL

Вы уже пробовали так делать? Получилось?
Ну я делал mitm на наше же мобильное приложение. Без пининга серверных сертификатов и проверки клиенсткого.
Теперь идея стала вроде бы понятнее. Спасибо, что разъяснили! Дело в том, что мобильные приложения (особенно имеющие отношение к финансовой сфере) часто имеют свои собственные сертификаты, которым их сервер только и доверяет.
У меня вызывают недоверие рассказ о том "часто делают проверку клиентских сертификатов" от человека который только что расспрашивал работает ли mitm.
+ у меня вообще вызывает недоверие рассказ о том что кто-то часто делает проверку клиентских сертификатов или пининг серверных. обычно я наблюдаю что все кладут хуй на безопасность. в том числе и банки. интернет банк альфы много лет сидел на сертификате первого класса валидации, авангард хранит пароли пользователей в открытом виде. на фоне этого рассказы про "часто заморачиваются на секурность" звучат странно.

nikola1956

Мне просто сразу не было понятно, какой именно способ перехвата траффика имеется в виду. Атака "человек посередине" конечно мне известна. Но, думал, может быть умные разработчики с форума имеют в виду что-то необычное. Поэтому дотошно расспрашивал.
А сертификат, помню, собственноручно подключал к одному своему мобильному приложению, защитив этот сертификат паролем (использовал Bouncy Castle чтобы обеспечить безопасность обмена данными между клиентом и сервером.
В общем, с самого начала было понятно, что желаемое автором темы в общем случае невозможно. Иначе безопасность системы Android была бы под большим вопросом. Поэтому и предложил декомпилировать апк, чтобы посмотреть Java-код с запросами, если он не был обфусцирован.
P.S. Вот, для интересующихся нашел краткий обзор этой проблемы безопасности мобильных приложений. Текст суммирует то, что мы здесь обсудили:
----------------------------------------------------------------------------------
... Relying on matching certificates between the device's trust store and the remote server opens up a security hole. The device’s trust store can easily be compromised - the user can install unsafe certificates, thus allowing potential man-in-the-middle attacks.
Certificate pinning is the solution to this problem. It means hard-coding the certificate known to be used by the server in the mobile application. The app can then ignore the device’s trust store and rely on its own, and allow only SSL connections to hosts signed with certificates stored inside the application.
This also gives a possibility of trusting a host with a self-signed certificate without the need to install additional certificates on the device.
BENEFITS
Increased security - with pinned SSL certificates, the app is independent of the device’s trust store. Compromising the hard coded trust store in the app is not so easy - the app would need to be decompiled, changed and then recompiled again - and it can’t be signed using the same Android keystore that the original developer of the app used.
Reduced costs - SSL certificate pinning gives you the possibility to use a self-signed certificate that can be trusted. For example, you’re developing an app that uses your own API server. You can reduce the costs by using a self-signed certificate on your server (and pinning that certificate in your app) instead of paying for a certificate. Although a bit convoluted, this way, you've actually improved security and saved yourself some money...
http://www.infinum.co/the-capsized-eight/articles/securing-...
---------------------------------------------------------------------------------

YUAL

Никогда не разбирался в дампе памяти андройдного приложения, но разве вытащить оттуда клиентский сертификат это не дело 10 минут?
Пининг серверных сертификатов тоже говорят обходится на раз. Даже специальные приложения для этого есть. Механизм этого обхода я правда не разбирал - с увернностью утверждать не могу.

Обход SSL Pinning
SSL Pinning можно обойти/отключить, если на мобильном устройстве присутствует jailbreak или root-доступ. Как правило, это нужно только исследователям для анализа сетевого трафика. Для отключения на Android есть программа Android SSL Bypass, для iOS – программы iOS SSL Kill Switch и TrustMe.
По идее, эти же подходы могут использовать и вредоносные программы.

Fimida

Спасибо за вопрос.

nikola1956

 
SSL Pinning можно обойти/отключить, если на мобильном устройстве присутствует jailbreak или root-доступ. Как правило, это нужно только исследователям для анализа сетевого трафика. Для отключения на Android есть программа Android SSL Bypass, для iOS – программы iOS SSL Kill Switch и TrustMe.
По идее, эти же подходы могут использовать и вредоносные программы.
  

Нет-нет, так не получится. Проверка на рутованность конечно должна делаться для мобильных приложений, которые отвечают нормальным требованиям безопасности, ибо рут разрушает всю систему безопасности данных в Android (при руте пришлось бы шифровать базу данных мобильного приложения, а это часто тормозит GUI). Запрет на установку приложений на рутованные устройства — один из важных аспектов защиты пользовательских данных. Написал выше уже по этой теме...
 
Никогда не разбирался в дампе памяти андройдного приложения, но разве вытащить оттуда клиентский сертификат это не дело 10 минут?

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

Plok2008

Проверка на рутованность конечно должна делаться для мобильных приложений, которые отвечают нормальным требованиям безопасности
Да вы ошалели там что ли? У меня стоит CyanogenMod nigthy-builds. Он изначально рутованый. Да и вообще - мой телефон, что хочу, то и ставлю, куда хочу, туда и могу через su зайти и посмотреть/отредактировать.
Что значит шифрование тормозит GUI? Пишите нормальные приложения, которые не будут тормозить.
А то это очень сходно, что мол мне твоя стрижка не нравится, поэтому я тебе не буду предоставлять сервис.

Temach

Поэтому и предложил декомпилировать апк, чтобы посмотреть Java-код с запросами, если он не был обфусцирован.
даже если код не обфусцирован сидеть и разбираться какие параметры в какой запрос передаются может занять долгие часы. если авторы проги не заморачивались с паролями на сертификаты и всё такое (а я уверен, 50% приложений не заморачивались) то достаточно просто прокси.

YUAL

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

Temach

я вообще впервые слышу чтоб какое то приложение не работало на рутованном устройстве

powermouse

Ну я делал mitm на наше же мобильное приложение. Без пининга серверных сертификатов и проверки клиенсткого.
какое ПО заюзать в качестве прокси удобнее всего под винду? расскажи вкратце что и как

nikola1956

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

Бывают еще корпоративные мобильные приложения с высокими требованиями к безопасности. Устройства нередко закупаются оптом под само приложение. Запрет на рут в них оправдан.

pitrik2

Так точно. Например Good. В инете полно инструкций как его обмануть что как будто нету рута. А новые версии выходят и эти инструкции не работают больше.

Plok2008

Ну про корпоративные системы допустим мы сейчас не говорим. Вполне возможно, что там оно может даже и оправдано, когда у производителя закупается партия залоченых устройств, и приложение устанавливается только на них.
Но мы же сейчас по-умолчанию говорим про массового пользователя и публичные приложения и сервисы.
Так что полагаться на безопасность незашифрованной базы данных на мобиле, даже если вы каким-то образом определили, что ROM стоит нетронутый от производителя и нерутованный, всё-равно глупо. Всегда же есть custom-recovery или вообще fastboot из которого можно получить доступ ко всему содержимому sd-кард смартфона. Это, конечно, когда речь идёт о ситуации, когда владелец смартфона хочет как-то вмешаться в работу вашей программы.
Если же речь о каких-то посторонних запущенных на телефоне программах, которые могут вмешиваться в его работу, то как правильно было уже замечено, то рут можно и отключить для программ, ну и если что-то в данный момент использует рут, то на присутствует дополнительная иконка и напоминание. Так что продвинутый пользователь, который имеет рут на телефоне всегда может обратить на это внимание и отреагировать.
В общем, действительно, когда вы запрещаете работу приложения на рутованой системе, вы в первую очередь создаёте проблемы продвинутым пользователям. По мне так, нужно немного иначе подходить к решению исходной задачи.

yroslavasako

Бывают еще корпоративные мобильные приложения с высокими требованиями к безопасности. Устройства нередко закупаются оптом под само приложение. Запрет на рут в них оправдан.
каким образом? Если ты не шифруешь данных - просто расковыряют карту памяти (или микруху) и снимут данные с неё напрямую. И не важно, есть рут или нет, когда есть физический доступ.

nikola1956


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

Можно шифровать все устройство на этот случай. Но оно должно быть нерутовано.

nikola1956

Так что полагаться на безопасность незашифрованной базы данных на мобиле, даже если вы каким-то образом определили, что ROM стоит нетронутый от производителя и нерутованный, всё-равно глупо. Всегда же есть custom-recovery или вообще fastboot из которого можно получить доступ ко всему содержимому sd-кард смартфона. Это, конечно, когда речь идёт о ситуации, когда владелец смартфона хочет как-то вмешаться в работу вашей программы.

Возможно, ты оговорился, когда писал про sdcard. Опять же говорю, универсальная таблетка против всего это —шифрование самого Андроид-устройства, но оно должно быть нерутовано.

nikola1956

 
Так точно. Например Good. В инете полно инструкций как его обмануть что как будто нету рута. А новые версии выходят и эти инструкции не работают больше.

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

marat7256

Товарищи, форумчане, вам бы только показать себя умными, а в теме часто не очень разбираетесь. Думаю, нам нужно быть смиреннее, чтобы стать лучше...
ТЫ нас раскусил! :crazy:

YUAL

под винду
вообще без понятия. я использовал mitmproxy - оно вроде и под винду есть потому что на питоне.

yroslavasako

Можно шифровать все устройство на этот случай. Но оно должно быть нерутовано.
Почему должно быть не рутовано? Ты совсем недавно говорил, что нерутованность позволяет избегать шифрования. Теперь утверждаешь, что шифрование всё равно нужно. Можешь привести какой-нибудь другой аргумент против рутованности?

nikola1956

Шифрование базы данных приложения и шифрование устройства — это разные вещи.
Шифрование базы данных обеспечивает абсолютную защиту данных даже на рутованных устройствах, поэтому даже запрещено в нек. странах. Но для больших баз данных слишком тяжеловесно и тормозит GUI как ни извернись.
Шифрование Андроид-устройства — это фишка операционной системы Андроид (в iOS тоже есть одна из составных частей системы безопасности этой операционной системы. Работает только на нерутованных устройствах, ибо рут ломает всю прекрасную систему безопасности, изобретённую Гуглом. В Гугл, если не путаю, часто об этом напоминают пользователям, предостерегая их от рута.

Koresh40

У меня вызывают недоверие рассказ о том "часто делают проверку клиентских сертификатов" от человека который только что расспрашивал работает ли mitm.
+ у меня вообще вызывает недоверие рассказ о том что кто-то часто делает проверку клиентских сертификатов или пининг серверных. обычно я наблюдаю что все кладут хуй на безопасность. в том числе и банки. интернет банк альфы много лет сидел на сертификате первого класса валидации, авангард хранит пароли пользователей в открытом виде. на фоне этого рассказы про "часто заморачиваются на секурность" звучат странно.
А от человека, который занимается реверсингом мобильных приложений доверие будет?) Дейтсвительно любая нормальная программа имеет защиту сертификатов. Наиболее часто встречающийся способ - хэширование данных сертификатов и хранение этих хэшей внутри программы. Обновился сертификат - выпускают новую версию мобильного приложения.
Charles+патч приложения на рутованном устройстве позволяет обходить любые защиты. Дальше, если нужен перехват веб-сокетов и прочих сетевых соединений берем frida и пишем перехват записи/чтения, системные вызовы read/write.
В чем вообще задача? Что ковыряет топикстартер?

yroslavasako

Что за бред. Чем одно шифрование отличается от другого?

YUAL

Шифрование Андроид-устройства — это фишка операционной системы Андроид (в iOS тоже есть одна из составных частей системы безопасности этой операционной системы. Работает только на нерутованных устройствах, ибо рут ломает всю прекрасную систему безопасности, изобретённую Гуглом.
Чё? Шифрование устройства в андроиде это по сути аналог шифрование "хомяка" в линупсе. Причём здесь наличия возможности приложению по запросу повысить привилегии до рута?

uncle17

андройде
Блядь!
МГУ нахуй ебанарот кожаный мяч...

YUAL

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

YUAL

у тебя поисковые запросы на все самые популярные орфографические ошибки на форуме? минута прошла и ты уже тут как тут.

Koresh40

а на сколько часто встречаются "нормальные программы"?
Ну ковырять приложение Альфа-Банка, которое вы упомянули мне не так интересно. Хотя приложение ТКС-банка не функционирует с включенным сниффером, значит тоже содержит проверки. Я исследовал текстовые мессенджеры (типа WhatsApp, Viber, Skype особенно те, которые кулаком в грудь били на счет их безопасности, а также различные игры. Первые борятся с перехватом траффика, вторые - с читерами. Везде где есть заявка на секьюрность, везде есть проверка сертификатов. Это как красная тряпка для быка - заявить, что приложение безопасно. На него сразу набросятся исследователи и докажут обратное, как и было с тем же WhatsApp. Безопасность в приложениях сама не появляется, тут вы правы. Ее добавляют те, кто указывают на ошибки, после чего выходят версии с исправлением (Telegram изначально был с криптографией, но до серии исправлений не был действительно безопасным клиентом). Однако если Viber использует AES в качестве симметричного шифра, WhatsApp так и остался на RC4, который как известно любителям халявного WiFi прекрасно ломается, даже с учетом PBKDF схемы. Это однако сильно далеко уводит нас от темы. Если автор готов назвать приложение, которое он хочет исследовать, я готов ему дать логи сниффера и даже помочь с патчем.

carusya

Если автор готов назвать приложение, которое он хочет исследовать, я готов ему дать логи сниффера и даже помочь с патчем.
А много вообще в андроиде библиотек, реализующих SSL/TLS? Нет ли пути просто через них сдампить сеансовые ключи?

Koresh40

просто через них сдампить сеансовые ключ
SSL может быть реализован в том числе и в Java коде. А библиотеки - практически любые Си++, в их числе, конечно же, сам OpenSSL.
Проще всегда смотреть конкретную цель, а не пытаться решить более общую задачу.

powermouse

Если автор готов назвать приложение, которое он хочет исследовать, я готов ему дать логи сниффера и даже помочь с патчем.
софтинку от Yota

carusya

приложение для заказа симок штоле?

powermouse

Да

carusya

А какая инфа интересует?

powermouse

Все http(s) запросы которые оно делает

powermouse

метода неплохая - опробовал работает. а как это всё замутить без WiFi? мне надо смотреть запросы именно которые пойдут через интернет на телефоне так как при подключении по wifi идут совсем другие запросы.

Koresh40

Вот тут уже jailbreak/root + frida.

Koresh40

Инструкция для айфона по установке фриды:
качаем jailbreak под нужную версию iOS, настраиваем SSH (нужен только в те плохие моменты, когда frida-server падает и надо выполнять #frida-server &) и в Cydia.app ставим приложение frida с ресурса frida.re.
Далее цепляем тушку кабелем к PC/Mac/Linux, где уже должна быть установлена клиентская часть фриды. Для счастливых обладателей UNIX ОС просто делаем npm install frida, если вы JS-ник, или sudo easy_install --upgrade frida для любителей или не очень python'а (на самом деле знаний питона не потребуется).
Далее запускаем трассировщик
frida-trace -U -m '-[YTSHTTPRequestOperationManager *]' -f ru.yota.selfcare
Фрида красиво раскладывает вызовы с учетом иерархии вызовов классов и создает обработчики objective c методов в каталоге __handlers__
 
           /* TID 0x907 */
765 ms -[YTSClient initWithBaseURL:0x1742cd900 ]
781 ms -[YTSChatApi init]
783 ms | -[YTSChatApi setChatHostReachabilityManager:0x17024ecd0 ]
786 ms -[YTSChatApi setIdentityStorage:0x17420ddc0 ]
787 ms -[YTSChatApi setRetentionSession:0x1702a0a80 ]
846 ms -[YTSClient api_config]
847 ms | -[YTSHTTPRequestOperationManager rac_cachedMETHOD:0x1006de970 url:0x1006df0d0 parameters:0x0 resultClass:0x100847a10 resultKeyPath:0x0 alertOnError:0x0 ]
847 ms | | -[YTSHTTPRequestOperationManager rac_METHOD:0x1006de970 url:0x1006df0d0 parameters:0x0 resultClass:0x100847a10 resultKeyPath:0x0 ]
848 ms | | | -[YTSHTTPRequestOperationManager rac_METHOD:0x1006de970 url:0x1006df0d0 parameters:0x0 resultClass:0x100847a10 resultKeyPath:0x0 headers:0x0 requestSerializer:0x43f0000000000000 timeout:0x0 ]
849 ms -[YTSChatApi getChatConfig]

Стопим это дело с помощью Ctrl+C и смотрим в каталог __handlers__:
 
ls __handlers__
__YTSChatApi_chatHistoryForCusto_33045b0e.js __YTSChatApi_userId_.js __YTSClient_api_points__.js
__YTSChatApi_chatHostReachabilityManager_.js __YTSClient_api_availablePhoneNu_-13e4ccec.js __YTSClient_api_salesContext__.js
__YTSChatApi_chatStartTypingForS_-6782b08d.js __YTSClient_api_cachedCustomerOffers_.js __YTSClient_api_salesOrder_type__-1c304255.js
__YTSChatApi_chatStopTypingForSessionId__.js __YTSClient_api_changeCurrentToN_35c305d3.js __YTSClient_api_salesPickupPoints__.js
__YTSChatApi_connectCometClient__-34f48522.js __YTSClient_api_cities_.js __YTSClient_api_salesPreorder_de_-4adbe99f.js
__YTSChatApi_createSubscriptionW_-48b94bf9.js __YTSClient_api_cityForLatitude__-41a260d5.js __YTSClient_api_salesUpdatePushT_2e72b707.js
__YTSChatApi_getChatConfig_.js __YTSClient_api_city__.js __YTSClient_api_updateCustomerPa_6ef0325d.js
__YTSChatApi_identityStorage_.js __YTSClient_api_config_.js __YTSClient_getCityNameByLocation__.js
__YTSChatApi_init_.js __YTSClient_api_customerAdviceOf_35d6520b.js __YTSClient_getObjectsByQuery_in_-599d4ce6.js
__YTSChatApi_isRealCustomer_.js __YTSClient_api_customerBalance_.js __YTSClient_getRouteToDestinatio_-7d086bfa.js
__YTSChatApi_ixnChatWithSessionI_29bb92ce.js __YTSClient_api_customerCampaignOffers_.js __YTSClient_initWithBaseURL__.js
__YTSChatApi_rac_METHOD_url_para_43fc53d6.js __YTSClient_api_customerContext_.js __YTSHTTPRequestOperationManager_-362b3703.js
__YTSChatApi_rac_chatHostReachab_-2cb0111a.js __YTSClient_api_customerOffers__.js __YTSHTTPRequestOperationManager_-3fa6df7c.js
__YTSChatApi_refreshSessionId__.js __YTSClient_api_customerOptionOf_-5142450d.js __YTSHTTPRequestOperationManager_-4e6c8cad.js
__YTSChatApi_requestChatWithSubs_67e12d0a.js __YTSClient_api_customerPaymentCards_.js __YTSHTTPRequestOperationManager_-546320f0.js
__YTSChatApi_retentionSession_.js __YTSClient_api_customerPayment_amount__.js __YTSHTTPRequestOperationManager_-6011e1b8.js
__YTSChatApi_secureToken_.js __YTSClient_api_customerProducts_.js __YTSHTTPRequestOperationManager_-6ac439b9.js
__YTSChatApi_sendMessageWithSess_-16cc3e0b.js __YTSClient_api_customerSendAppInfo__.js __YTSHTTPRequestOperationManager_-78e9e6b3.js
__YTSChatApi_setChatHostReachabi_-395bd296.js __YTSClient_api_customerSetOptio_-44c03a3e.js __YTSHTTPRequestOperationManager_05474310.js
__YTSChatApi_setIdentityStorage__.js __YTSClient_api_customerSetProdu_-4dca7e43.js __YTSHTTPRequestOperationManager_0f09720e.js
__YTSChatApi_setIsRealCustomer__.js __YTSClient_api_deleteCustomerPa_-1afead98.js __YTSHTTPRequestOperationManager_7ef7b599.js
__YTSChatApi_setRac_chatHostReac_3eb90eed.js __YTSClient_api_generalOffersFor_-3416df57.js __YTSHTTPRequestOperationManager_cache_.js
__YTSChatApi_setRetentionSession__.js __YTSClient_api_payUrlForAmount__-5c2dd200.js

Нам все это ковырять не так интересно, зайдем только в __YTSHTTPRequestOperationManager_-XXX.js на примере __YTSHTTPRequestOperationManager_-362b3703.js:
 
    onEnter(log, args, state) {
log("-[YTSHTTPRequestOperationManager rac_GET:" + args[2] + " parameters:" + args[3] + " resultClass:" + args[4] + " resultKeyPath:" + args[5] + " ]");
},

JavaScript и никакой магии! Помогаем фриде расковырять весь этот шлак (уже другой файл, нам нужен метод rac_METHOD, но если посмотреть на лог, можно убедиться в том, что только селектор rac_METHOD:url:parameters:resultClass:resultKeyPath:headers:requestSerializer:timeout: делает всю работу, остальное это перегруженные селекторы, чтобы отключить часть параметров):
 
    onEnter(log, args, state) {
var data = new ObjC.Object(args[2]);
var METHOD = data.UTF8String;
log("-[YTSHTTPRequestOperationManager rac_METHOD:" + METHOD + " url:" + args[3] + " parameters:" + args[4] + " resultClass:" + args[5] + " resultKeyPath:" + args[6] + " headers:" + args[7] + " ]");
},

Уже лучше!
 
  1555 ms     |    | -[YTSHTTPRequestOperationManager rac_METHOD:GET url:0x10074b150 parameters:0x174447b00 resultClass:0x1008b4eb0 resultKeyPath:0x0 ]
1557 ms | | | -[YTSHTTPRequestOperationManager rac_METHOD:GET url:0x10074b150 parameters:0x174447b00 resultClass:0x1008b4eb0 resultKeyPath:0x0 headers:0x0 requestSerializer:0x43f0000000000000 timeout:0x0 ]

Теперь доделаем парсер (vim __handlers__/__YTSHTTPRequestOperationManager_0f09720e.js):
 
    onEnter(log, args, state) {
//
// method
//
var method = new ObjC.Object(args[2]); //создаем Objective C объект для JavaScript
var METHOD = method.UTF8String; // поскольку объект имеет тип NSString, есть метод UTF8String
//
// url
//
var url = new ObjC.Object(args[3]);
var URL = url.UTF8String;
//
// parameters (словарь NSDictionary)
//
if (parseInt(args[4]) > 0) // если параметр не равен 0x0 - передан словарь
var dict = new ObjC.Object(args[4]);
var params = '';
// get keys
if (dict) {
var NSArray_keys = dict.allKeys; // дергаем все ключи
// enumerate them
var count = NSArray_keys.count; // сколько их там?
for (var i = 0; i < count; ++i) {
var keyName = NSArray_keys.objectAtIndex_(i); // внимательный задрот objective c обратит внимание на подчеркивание в конце - это мы так обозначаем каждый знак ':' в имени селектора
var key = keyName.UTF8String;
var valueString = dict.valueForKey_(keyName); // дергаем значение параметра из словаря
var value = valueString.UTF8String;
params += key + '=' + value + '&';
}
params = params.slice(0, -1); // cut last '&'
}
//
// class name
//
var nsStr = new ObjC.Object(args[5]);
var className = nsStr.$className; // красивый метод фриды для получения имени класса
log("-[YTSHTTPRequestOperationManager rac_METHOD:" + METHOD + " url:" + URL + " parameters:" + params + " resultClass:" + className + " resultKeyPath:" + args[6] + " headers:" + args[7] + " requestSerializer:" + args[8] + " timeout:" + args[9] + " ]");
},

И стало совсем хорошо (параметры, позволяющие меня деанонимизировать затерты):
 
           /* TID 0x907 */
430 ms -[YTSClient initWithBaseURL:0x1742c57f0 ]
443 ms -[YTSChatApi init]
444 ms | -[YTSChatApi setChatHostReachabilityManager:0x17424bbb0 ]
446 ms -[YTSChatApi setIdentityStorage:0x174209b30 ]
446 ms -[YTSChatApi setRetentionSession:0x1742bcbc0 ]
492 ms -[YTSClient api_config]
492 ms | -[YTSHTTPRequestOperationManager rac_cachedMETHOD:0x10071e970 url:0x10071f0d0 parameters:0x0 resultClass:0x100887a10 resultKeyPath:0x0 alertOnError:0x0 ]
493 ms | | -[YTSHTTPRequestOperationManager rac_METHOD:GET url:0x10071f0d0 parameters:0x0 resultClass:0x100887a10 resultKeyPath:0x0 ]
517 ms | | | -[YTSHTTPRequestOperationManager rac_METHOD:GET url:general/config parameters: resultClass:YTSConfigResponse resultKeyPath:0x0 headers:0x0 requestSerializer:0x43f0000000000000 timeout:0x0 ]
522 ms -[YTSChatApi getChatConfig]
522 ms | -[YTSHTTPRequestOperationManager rac_cachedMETHOD:0x10071e970 url:0x100724290 parameters:0x0 resultClass:0x10088bac0 resultKeyPath:0x0 alertOnError:0x0 ]
523 ms | | -[YTSHTTPRequestOperationManager rac_METHOD:GET url:0x100724290 parameters:0x0 resultClass:0x10088bac0 resultKeyPath:0x0 ]
524 ms | | | -[YTSChatApi rac_METHOD:0x10071e970 url:0x100724290 parameters:0x0 resultClass:0x10088bac0 resultKeyPath:0x0 headers:0x0 requestSerializer:0x43f0000000000000 timeout:0x0 ]
525 ms | | | | -[YTSChatApi secureToken]
525 ms | | | | | -[YTSChatApi isRealCustomer]
526 ms | | | | -[YTSHTTPRequestOperationManager rac_METHOD:GET url:service/yotaChatConfig parameters: resultClass:YTSYotaChatConfig resultKeyPath:0x0 headers:0x0 requestSerializer:0x43f0000000000000 timeout:0x0 ]
530 ms -[YTSHTTPRequestOperationManager HTTPRequestOperationWithRequest:0x17420aaa0 resultClass:0x100887a10 success:0x17425ce60 failure:0x17425ce90 ]
532 ms -[YTSHTTPRequestOperationManager HTTPRequestOperationWithRequest:0x17420aa60 resultClass:0x10088bac0 success:0x170250d40 failure:0x170250d70 ]
533 ms -[YTSHTTPRequestOperationManager rac_reachabilitySignal]
533 ms | -[YTSHTTPRequestOperationManager reachabilitySignalWithManager:0x17424a080 ]
676 ms -[YTSHTTPRequestOperationManager cache]
709 ms -[YTSHTTPRequestOperationManager cache]
721 ms -[YTSClient api_customerContext]
721 ms | -[YTSHTTPRequestOperationManager rac_cachedMETHOD:0x10071e970 url:0x10071e990 parameters:0x0 resultClass:0x10088b688 resultKeyPath:0x0 alertOnError:0x0 ]
721 ms | | -[YTSHTTPRequestOperationManager rac_METHOD:GET url:0x10071e990 parameters:0x0 resultClass:0x10088b688 resultKeyPath:0x0 ]
722 ms | | | -[YTSHTTPRequestOperationManager rac_METHOD:GET url:customer/context parameters: resultClass:YTSCustomerContext resultKeyPath:0x0 headers:0x0 requestSerializer:0x43f0000000000000 timeout:0x0 ]
725 ms -[YTSHTTPRequestOperationManager HTTPRequestOperationWithRequest:0x17420a6e0 resultClass:0x10088b688 success:0x174243180 failure:0x174242f40 ]
764 ms -[YTSHTTPRequestOperationManager cache]
773 ms -[YTSHTTPRequestOperationManager cache]
790 ms -[YTSChatApi init]
790 ms | -[YTSChatApi setChatHostReachabilityManager:0x170247c80 ]
791 ms -[YTSChatApi setIdentityStorage:0x174209b30 ]
791 ms -[YTSChatApi setRetentionSession:0x1742bcbc0 ]
792 ms -[YTSChatApi setIsRealCustomer:0x0 ]
815 ms -[YTSClient api_salesContext:0x174c7e800 ]
816 ms | -[YTSHTTPRequestOperationManager rac_cachedMETHOD:0x10071e970 url:0x10071ee10 parameters:0x174e7c5c0 resultClass:0x100887f88 resultKeyPath:0x0 alertOnError:0x0 ]
816 ms | | -[YTSHTTPRequestOperationManager rac_METHOD:GET url:0x10071ee10 parameters:0x174e7c5c0 resultClass:0x100887f88 resultKeyPath:0x0 ]
817 ms | | | -[YTSHTTPRequestOperationManager rac_METHOD:GET url:sales/context parameters:id=бла-бла-бла-бла-бла resultClass:YTSSalesContext resultKeyPath:0x0 headers:0x0 requestSerializer:0x43f0000000000000 timeout:0x0 ]
827 ms -[YTSHTTPRequestOperationManager HTTPRequestOperationWithRequest:0x17420a680 resultClass:0x100887f88 success:0x17424c5a0 failure:0x17424c9c0 ]
1393 ms -[YTSHTTPRequestOperationManager cache]
1446 ms -[YTSClient api_generalOffersForSimType:0x10071acf0 city:0x170623ac0 offerCodes:0x0 ]
1447 ms | -[YTSHTTPRequestOperationManager rac_cachedMETHOD:0x10071e970 url:0x10071f150 parameters:0x174443a20 resultClass:0x100888eb0 resultKeyPath:0x0 alertOnError:0x0 ]
1447 ms | | -[YTSHTTPRequestOperationManager rac_METHOD:GET url:0x10071f150 parameters:0x174443a20 resultClass:0x100888eb0 resultKeyPath:0x0 ]
1448 ms | | | -[YTSHTTPRequestOperationManager rac_METHOD:GET url:general/offers parameters:simType=voice&cityCode=C_77 resultClass:YTSProductOffering resultKeyPath:0x0 headers:0x0 requestSerializer:0x43f0000000000000 timeout:0x0 ]
1474 ms -[YTSClient api_generalOffersForSimType:0x10071ad10 city:0x170623ac0 offerCodes:0x0 ]
1475 ms | -[YTSHTTPRequestOperationManager rac_cachedMETHOD:0x10071e970 url:0x10071f150 parameters:0x170443a80 resultClass:0x100888eb0 resultKeyPath:0x0 alertOnError:0x0 ]
1475 ms | | -[YTSHTTPRequestOperationManager rac_METHOD:GET url:0x10071f150 parameters:0x170443a80 resultClass:0x100888eb0 resultKeyPath:0x0 ]
1476 ms | | | -[YTSHTTPRequestOperationManager rac_METHOD:GET url:general/offers parameters:simType=tablet&cityCode=C_77 resultClass:YTSProductOffering resultKeyPath:0x0 headers:0x0 requestSerializer:0x43f0000000000000 timeout:0x0 ]
1490 ms -[YTSHTTPRequestOperationManager HTTPRequestOperationWithRequest:0x17420abb0 resultClass:0x100888eb0 success:0x17424bd00 failure:0x17425bc90 ]
1492 ms -[YTSHTTPRequestOperationManager HTTPRequestOperationWithRequest:0x17420cf60 resultClass:0x100888eb0 success:0x17424c450 failure:0x174245730 ]

Для rac_cachedMETHOD делается аналогично. Для Android курите Java и управление ей через frida на сайте самой фриды.
 
  • Откуда я узнал про 'ru.yota.selfcare' (чтобы не цепляться атачем к запущенному приложению, а запускать его фридой, которая сможет перехватить все что происходит с момента запуска)? Посмотрел Info.plist в ipa архиве приложения.
  • Как я узнал про класс YTSHTTPRequestOperationManager? Посмотрел в дизассемблере расшифрованный дамп. Гугл dumpdecrypted.dylib.

Вот кое-что еще из дизассемблера:
Получение списка доступных номеров
GET запрос (что такое MSISDN - смотрите википедию):
resources/msisdns
Возможные параметры (маска, если нужна):
pattern=<тут маска, формат макси - понятия не имею, лень было копать>
Смена номера
GET запрос на смену номера:
resources/msisdn
С параметром:
msisdn=<здесь новый номер без угловых скобок>
Оставить комментарий
Имя или ник:
Комментарий: