Зачем
У меня есть 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>
- Меняем/Добавляем файл network_security_config.xml с содержанием
- Некоторые приложения не будут вестись на такой способ валидации сертификатов
и имеют собственное хранилище сертификатов. Для них
- Выгружаем из charles корневой сертификат
Help > SSL Proxying > Save Charles Root Certificate
- Заменяем доверенный сертификат на сертификат charles
cp <your.cer> your_app/res/somePath/somecert.cer
- Теперь приложение будет доверять charles вместо настоящего.
- Выгружаем из charles корневой сертификат
- С помощью apktool анбоксим приложение
- Собираем приложение обратно
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 — Ценное дополнение к статье
Nihiroz
Правильно ли я понимаю, что при таком подходе пользователю необходимо будет вводить логин и пароль от своего банковского приложения в левое приложение? Вряд ли таких пользователей будет много, банки на каждом углу твердят о том, что нельзя вводить учетные данные где попало, к тому же скорее всего придется ещё подтверждать вход через СМС (если не все банки такое требуют то большинство), а в нем ещё раз написано, что не стоит вводить этот код не в официальное приложение
MEJIOMAH Автор
Приложение вы собираете самостоятельно. В чем отличее такого приложения от официального описано в статье. В чем угроза для безопасности во время дебага я не очень понял.
Если мы говорим дальнейшее использование api внутри своего приклада, то это уже выбор пользователя доверять ли такому прикладу. Если бы я выкладывал бы такое приложение, я бы положил клиентскую часть в open source и всю работу с банками совершал на клиенте, отправляя на сервер уже полученные данные.
Данная статья не только про банки, таким же образом можно, например, найти способ автоматически отправлять показания счетчиков в вашу управляющую компанию. Способов применения сотни.
Nihiroz
Я не говорю об опасности такого подхода, это просто способ работы. Я говорю о том, что такой подход вряд ли будет сильно популярен у пользователей, да и вообще будет отрицательно сказываться на впечатлении о приложении.
Если бы мне встретилось приложение, которое бы запрашивало мои учетные данные от банка, то я бы вряд ли их ввел. Даже если бы мне автор дал ссылку на репозиторий, т.к. во-первых я не могу быть уверен, что приложение собрано именно из этих исходников (можно конечно самому собрать), а во-вторых разбираться в этих исходниках мало удовольствия и много времени
zelenin
приложение собирается для разработчика и только для него с целью дебага апи.
Nihiroz
Сертификат то нужен не только для дебага, а и для использования. Север не даст использовать API без сертификата
zelenin
прочтите ваш коммент. В нем на тему популярности у пользователей написано. Будет или не будет работать с сертификатом — тема другая.