Парсинг приложений на Andoid

Есть задача по парсингу одного маркетплейса. Если парсить с сайта, там куча каптч, поэтому хочу попробовать спарсить из приложения на android. Уже читал по теме, наткнулся на ADB, Appium и т.д. . Что будет лучше использовать под задачу парсинга? И вообще, возможно ли парсить андроид приложения?


Ответы (1 шт):

Автор решения: DiMithras

Из комментариев стало известно, что приложение, информацию в котором нужно спарсить — это 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, всё замечательно грузится.

Удачного парсинга!

→ Ссылка