Подтвердить что ты не робот

Как приложение Display Recorder для iOS записывает экран без использования частного API?

Приложение iOS Display Recorder утверждает, что может записывать экран устройства iOS, даже если оно находится в фоновом режиме. Учитывая, что UIGetScreenImage() является частным API и приведет к отказу при подаче заявки, когда обнаружен статическим анализом Apple, каким образом они могли делать эту запись в одобренном приложении?

Кроме того, приложение заставляет красную полосу появляться в верхней части экрана, когда она записывается, аналогично функциональным функциям телефонного вызова iOS.

Я некоторое время занимался разработкой iOS, и я немного недооцениваю, как это было сделано, даже вплоть до детализации размещения красной полосы наверху, когда вне приложения. Я был под впечатлением, что мы практически не контролировали, что происходит, когда приложение работает в фоновом режиме, за исключением некоторых ключевых функциональных возможностей (например, воспроизведение звука и т.д.).

Даже если разработчик выполнил это для частных API/библиотек, как они могли это сделать так, чтобы не было обнаружено во время просмотра? Приносим извинения, если я упустил что-то очевидное, которое было представлено с более поздней версией iOS здесь.

4b9b3361

Ответ 1

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

/System/Library/Frameworks/IOKit.framework/IOKit
IOServiceGetMatchingServices
IOServiceGetMatchingService
IOServiceMatching
IOMasterPort
IOIteratorNext
IORegistryEntryCreateCFProperty
IOObjectRelease
/System/Library/Frameworks/UIKit.framework/UIKit
UIGetScreenImage
/System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/IOMobileFramebuffer
IOMobileFramebufferOpen
IOMobileFramebufferGetLayerDefaultSurface
/System/Library/PrivateFrameworks/IOSurface.framework/IOSurface
IOSurfaceAcceleratorCreate
IOSurfaceAcceleratorTransferSurface
IOSurfaceLock
IOSurfaceUnlock
IOSurfaceGetWidth
IOSurfaceGetHeight
IOSurfaceCreate
IOSurfaceGetBaseAddress

Итак, как вы видите здесь, после каждого пути каркаса - это строки символов, которые он загружает из каждой структуры, динамически. Это делается для того, чтобы избежать проблем с привязкой к частной структуре. Поскольку он загружается во время выполнения, статический анализатор не может сказать, что это приложение использует его, тем самым избегая обнаружения.

Это похоже на то, что мое первоначальное подозрение было правильным; он использует IOSurface для скрытия прошлых ограничений на песочницу, чтобы иметь доступ к сырому экрану. Он также использует UIGetScreenImage, который я предполагаю для второго метода генерации видео. Он также использует некоторые функции IOKit и функции IOMobileFramebuffer. Похоже, приложение захватывает IOSurface из функции IOMobileFramebufferGetLayerDefaultSurface. Не совсем уверен, что он использует IOKit, хотя.

В заключение, это приложение использует некоторые подлые методы, чтобы избежать обнаружения статическими анализаторами: он не связан с частными фреймворками, а вместо этого захватывает символы динамически. Он использует комбинацию IOSurface и IOMobileFramebuffer для записи видео или UIGetScreenImage для другого режима. Это сложное приложение, которое БУДЕТ вытащить из AppStore, поэтому, если вы этого хотите, вам лучше получить его сейчас.

UPDATE:

Похоже, что это приложение действительно было вытащено из AppStore. Если вам посчастливилось схватить копию, прежде чем ее потянуть, это здорово. Я знаю, что я рад, что понял.

Apple, вероятно, оправдала свое решение, заявив, что приложение использует частные API, и это можно рассматривать как потенциальную проблему безопасности (приложение, которое следит за вами, когда вы вводите свой пароль в iTunes, является одним из примеров, страшная мысль). Интересно, приведет ли это к изменению их процесса рассмотрения, но мы, скорее всего, никогда не узнаем. Мне интересно, что есть еще много трюков, которые разработчики могли бы использовать, чтобы скрыть поведение своего приложения от статического анализа. Никакой процесс рассмотрения не является совершенным, но они могут делать очень хорошо. Даже если Apple автоматически откажется от приложений, которые ссылаются на символ dlsym, существуют методы, которые можно использовать для обхода обнаружения.

ОБНОВЛЕНИЕ 2:

По-видимому, теперь есть еще одна версия этого приложения в AppStore. Он называется "Disp Recorder" и имеет тот же самый точный значок, что и первый. GUI выглядит почти идентично оригинальному с небольшими незначительными изменениями. Я еще не отменил новый, но я готов поспорить, что они использовали одни и те же методы, чтобы скрыть незаконное поведение. Я обновлю этот ответ, как только изменю новую версию. Новый стоит 5 долларов США, но если вы когда-либо захотели использовать приложение для записи на экране на неуправляемом устройстве, вы должны его захватить до его вытягивания.

ОБНОВЛЕНИЕ 3:

Похоже, я был очень прав, как работает это приложение. В GitHub есть реализация с открытым исходным кодом @coolstarorg под названием RecordMyScreen. Если вам все еще интересно, как работает это приложение, я предлагаю вам проверить его.

Ответ 2

@Предложение C0deH4cker структуры IOSurface достаточно сумасшедшее для работы. IOSurface предоставляет интерфейс ядра (позволяющий приложению скрываться из песочницы спокойно), для прямоугольного буфера пикселей (захват экрана), который может быть преобразован в CGImage или UIImage с использованием связанных с фреймворком методов.

Даже яблоко подсказывает, что рамки raison d'être:

Содержите низкоуровневые интерфейсы для совместного использования графических поверхностей между приложениями.

Лучшая часть, это не законно в iOS. Рамку называли CoreSurface в iOS 2.x, которая была быстро и тихо устарела в 3.x, но только для замены iOSurface. Я предполагаю, что тот факт, что он закрыт и не включен в список iOS, означает, что тестеры хранилища приложений не тестировали его. Интересно.