Парсинг приложений на Andoid
Есть задача по парсингу одного маркетплейса. Если парсить с сайта, там куча каптч, поэтому хочу попробовать спарсить из приложения на android. Уже читал по теме, наткнулся на ADB, Appium и т.д. . Что будет лучше использовать под задачу парсинга? И вообще, возможно ли парсить андроид приложения?
Ответы (1 шт):
Из комментариев стало известно, что приложение, информацию в котором нужно спарсить — это Poizon.
Чтож, ну поехали.
Для этого нам понадобиться телефон на Android (спасибо кэп!), хотя наверное можно использовать и эмулятор, в данном ответе остановимся на использовании телефона. Телефон должен быть рутованным.
Также понадобиться любая программа, через которую будем хватать траффик. Тут вариантов чуть больше чем много: Fiddler, Burp, Charles… Можно подсмотреть в этом вопросе на английском SO.
Компьютер и телефон должны находится в одной сети Wi-Fi.
Рвение, терпение, ну вы поняли.
Burp
Загружаем community edition, он бесплатный и его возможностей хватит более чем. Программа для сетевиков-безопасников, но и под наши нужды отлично подходит. Сильно долго в ней обучаться не придётся, так как будем использовать лишь малую часть функционала.
Настройка программы
Скачали, поставили, открыли.
Теперь в верхних вкладках выбираем Proxy ⇒ Options, здесь щёлкаем по proxy listeners, который стоит по умолчанию и меняем его, либо же добавляем новый. Выбираем specific address и ставим внутренний адрес компьютера, его можно подсмотреть в ipconfig, вероятнее всего он будет вида 192.168.1.***.
Теперь кнопка ниже — Import / export CA certificate. Выбираем Certificate in DER format и путь куда сохраним.
Готовим сертификат
В Android, чтобы поставить системный сертификат необходимо его для начала сконвертировать. Почему системный? Потом что если ставить пользовательский, то он будет работать только с браузером, у приложений траффик не будет идти из-за SSL pinning, штука которая бережёт приложения от атак man in the middle, которой мы и будем заниматься. Актуально для Android Nougat и старше.
Для конвертации потребуется openssl, скачивать его дополнительно если уже стоит Git нет необходимости, он там есть. А если стоит Git, то есть и GitBash, который тоже пригодится. На .nix системах всё ещё проще, достаточно использовать терминал.
В Android сертификаты должны быть в PEM формате, а имя файла должно быть subject_hash_old с .0 расширением.
(при использовании OpenSSL <1.0 необходимо брать subject_hash, но это совсем редкий случай ?)
openssl x509 -inform DER -in cacert.der -out cacert.pem
mv cacert.der $(openssl x509 -inform PEM -subject_hash_old -in cacert.pem |head -1).0
Готово.
На случай если ответ будут читать пользователи с низкой компьютерной грамотностью, если openssl не находится в переменной PATH, то прописываем полный путь. Если не находимся в папке с сертификатом, то прописываем полный путь. Т.е. для таких случаев получится что-то вроде: "C:\Users\User\AppData\Local\Programs\Git\mingw64\bin\openssl.exe" x509 -inform DER -in "C:\I_love_parsing\cacert.der" -out "C:\I_love_parsing\cacert.pem"
Ставим сертификат на телефон
Продолжаем работу в bash и подключаемся к телефону через adb:
adb root
adb remount
adb push ********.0 /sdcard/********.0
adb shell
mv /sdcard/********.0 /system/etc/security/cacerts/
chmod 644 /system/etc/security/cacerts/********.0
reboot
Вместо ********.0 ставим название получившегося сертификата.
В целом процесс должен пройти без приключений, но в моём случае телефон Sony Xperia как-то плохо работает с remount на живую, поэтому мне проще было сделать всё это под TWRP. И путь к сертификатам у меня получился /system/system/etc/…, но это уже нюансы, с которыми потенциальный читатель, надеюсь, разберётся. К тому же из под TWRP всё это делать не такая уж плохая идея, т.к. нам необходимо будет перезагрузить телефон так или иначе.
После всех махинаций сертификат должен появиться в настройках в Trusted credentials ⇒ System под названием PortSwigger.
Настраиваем подключение на телефоне
Теперь нам надо, чтобы весь трафик шёл через прокси. Для этого идём в настройки Wi-Fi, выбираем сеть к которой подключены, редактируем и меняем настройки прокси. Ставим ip-адрес компьютера, на котором будем снифить и порт 8080.
Парсим!
Итак, все настройки сделаны, идём в Burp на вкладку Proxy ⇒ Intercept, убедимся, что он выключен, иначе получим timeout'ы в приложении.
Идём в Proxy ⇒ HTTP history, чистим историю если там уже что-то есть и на телефоне открываем приложение.
Видим много всего интересного.
Меня заинтересовал POST запрос к https://asia-east-public.poizon.com, по сути первый POST запрос после того как открыли приложение.
В нём видим такую штуку:
HTTP/1.1 200 OK
Server: Tengine
Date: Sun, 01 Jan 2023 23:02:08 GMT
Content-Type: application/json;charset=UTF-8
Connection: close
Vary: Accept-Encoding
upstream_name: jgs-app_cloud_gateway_service-8888
Content-Length: 36285
{
"code":200,
"msg":"success",
"data":{
"recentExposureTitle":"Recent Legit Checks",
"recentExposureInfo":[
{
"userId":1000088883,
"userName":"po**f7",
"userIcon":"",
"productTitle":"Nike ",
"images":[
"https://hkpoizon-img.poizon.com/du_app/2022/image/1000088883_byte297953byte_400d3f363677b033e4c7b7ded4541d5a_iOS_w1125h1500.jpg",
"https://hkpoizon-img.poizon.com/du_app/2022/image/1000088883_byte318928byte_fb45d8754b4698df50dd7a4c82761e47_iOS_w2000h1500.jpg",
"https://hkpoizon-img.poizon.com/du_app/2022/image/1000088883_byte211493byte_fdf2c2d9ad4fb43f2439c2a4f2adcb82_iOS_w1125h1500.jpg",
"https://hkpoizon-img.poizon.com/du_app/2022/image/1000088883_byte192463byte_8855107c756bca5969d098580d372c90_iOS_w1125h1500.jpg",
"https://hkpoizon-img.poizon.com/du_app/2022/image/1000088883_byte271618byte_722f7e191b6417fd6218c1d7eb125940_iOS_w1125h1500.jpg",
"https://hkpoizon-img.poizon.com/du_app/2022/image/1000088883_byte407203byte_252606f896aa0443cca945741892fcba_iOS_w2000h1500.jpg",
"https://hkpoizon-img.poizon.com/du_app/2022/image/1000088883_byte315253byte_1adc3a679b59d5012ee423a48452b8e1_iOS_w1125h1500.jpg",
"https://hkpoizon-img.poizon.com/du_app/2022/image/1000088883_byte493542byte_59a316442ce7356d76b7d148fca8f364_iOS_w1125h1500.jpg",
"https://hkpoizon-img.poizon.com/du_app/2022/image/1000088883_byte249455byte_e07da5b469ba58450f8166cff253f68c_iOS_w1125h1500.jpg",
"https://hkpoizon-img.poizon.com/du_app/2022/image/1000088883_byte215655byte_fa2f8838b196781cf2e3c56b8c5ada8f_iOS_w1125h1500.jpg",
"https://hkpoizon-img.poizon.com/du_app/2022/image/1000088883_byte244120byte_f88dddcf9a2c654a9a5d201db58c4a3a_iOS_w1125h1500.jpg",
"https://hkpoizon-img.poizon.com/du_app/2022/image/1000088883_byte298839byte_602b6db7c4147e9bbd85aa865bcb2bd4_iOS_w1125h1500.jpg",
"https://hkpoizon-img.poizon.com/du_app/2022/image/1000088883_byte266270byte_137cd97ea205ed3cbf5b89a7fc6206b0_iOS_w1125h1500.jpg",
"https://hkpoizon-img.poizon.com/du_app/2022/image/1000088883_byte301222byte_0b1337371170f85ee2c082606b5dd53f_iOS_w1125h1500.jpg"
],
"resultImage":"https://cdn.poizon.com/node-common/c9f7da3f-6b64-ae7a-aafc-9cfcc1c259f8-204-204.png",
"identifyMsg":"received the result of a legit check",
"createTime":1672523345,
"createTimeTips":"1 d ago",
"identifyCode":331958831,
"shareToken":"dJeO2OPOLiqX9cybqK%2Bkx%2BNDLIBrmr1PEwwtFBkdAXkOMAAUpFvCHnyYVpJX"},
…
То есть, по сути то, что видим на главной странице в приложении:

Товарищ JSON, причём, довольно длинный 36285 элементов, т.е. сразу грузит всё что есть, из-за этого приложение при первой загрузке довольно долго открывается, но нам ведь это только на руку ?
Копируем полностью запрос в среду разработки, в которой собираемся парсить, от лишних заголовков, в общем-то, можно избавиться. Запрос проверен в Postman, всё замечательно грузится.
Удачного парсинга!