Разработка
Как я раскопал скрытую функцию видеозвонков в Instagram на iOS
Разработчик Гильерме Рамбо написал об использовании реверс-инжиниринга для поиска скрытых функций в приложениях для iOS.
Вчера мне удалось сделать несколько скриншотов интерфейса видеозвонков в Instagram. Это статья о том, как это получилось. Я думаю, что описание процесса будет полезным для людей, заинтересованных в реверс-инжиниринге для поиска скрытых функций.
Все всегда начинается со слуха. Все началось с истории на 9to5mac о том, что кто-то нашел файлы, связанные с видео и аудиозвонками, в приложении Instagram для Android. Это привлекло мое внимание и мне стало интересно, смогу ли я найти то же самое на iOS.
Сначала я использовал iMazing, чтобы скачать IPA-файл Instagram из App Store. Файл IPA — это обычный файл zip, поэтому, чтобы извлечь все содержимое, вы должны изменить расширение с .ipa на .zip. Я заглянул в Instagram.app, чтобы поискать файлы, которые могли бы быть связаны с функцией видеозвонков. Это можно сделать при помощи Spotlight или при помощи команды в терминале. Я искал по запросам videocall или videochat, но ничего не нашел. Затем я использовал Asset Catalog Tinkerer, чтобы открыть файл Assets.car, но и там ничего не было.
Так как поиск файлов оказался бесполезным, пришло время заглянуть в двоичный код. Так как мы говорим о приложении из App Store, первым делом нужно было расшифровать код. В отличие от встроенных приложений Apple, двоичный код приложений из App Store зашифрован, и расшифровать его можно только на устройстве iOS с джейлбрейком. Поэтому я подключил свой взломанный iPhone 5S и начал расшифровывать приложение.
Процесс происходит следующим образом:
- зайдите в устройство через SSH
- запустите нужное приложение
В приложении найдите PID:
Используйте bfinject, чтобы для дешифровки инжектировать dylib в целевой процесс, и подождите завершения:
После того я использовал netcat, чтобы скачать расшифрованный IPA на свой Mac:
Затем я переименовал его в .zip и извлек Instagram.app из папки Payload:
Теперь у меня есть расшифрованная версия Instagram.
Обычно я начинаю с загрузки двоичного кода в Hopper, но файл Instagram имеет размер в 50 МБ, поэтому разбор занял бы очень большое время. Я решил сначала заняться поиском нужных строк. Помните, что я не был уверен в том, что найду что-нибудь, поэтому не хотел тратить время и мощность процессора на дизассемблирование всего кода.
Так происходит извлечение строк из двоичного кода:
Они видны только в расшифрованном двоичном файле, а зашифрованная версия покажет вам только бессмыслицу.
Обратите внимание, что я отправил результат поиска на сортировку, а потом сохранил его в файле Instagram_34.txt. Так будет проще сравнить разные версии позже. Сортировка означает, что сравнение файлов будет более стабильным, а разграничение будет более эффективным. Указание версии файла не необходимо, но оно может быть полезным в будущем, если я захочу узнать, то изменилось в новой версии Instagram.
Время поискать что-то, что укажет нам на функцию видеозвонков. Вот что показал поиск по videocall:
Это только отрывок, этих строк намного больше. Поэтому я понял, что они определенно работают над функцией видеозвонков. Я мог бы остановиться на этом, отправить твит и пойти спать. Но что если я действительно запущу этот код, чтобы увидеть его в действии?
Код в действии
Чтобы запускать произвольный код в приложении, которое я не контролирую, я мог бы просто прикрепить отладчик и использовать его, но это не весело, поэтому я решил использовать Cycript.
В bfinject есть встроенный Cycript:
Теперь я могу соединить консоль Cycript на моем Mac c cycript в Instagram на моем iPhone.
Как вы можете видеть, как только консоль Cycript подключена к Instagram на моем iPhone, я могу запустить код ObjC и делать все, что я хочу. Но откуда я знаю, какой код запустить?
class-dump
Как и многие iOS-приложения, Instagram написан на Objective-C. Это означает, что вы можете выгрузить заголовки классов при помощи запуска class-dump в зашифрованной библиотеке:
Затем я открыл файл Instagram.h в TextWrangler и снова поискал videocall, пока не нашел нечто, что могу использовать:
Название метода presentVideoCallViewControllerWithSessionId звучит многообещающе. Он реализован в подклассе UIViewController под названием IGDirectThreadViewController.
Судя по имени это ViewController, ответственный за личные сообщения. Поэтому я открыл этот экран в приложении.
Затем я поискал активный IGDirectThreadViewController в иерархии этого ViewController. Почему-то удобная функция choose() из Cycript не сработала.
Затем я вызвал метод presentVideoCallViewControllerWithSessionId:. Он требует параметр (ID сессии), я просто ввел пустую строку, чтобы увидеть, что произойдет:
Бинго! Функция не работала, но я смог сделать скриншот, чтобы доказать, что работа над ней идет. С неанонсированными функциями это происходит очень часто: вам получается её активировать, но воспользоваться ею уже нельзя.
-
Видео и подкасты для разработчиков1 месяц назад
Lua – идеальный встраиваемый язык
-
Новости1 месяц назад
Видео и подкасты о мобильной разработке 2024.40
-
Новости1 месяц назад
Видео и подкасты о мобильной разработке 2024.41
-
Интегрированные среды разработки2 недели назад
Лучшая работа с Android Studio: 5 советов