Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Зачем
У меня есть 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
- Совершать действия в приложении, приводящие вас к интересной вам информации, смотреть на запросы.
- Запросы воспроизводим в коде, далее обрабатывая информацию по своему усмотрению.