Зачем


У меня есть pet-project, приложение для учета финансов.


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


Но


  • Банков несколько и они ничего не знают друг про друга. В итоге
    • Нет единой аналитики
    • Перевод денег из одного банка в другой будет считаться как списание с одной стороны и зачисление с другой. Эта особенность портит аналитику.
  • Возможность работать с данными позволяет строить любую аналитику и прогнозы в отличие от ui банка

Для доступа к данным можно использовать разные каналы: сайты и приложения. Сайты выглядят проще: взял дебагер chrome и вперед. Но данные на сайте чаще меняют свою структуру, так как кроме данных они содержат еще элементы UI. Приложения, в отличие от сайтов, запрашивают данные с сервера и только в своих кишках делают из него UI. На сайте нужно оперировать html, который построен на малопонятных, мутабельных div, изменямых javascriptом. В приложения обычно приходят уже удобные для машинной обработки json/xml.


Дисклеймер

Я понятия не имею насколько легальны действия в данной статье. На мой взгляд это скраппинг своих данных, к которым я должен иметь доступ. Я не юрист, но знаю, что законодательство РФ обширно и, если навредить большой компании, то статья найдется и на эти действия. Доступа к чужим данным таким образом не получить.


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


Я не призываю совершать противоправные действия, будьте зайками.


Изначально данная статья была примером реверса приложения одного сервиса. К сожалению, редактирование статьи не удаляет коментарии, где было обсуждение какое конкретно приложение можно зареверсить таким образом. В связи с этим, был вынужден сделать повторную публикацию вместо изменения исходной статьи.


Как


Краткая инструкция для реверса приложения


  • Качаем charles, apktool, "штука для подписи приложений"
  • Подготавливаем приложение к MITM
    • С помощью apktool анбоксим приложение apktool d -f -r app.apk
    • Меняем политику безопасности приложения, на доверие сертификатам телефона
      • Меняем/Добавляем файл network_security_config.xml с содержанием
        <network-security-config>
        <base-config>
          <trust-anchors>
              <certificates src="user" />
          </trust-anchors>
        </base-config>
        </network-security-config>
      • Убеждаемся/Добавляем декларацию network_security_config.xml в манифесте AndroidManifest.xml атрибутом networkSecurityConfig
        <application android:networkSecurityConfig="@xml/network_security_config"></application>
    • Некоторые приложения не будут вестись на такой способ валидации сертификатов
      и имеют собственное хранилище сертификатов. Для них
      • Выгружаем из charles корневой сертификат Help > SSL Proxying > Save Charles Root Certificate
      • Заменяем доверенный сертификат на сертификат charles cp <your.cer> your_app/res/somePath/somecert.cer
      • Теперь приложение будет доверять charles вместо настоящего.
  • Собираем приложение обратно apktool b yourapp -o ${apkName}
  • И подписываем его java -jar sign.jar ${apkName}
  • Подписанное приложение устанавливается вместо настоящего на телефон
  • Конфигурируем телефон на проксирование трафика через Charles (в настройках wifi выбирается Proxy. IP - машины с charles, PORT-8888)
  • Устанавливаем сертификат charles на телефон.
    • Заходим на https://chls.pro/ssl
    • Скачивам сертификат
    • Устанавливаем его
  • Запускаем приложение и снифим трафик.

Итог


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


  • Посмотреть на процесс регистрации устройства. В результате нужно получить специальный id вашего девайса, который знает сервер
  • Разобраться в процессе аутентификации. Обычно происходит передачей id девайса и пароля на сервер. В ответ обычно выдают токен, который потом используется в header или cookie. Типичный пример jsessionid
  • Совершать действия в приложении, приводящие вас к интересной вам информации, смотреть на запросы.
  • Запросы воспроизводим в коде, далее обрабатывая информацию по своему усмотрению.

Update Ценное дополнение к статье