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

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

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

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

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

2 ответа

Решение

Посмотрел на это, и это не ссылка на 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, поэтому, если вы хотите его, вам лучше получить его сейчас.

ОБНОВИТЬ:

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

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

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

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

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

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

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

Даже яблоко предполагает, что смысл этой платформы заключается в следующем:

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

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

Другие вопросы по тегам