Реверс-инжиниринг Android-приложения Subway

click fraud protection

Приятно видеть все более широкое распространение закрепления сертификатов в приложениях Android. Когда я сталкиваюсь с приложением, которое выдает ошибки соединения при попытке прокси-запроса, мне становится интереснее погружаться глубже. Так было, когда я недавно использовал приложение Subway. Реверсирование APK выявило закрепление сертификата среди некоторых других интересных результатов.

Запуск приложения во время проксирования запросов вызвал следующую ошибку:

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

 // Code removed at request of Subway leadership

Обойти это было так же просто, как добавить оператор return в код smali, чтобы пропустить код закрепления в методе выше. Обратите внимание на добавление возврат недействителен заявление ниже:

 // Code removed at request of Subway leadership

После перекомпиляции приложения и установки я был удивлен, увидев эту новую ошибку:

Subway использовала специальный процесс проверки подписи приложения, чтобы предотвратить отмену своего APK. Найдя источник упоминаний об этом процессе, я проследил его до следующего метода:

 // Code removed at request of Subway leadership

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

 // Code removed at request of Subway leadership

После перекомпиляции и установки приложения я смог успешно проксировать запросы:

Во время своих исследований я наткнулся на этот пост на Реддите. Судя по всему, Subway также определяла, было ли рутировано устройство пользователя. Я поискал в источнике и подтвердил упоминания о методах обнаружения корней.

 // Code removed at request of Subway leadership

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