Comment l'application iOS Display Recorder enregistre-t-elle l'écran sans utiliser d'API privée?

L'application iOS Display Recorder prétend pouvoir save l'écran d'un appareil iOS, même lorsqu'il est en arrière-plan. Étant donné que UIGetScreenImage() est une API privée et entraînera un rejet lors de la soumission d'une application lorsqu'elle est détectée par l'parsing statique d'Apple, comment ont-ils pu effectuer cet logging dans une application approuvée?

En outre, l'application fait apparaître une barre rouge en haut de l'écran pendant son logging, similaire à la fonctionnalité d'appel téléphonique native de iOS.

J'ai été un développeur iOS pendant un certain time, et je suis un peu perplexe quant à la façon dont cela a été fait, même jusqu'au détail de mettre la barre rouge au sumt en dehors de l'application. J'avais l'printing que nous n'avions pratiquement aucun contrôle sur ce qui se passait lorsque l'application fonctionnait en arrière-plan, à l'exception de certaines fonctionnalités keys (comme la lecture audio, etc.).

Même si le développeur a utilisé des API / bibliothèques privées pour y parvenir, comment ont-ils pu le faire d'une manière qui n'a pas été détectée lors de l'examen? Mes excuses si je manque quelque chose d'évident qui a été introduit avec une version plus récente d'iOS ici.

Regardé en elle et il ne lie pas contre IOSurface. J'ai cependant trouvé qu'il utilise dlsym , et après un peu plus d'ingénierie inverse, j'ai trouvé ceci:

 /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 

Donc, comme vous le voyez ici, après chaque path de cadre sont les strings des symboles qu'il charge de chaque cadre, dynamicment. Ceci afin d'éviter d'avoir des problèmes de liens avec un framework privé. Comme il est chargé à l'exécution, un parsingur statique ne peut pas dire que cette application l'utilise, échappant ainsi à la détection.

Il semble que ma suspicion initiale était correcte; il utilise IOSurface pour passer au-delà des ressortingctions de sandbox pour avoir un access brut à l'écran. Il utilise également UIGetScreenImage , que je suppose être pour la deuxième méthode de génération de video. Il utilise également certaines fonctions IOKit et fonctions IOMobileFramebuffer. Il semble que l'application saisisse une IOSurface à partir de la fonction IOMobileFramebufferGetLayerDefaultSurface . Je ne sais pas exactement ce qu'il utilise pour IOKit cependant.

En conclusion, cette application utilise des techniques sournoises pour éviter la détection par les parsingurs statiques: elle ne se lie pas aux frameworks privés mais saisit les symboles dynamicment. Il utilise une combinaison de IOSurface et IOMobileFramebuffer pour save la video, ou UIGetScreenImage pour l'autre mode. C'est une application délicate qui sera tirée de l'AppStore, donc si vous le voulez, vous feriez mieux de l'get maintenant.

METTRE À JOUR:

Il semble que cette application a bien été tirée de l'AppStore. Si vous avez eu la chance de prendre une copy avant qu'elle ne soit tirée, c'est génial. Je sais que je suis content d'avoir compris.

Apple a probablement justifié sa décision en déclarant que l'application utilisait des API privées et qu'elle pouvait être considérée comme un problème de security potentiel (une application qui vous observe lorsque vous tapez votre mot de passe iTunes est un exemple, une idée effrayante). Je me request si cela entraînera un changement dans leur process d'examen, mais nous ne le saurons probablement jamais. Une chose qui m'intéresse est qu'il y a encore beaucoup d'astuces que les développeurs pourraient utiliser pour cacher le comportement de leur application à partir de l'parsing statique. Aucun process de révision n'est parfait, mais ils peuvent le faire plutôt bien. Même si Apple refuse automatiquement les applications dlsym symbole dlsym , certaines methods peuvent être utilisées pour contourner la détection.

MISE À JOUR 2:

Apparemment, il existe maintenant une autre version de cette application dans l'AppStore. Il s'appelle "Disp Recorder" et a la même icône que le premier. L'interface graphique semble presque identique à l'original avec quelques changements mineurs. Je n'ai pas encore inversé le nouveau, mais je serais prêt à parier qu'ils ont utilisé les mêmes techniques pour cacher le comportement illégal. Je mettrai à jour cette réponse une fois que j'aurai inversé la nouvelle version. Le nouveau coûte 5 $, mais si vous avez déjà voulu une application d'logging d'écran sur un appareil non brisé, vous devriez l'attraper avant qu'il ne soit tiré.

MISE À JOUR 3:

Il semble que j'ai été très correct avec le fonctionnement de cette application. Il existe une implémentation open-source de ceci sur GitHub par @coolstarorg appelé RecordMyScreen . Si vous vous requestz toujours comment cette application fonctionne, je vous suggère de vérifier.

@ La suggestion de C0deH4cker du cadre IOSurface est juste assez folle pour fonctionner. IOSurface fournit une interface kernel (permettant à une application de glisser discrètement hors de son bac à sable), pour un tampon de pixels rectangular (captures d'écran), qui peut être converti en une CGImage ou UIImage en utilisant des methods liées au framework.

Même Apple suggère que la raison d'être du cadre est:

Contient des interfaces de bas niveau pour le partage des surfaces charts entre les applications.

La meilleure partie est, ce n'est pas légal dans iOS. Le framework s'appelait CoreSurface dans iOS 2.x, qui était rapidement et tranquillement déconseillé dans 3.x, pour être remplacé par iOSurface. Je suppose que le fait qu'il soit privé et non répertorié dans les references iOS signifie que les testeurs de l'App Store n'ont pas testé. Intéressant.