Реверс API по его android приложению

  • Tutorial

Зачем


У меня есть 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 Ценное дополнение к статье

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 32

    0

    Правильно ли я понимаю, что при таком подходе пользователю необходимо будет вводить логин и пароль от своего банковского приложения в левое приложение? Вряд ли таких пользователей будет много, банки на каждом углу твердят о том, что нельзя вводить учетные данные где попало, к тому же скорее всего придется ещё подтверждать вход через СМС (если не все банки такое требуют то большинство), а в нем ещё раз написано, что не стоит вводить этот код не в официальное приложение

      0
      Приложение вы собираете самостоятельно. В чем отличее такого приложения от официального описано в статье. В чем угроза для безопасности во время дебага я не очень понял.

      Если мы говорим дальнейшее использование api внутри своего приклада, то это уже выбор пользователя доверять ли такому прикладу. Если бы я выкладывал бы такое приложение, я бы положил клиентскую часть в open source и всю работу с банками совершал на клиенте, отправляя на сервер уже полученные данные.

      Данная статья не только про банки, таким же образом можно, например, найти способ автоматически отправлять показания счетчиков в вашу управляющую компанию. Способов применения сотни.
        0

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

          0

          приложение собирается для разработчика и только для него с целью дебага апи.

            0

            Сертификат то нужен не только для дебага, а и для использования. Север не даст использовать API без сертификата

              0

              прочтите ваш коммент. В нем на тему популярности у пользователей написано. Будет или не будет работать с сертификатом — тема другая.


              такой подход вряд ли будет сильно популярен у пользователей, да и вообще будет отрицательно сказываться на впечатлении о приложении
      0

      У меня есть опыт написания финансового приложения, в котором болшое внимание уделялось безопасности. И в нем для подтверждения оригинальности приложения использовался свой сертификат, но просто так его нельзя было бы так просто использовать в другом приложении, т.к. он был запаролен, а пароль был зашифрован и расшифровывался в приложении во время работы (да, его можно было вытащить, но это было бы не просто).

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

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

            0

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

              0
              Посмотреть клиентский код который генерирует эту проверку точно смогу. Далее мне нужно запустить его у себя и, с точки зрения сервера, я и есть его клиент
                0

                Но ведь если сертификат привязать к одному приложению — это не сработает?

                  0
                  Не понял, что значит привязать сертификат.
          0
          Отличная инструкция, спасибо!

          Если на телефоне имеется root доступ, для относительно простых случаев достаточно приложения HttpCanary.

          А кто-нибудь сталкивался с ситуацией, когда запросы подписываются дополнительным параметром?

          Примерно так: api.host?param1=..&param2=..&signature=abc123456
            0
            apktool позволяет смотреть код приложений, далее думаю понятно =)
            0

            Есть альтернатива для рутованных телефонов — frida.js. Удобная штука, что бы не связываться с редактированием apk

              0
              А если не секрет, какое приложение банка позволило вам запуститься на рутованном телефоне?
              Обычно если телефон рутован то приложение банка говорит что оно не будет работать. Как минимум у Сбера точно знаю что при руте приложение не запустится. А без рута не будет трафик сниферится.
                0
                Рут не нужен.
                  0
                  Сбер, на руте работает.
                    0
                    Сейчас посмотрел, действительно работает. Видимо память подводит.
                      0
                      Раньше не работал.
                      Но после того, как сбер апихнул туда антивирус, разжиревшее нечто, перестало влезать на бюджетные смарты.
                      В общем, получилось ещё хуже, и сбер пошёл на некоторые послабления.
                      0
                      Magisk умело маскируется. там как бы и не совсем рут… несколько хитрее
                      0

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

                        –1
                        Если вы зашили его в код приложения, то да смогу. В этом ключевая проблема всей логики на клиенте, ее потенциально можно утащить.
                          +1

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

                            0
                            Спасибо за разъяснение!
                          0
                          Как минимум для одного российского банка фокус не сработает (придется в приложении искать сертификат которым оно авторизуется и пароль к нему), ну а потом возится с тем что нужен токен авторизации который живет минут 15 (но можно обновить, но придется разбираться где берется токен для обновления).
                          Для сбора данных если уже дошло до пересборки apk — проще найти где там в этом приложении включается отладочная ручка (в сборке из PlayStore она отключена но в принципе возможно наличие продовой сборки с включенной ручкой и иногда так делают) и смотреть все нужно для сбора данных в logcat например. Про обфускацию разумеется тоже не забыли.

                          Только вот для целей учета персональных финансов — проще web.budgetbakers.com использовать (и этот банк и многие другие российские — поддерживают, правда на каждую синхронизацю СМС потребуется… и да — потребуется логин и пароль от ИБ, доверять ли этому не смотря на все заявления — на усмотрение клиента)
                            +1
                            Ждём следующую статью по классификации банковских приложений по взлому и анализу, на сколько было легко сломать, вытащить сертификат и тп). Тоже считаю что у вас мало что получится.
                              0
                              Статьи не будет, ибо боюсь.

                              Все банки которые были мне интересны поддались. Проще всего было с «онлайн» банками.
                              +2
                              Часть кода может быть написана на языке c++, и тогда уже нужно будет смотреть логику через IDA или Ghidra. Некоторые приложения могут ругаться на подпись приложения. Для тех у кого есть рут права и xposed для обхода сертефиката можно использовать SSLUnpinning или TrustMeAlready, если нет xposed то можно через frida. Вместо apktool и «штуки для подписи приложений» для пользователей Windowos можно использовать BatchApkTool.
                                0
                                Спасибо! Очень ценное дополнение!
                                0
                                Вы гений сенсей, как вы молчали столько времени.
                                По статье задача выглядеть легким, такой способ работает с любым приложением? например с увернем aliexpress?

                                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                Самое читаемое