- The Android Emulator and Charles Proxy: A Love Story
- Setup
- “Android
- Urls instead of IP Addresses***
- ***UPDATE:
- twaddington / charles-proxy-android.md
- Анализ трафика приложений на Android Emulator. Причем здесь Root?
- Установка Android Emulator
- Установка сертификата для proxy-sniffer
- Проверяем, все ли ок
- Я есть root
- Делаем сертификат доверенным
- SSL-Unpinning
The Android Emulator and Charles Proxy: A Love Story
Oct 20, 2017 · 6 min read
Android Emulators have come a long way over the years. Once they were the bane of every developer’s life, representing the most basic failure of the Android development environment; a painfully slow tool that had the maddeningly unrealized potential to make developer lives infinitely easier. But over the last couple years, Google has wised-up and made the emulator one of the best things about developing for Android — a fast, fluid, and endlessly useful tool for exercising and debugging apps.
The Android Emulator can also be made into a super-tool for testing API edge and failure cases by employing an http proxy — a go between that can intercept, display and even re-map your API calls. My personal choice for this job is Charles Proxy. It has slick interface, easy to use mapping options and great support, with new releases being published all the time. Today I’ll show you how to set up your Emulator to proxy calls, and later, what you can do with it.
Setup
The first thing you want to do is download and run Charles Proxy. Start it up and you’ll see all the network traffic from your machine start to show up in the side bar. Charles, by default, has local proxying turned on, but since we’re going to use it to proxy an emulator, you can go to the Proxy menu and uncheck the OS proxy option:
Then click the little yellow broom icon to clear out all the traffic. You can also modify Charles’ preferences so that this option is not enabled by default.
Setup your Emulator to Proxy
Next, start up your emulator. Any old emulator will do, but depending on the Android version, your emulator’s settings might be different then mine. For this tutorial, I’m using a Pixel XL emulator running running Android 8.0, Oreo. The first thing we need to do is set up the emulator’s proxy settings, so that all the network traffic goes through Charles. To do that, we need your machine’s IP address. Charles actually has a little utility in the Help menu for this:
Click that, and then copy the IP address from the dialog that comes up.
Next, in your emulator, in the Setting bar, click the three little dots:
And then in the resulting dialog, click Settings, and then select the Proxy tab.
Paste in your IP address, and set the port to 8888. Charles will now prompt you that a device is trying to connect to the proxy, and ask you to allow it. Just click allow and you’ll start seeing IP addresses show up in the side bar
Don’t worry, we’re going to make that a whole lot prettier.
Install the Charles SSL Cert
Charles does some specific SSL magic, which we won’t go over here, but the bottom line it that you need to install the Charles SSL Certificate on your emulator. To do that, just open up a browser on the emulator, and navigate to http://chls.pro/ssl. The browser may prompt you to allow it to save the cert to disk, and then you can click to install it.
To Proxy your application on Android N or above, you also need to install a config file in your app’s resources. From the Charles Website:
“Android
As of Android N, you need to add configuration to your app in order to have it trust the SSL certificates generated by Charles SSL Proxying. This means that you can only use SSL Proxying with apps that you control.
In order to configure your app to trust Charles, you need to add a Network Security Configuration File to your app. This file can override the system default, enabling your app to trust user installed CA certificates (e.g. the Charles Root Certificate). You can specify that this only applies in debug builds of your application, so that production builds use the default trust profile.
Add a file res/xml/network_security_config.xml to your app:
Then add a reference to this file in your app’s manifest, as follows:
Phew. Your setup is now complete. Almost.
Urls instead of IP Addresses***
NOTE: THESE INSTRUCTIONS ARE OUT OF DATE. See the asterisked (***) section below for more current instructions.
Remember how we said we were gonna make Charles look all pretty? This is how we do it. In the setup, you probably noticed that all we get in the sidebar are IP addresses. But we can do better. To see the actual URLs those IPs represent, we can tweak our emulators settings to play nice with Charles.
To do this, go to your Emulator’s device settings, then go to (on Android 8.0, anyway) Network & Internet → Mobile network → Access Point Names. There should only be one, click on it. Now you should see this:
Now you can edit the Proxy and Port settings to match what we entered earlier in the Emulator’s settings. When you’re done that, don’t forget to click the three dots in the toolbar and Save your changes. Now, take a look at Charles again. If you’ve set up your app to trust the Charles cert, you should start to see some api urls in there.
Wow, that was a ton of work. But now it’s done, and you never have to do it ever again (unless your machines IP address changes, womp). In the next article, we’ll discover all the magical things you can do with Charles, including mapping responses to remote and local resources.
***UPDATE:
As with all things, setting up an HTTP proxy with your Android Emulator has changed a bit. Here’s is an amended guide to setting up URLs with Charles Proxy:
The built-in APN settings are now read-only, so you can’t change them as I instructed above. Instead, you need to create a new APN, so that you can change it. To do this, navigate to Settings → Network and Internet → Mobile Network and expand the Advanced section, then select Access Point Names. Now click the plus sign in the toolbar.
Basically what we’re going to do is add a new APN that copies the old one, and then edit that. Give your shiny new APN any name you want. Now set the APN field to epc.tmobile.com, set the MMSC field to http://mms.msg.eng.t-mobile.com/mms/wapenc, and make sure APN Type is set to Not Set. Also, don’t forget to set the Proxy field to your IP address for Charles, and the Port to 8888.
Finally, click the toolbar menu icon and select Save.
Now just back out to the previous screen and select your new Access Point, and you should be all set. Happy Charles-ing.
Источник
twaddington / charles-proxy-android.md
Charles Proxy Android
1. Add the Network Security Configuration to your app
2. Update the Android Manifest
3. Update the Emulator proxy
- Launch the emulator and open «Settings -> Proxy»
- Uncheck «Use Android Studio HTTP proxy settings»
- Check «Manual proxy configuration»
- Update the «Hostname» to «127.0.0.1» and «Port number» to «8888»
- Click «Apply»
Your settings should now look like this.
4. Install the Charles certificate
- Launch Charles and enable SSL proxying.
- In your emulator, open a web browser and navigate to https://chls.pro/ssl
- You should be prompted to download a cert file.
- Save the file with any name.
5. Create custom APN
Charles should now be proxying requests but instead of hostnames you’re going to see IP addresses. This makes it difficult to filter on specific hosts. To fix this you’ll need to:
- In Android, navigate to «Settings -> Network & Internet -> Mobile network -> (Advanced) Access point names»
- Tap the «Plus» icon in the toolbar to add a new APN.
- Use any name, set APN to «http://», proxy to «10.0.2.2», and port to «8888»
- Tap the overflow menu in the upper right and then «Save»
- Make sure to mark your new APN as active
- Now you may need to toggle airplane mode on and off a few times to get it to take.
You should now see hostnames correctly in Charles. If not, try restarting the proxy a few times.
Источник
Анализ трафика приложений на Android Emulator. Причем здесь Root?
Привет! Я думаю, что наберется немало людей, перед которыми стоят интересные задачи по работе с приложениями. Например — анализ трафика для, разумеется, тестирования этих самых приложений! Вам выпало нелегкое бремя — необходимо отдебажить продовую сборку чего-либо и вы начинаете свои поиски решений проблем. А проблем у вас на этом пути будет много. О том, как их можно решить я и пишу.
Классический путь начинается с установки какого-нибудь Charles, настройки в нем proxy-сервера и попытки слушать трафик, однако мы быстро натыкаемся на проблему — все адекватные современные приложения используют HTTPS, а поэтому — на ваше устройство придется установить сертификат, который и позволит слушать трафик. Тут то и начинается самое интересное.
Давайте создадим чек-лист, на который будем ориентироваться в процессе:
⚑ Предварительные подготовления, позволяющие начать установку эмулятора
⚑ Вы находитесь здесь
⚐ Установка сертификата для MITM
⚐ Проверка работоспособности прослушки трафика
⚐ Перенос сертификата в системное хранилище
Установка Android Emulator
Я не буду описывать всю процедуру установки, надеюсь, вы сможете сделать все подготовительные действия, чтобы оказаться в ситуации, когда вам осталось лишь выбрать определенный тип OS в эмуляторе, а все предыдущие шаги уже выполнены.
1. Выбираем любой подходящий вариант, с важной оговоркой — это должна быть сборка без Google Play, но с Google Play Services (далее будет видно). Соответственно — выбираем устройство без треугольника
2. Выбираем любой интересующий образ в котором есть Google Play APIs
3. Устанавливаем параметр Cold Boot
Установка сертификата для proxy-sniffer
Для прослушки трафика я буду пользоваться Fiddler Everywhere. И покажу порядок настройки данной софтины, согласно которому мы закроем еще один пункт нашей дорожной карты.
Тут я сделаю небольшое лирическое отступление — данная программа платная, да и еще по подписке, и стоить будет, в лучшем случае — 10$ в месяц. Но, у вас будет триал в 30 дней, после которого нужно больше золота, поэтому можно использовать любой другой инструмент. Сам я пытался заюзать Postman — в нем тоже есть proxy-tooling, однако, корневые сертификаты, которые генерирует Postman, не пригодны для установки в Android 10 / 11. Однако, служба поддержки уже бдит, и, надеюсь, за отведенные 30 дней триала все заработает как надо (в Postman) и вы сможете пользоваться наиболее удобным (с моей точки зрения) инструментом для решения данной задачи. Когда это случится — я дополню данную статью. А теперь возвращаемся к процессу установки сертификата на устройство (эмулятор).
Нам необходимо раскрыть пункт Advanced Settings в настройках Fiddler, и экспортировать корневой сертификат. В данный момент я пользователь Windows и на данной ОС он окажется на рабочем столе, подсказка об этом показывается по наведению на значок вопроса.
После экспорта сертификата, плавным движением кистей рук, переносим его на запущенный эмулятор — файл окажется в папке . /Downloads . После чего можно сразу идти в настройки и устанавливать наш серт:
Отлично! Можем поставить галочку у еще одного пункта:
⚑ Установка сертификата для MITM
Проверяем, все ли ок
Самое время проверить, принесли ли наши усилия хоть какие-то полезные плоды. Подопытным кроликом сегодняшнего эксперимента будет приложение Reddit и первое, что мы увидим, если попытаемся загрузить посты:
А также бесконечное количество попыток SSL-handshake в Fiddler. Кажется, пора поставить прочерк сразу напротив двух пунктов нашей дорожной карты:
⚑ Проверка работоспособности прослушки трафика
Я есть root
Мне кажется, что наступил момент рассказать, для чего нам вообще рут? Все дело в том пресловутом изменении Android 7, после которого пользовательские сертификаты перестали быть доверенными. Посему — нам необходимо сделать что-то с нашим установленным сертификатом, чтобы мы смогли использовать его для изучения трафика нашего рабочего приложения. И сделать это можно, только если ваш девайс рутован. Тут же заключается и причина использования эмулятора, да и связанные с этим особенности: без эмулятора вам придется иметь постоянно рутованное устройство, если это отдельный выделенный смартфон — то проблем с этим особенно и нет (ну, кроме зарядки, постепенного устаревания и ограничений конкретной модели), однако, если у вас свой личный аппарат — то минусы от root могут быть существенными — не работающая система безопасности, сломанный Google Pay или отвалившиеся камеры. Ну и помимо всего прочего — эмулятор позволяет легко изменить версию Android (правда, придется повторить все действия, перечисленные тут, но у вас уже будет эта статья, а я вот это все пишу её не имея).
А теперь приступим. Благодаря прекраснейшему проекту весь процесс сводится к запуску всего лишь одного скрипта, с небольшими подготовительными работами. Также, обращайте внимание на то, что выводится в консоль и если вы пользуетесь Windows — то запускайте не .sh , а .bat . Возможно, WSL будет тут как раз кстати, но моя система, скажем так, с некоторыми особенностями, которые WSL использовать не позволяют (если вы знаете, как завести на Ryzen 5000-серии и WSL и Android Emulator — то прошу написать об этом комментарий).
А вот и сами работы:
Плюс, нужно перезагрузить эмулятор. Ну и, у пользователей Windows путь до образа будет примерно таким:
На выходе мы получаем рут, который сохраняется при перезагрузке эмулятора, но wipe делать не стоит.
Делаем сертификат доверенным
Для этого нам понадобится перенести его в хранилище доверенных сертификатов. Тут рут нам и нужен (не только тут, но это позже).
Для этого мы запускаем цепочку следующих команд:
После чего наблюдаем следующую картинку в системных сертификатах:
Наш сертификат стал системным, поэтому закроем еще один пункт:
⚑ Перенос сертификата в системное хранилище
И давайте сразу проверим наше приложение:
Отлично! Теперь мы можем слушать HTTPS-трафик любых (ли?) приложений с эмулятора. Давайте, чтобы закрепить результат, попробуем еще одно приложение — Avito (как говорили Ник и Майк — это крепкий орешек).
Кажется, тут что-то пошло не так. Впрочем вы и так все знаете, так как видели гигантский спойлер в самом начале, поэтому ставим еще одну галку:
SSL-Unpinning
На данную тему есть множество решений, но, как правило, все они крутятся вокруг одной идеи — пересборки приложения, которое вы хотите изучить. Данный подход весьма громоздкий, сложный и может сподвигнуть к прокрастинации, поэтому нужно что-то такое, что позволит сделать все намного проще и универсальнее. И рецепт этого чего-то прямо тут, бесплатно и без СМС:
Благодаря наличию root установим Xposed
Благодаря Xposed установим модуль для отвязки SSL-привязки
Profit. (два пункта тут смотрелись бы уныло)
А теперь давайте по порядку.
Установка Xposed
С учетом нашего изначального плана слушать всё и вся на эмуляторе на этом шаге появляются некоторые сложности — нужно подобрать удачную комбинацию программных решений, которые будут работать и на эмуляторе. Благодаря этой статье вам совершенно точно не придется тратить несколько часов на поиски этих решений и будет достаточно следовать простой инструкции:
Скачиваем последнюю версию Magisk-модуля с интересным названием Riru и устанавливаем его посредством Magisk
Закрываем эмулятор, а затем снова запускаем (данный шаг эмулирует перезагрузку, которая у меня, по каким-то причинам, не работает, если работает у вас — может быть достаточно и её)
Находим в репозитории Magisk модуль с названием Riru — LSPosed и устанавливаем его
Снова ребутим эмулятор
Открываем приложение LSPosed, в котором необходимо установить уже Xposed-модуль SSLUnpinning
Переключаем все галки в настройках данного модуля у всех приложений, которые хотим слушать и активируем сам модуль
После этого вы оказались в ситуации, когда у вас есть эмулятор с:
Полноценным рутом (Magisk)
Установленным MITM-сертификатом в User-space
Установленным Xposed (LSPosed)
Установленным модулем для SSL-Unpinning
В процессе имея следующий набор картинок:
Можно честно поставить галку:
Настал час проверить, работает ли этот паровоз:
Работает! Ник и Майк ошиблись! Можем ставить и последнюю галку:
Какие есть нюансы? Во первых — при каждом включении эмулятора будет необходимо снова делать сертификаты доверенными (в принципе, после всех этих процедур можно отключить Cold Boot, и тогда не придется, но рано или вам придется перезагрузить эмулятор «жестко», и тогда потребуется поработать и с сертификатами). Возможно, тут есть постоянное решение или это можно, на худой конец, автоматизировать, но я устал. Во вторых — не все приложения в принципе хотят запускаться на эмуляторе. Самый надежный вариант — иметь набор выделенных телефонов на разных версиях Android, все из которых будут иметь весь арсенал инструментов из данного мануала (с небольшими изменениями), но он не всегда возможен.
Под конец — я еще раз продублирую всю инструкцию по пунктам, чтобы был понятен сам алгоритм:
Делаем приготовления (ставим Android Studio), чтобы иметь возможность установить / запустить эмулятор
Устанавливаем эмулятор с параметрами, определенными выше
Устанавливаем интересующие нас приложения на эмулятор методом перетаскивания курсором и убеждаемся, что они в принципе работают и все это будет не зря
Получаем root (Magisk) посредством инструкции, указанной выше
Источник