Connect with us

Разработка

Как я раскопал скрытую функцию видеозвонков в 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 сессии), я просто ввел пустую строку, чтобы увидеть, что произойдет:

Бинго! Функция не работала, но я смог сделать скриншот, чтобы доказать, что работа над ней идет. С неанонсированными функциями это происходит очень часто: вам получается её активировать, но воспользоваться ею уже нельзя.

 

Если вы нашли опечатку - выделите ее и нажмите Ctrl + Enter! Для связи с нами вы можете использовать info@apptractor.ru.
Advertisement

Популярное

Спасибо!

Теперь редакторы в курсе.