40 votes

Comment l'enregistreur d'appli iOS enregistre-t-il l'écran sans utiliser d'API privée?

L'application iOS d'Affichage de l'Enregistreur prétend être en mesure d'enregistrer l'écran d'un appareil iOS, alors même qu'elle est en arrière-plan. Étant donné qu' UIGetScreenImage() est privé de l'API et va conduire à un rejet de la soumission de la demande lorsqu'il est détecté par l'analyse statique d'Apple fonctionne, comment ont-ils pu faire l'enregistrement dans un dossier de candidature approuvé?

En outre, l'application provoque une barre rouge en haut de l'écran alors qu'il enregistre, similaire à iOS natives du téléphone fonctionnalité d'appel.

J'ai été un développeur iOS pour un certain temps, et je suis un peu perplexe à la façon dont cela a été encore fait, jusque dans le détail de mettre la barre rouge en haut, à l'extérieur de l'application. J'étais sous l'impression que nous avons essentiellement eu aucun contrôle de ce qui se passe lorsque l'application s'exécute en arrière-plan, court de certains éléments clés de fonctionnalités (comme la lecture audio, etc).

Même si le développeur puisé dans API privée/bibliothèques pour ce faire, comment ont-ils pu le faire d'une manière qui n'était pas détecté lors de l'examen? Toutes mes excuses si je suis absent quelque chose d'évident qui a été introduite avec une version plus récente d'iOS ici.

59voto

C0deH4cker Points 2443

Regardé dedans et il ne marche pas le lien contre IOSurface. J'ai cependant trouvé qu'il utilise dlsym, et après plus d'une 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 pouvez le voir ici, après chaque cadre de chemin d'accès sont les chaînes de la signification des symboles qu'il charge de chaque cadre, de façon dynamique. C'est pour éviter d'avoir des ennuis pour se lier à un Cadre Privé. Depuis, il est chargé lors de l'exécution, un analyseur statique ne peut pas dire que cette application utilise afin d'échapper à la détection.

Il ne ressemble à mon soupçon initial était correct; c'est à l'aide de IOSurface pour se faufiler sandbox restrictions d'avoir cru d'accès à l'écran. Il utilise également UIGetScreenImage, ce qui je suppose est pour la deuxième méthode de génération de vidéo. Il utilise également certaines IOKit fonctions et IOMobileFramebuffer fonctions. Il semble que l'app est saisissant un IOSurface de l' IOMobileFramebufferGetLayerDefaultSurface fonction. Pas tout à fait sûr de ce qu'il utilise IOKit pour si.

En conclusion, cette application utilise certains sournois techniques pour éviter la détection par les analyseurs statiques: il n'a pas de lien contre le privé, les cadres, mais au lieu attrape les symboles de façon dynamique. Il utilise une combinaison de IOSurface et IOMobileFramebuffer l'enregistrement d'une vidéo, ou UIGetScreenImage pour l'autre mode. C'est une délicate l'application qui SERA retiré de l'AppStore, donc si vous le voulez, vous obtenez mieux maintenant.

Mise à JOUR:

Il semble que cette application était en effet retiré de l'AppStore. Si vous avez été assez chanceux pour attraper une copie avant il a été tiré, c'est génial. Je sais que je suis heureux je l'ai eu.

Apple probablement justifié sa décision en indiquant que l'application utilisée Api privées et il peut être considéré comme un problème de sécurité potentiel (une application qui vous regarde comme vous tapez votre mot de passe iTunes est un exemple effrayant de la pensée). Je me demande si cela va conduire à un changement dans leur processus d'évaluation, mais nous le saurons sans doute jamais. Une chose qui est intéressant pour moi, c'est qu'il y a encore beaucoup de trucs de plus les développeurs pourraient s'en servir pour masquer leur application du comportement à partir de l'analyse statique. Pas de processus de vérification est parfait, mais ils peuvent le faire assez bien. Même si Apple automatiquement refuse des applications liées à l'encontre de l' dlsym symbole, il existe des méthodes qui peuvent être utilisées pour contourner la détection.

Mise à JOUR 2:

Apparemment, il existe une autre version de cette application dans l'AppStore maintenant. Il est appelé "Disp Enregistreur" et a exactement la même icône que le premier. L'interface graphique est presque identique à l'original avec quelques modifications mineures. Je n'ai pas encore inversé la plus récente, mais je serais prêt à parier qu'ils ont utilisé les mêmes techniques pour masquer le comportement illégal. Je mettrai à jour cette réponse une fois que j'inverse la nouvelle version. La nouvelle un frais de 5$, mais si vous avez toujours voulu un enregistrement d'écran de l'app sur un unjailbroken appareil, vous devez l'attraper avant qu'il soit retiré.

Mise à JOUR 3:

C'est comme si j'ai été très correct avec comment fonctionne cette application. Il est un open-source de la mise en œuvre de ce sur GitHub par @coolstarorg appelé RecordMyScreen. Si vous me demande encore comment cette application fonctionne, je vous conseille d'aller le vérifier.

13voto

CodaFi Points 29073

@C0deH4cker la suggestion de la IOSurface cadre est juste assez fou pour travailler. IOSurface fournit une interface de noyau (permettant à une application de se glisser hors de sa sandbox tranquillement), pour un plat rectangulaire de pixels de la mémoire tampon d'écran (attrape), qui peut être converti en CGImage ou UIImage à l'aide du cadre de méthodes connexes.

Même apple suggère que le cadre de la raison d'être est de:

Contiennent de bas niveau des interfaces pour le partage des graphiques des surfaces entre les applications.

La meilleure partie est, il n'est pas légal dans iOS. Le cadre utilisé pour être appelé CoreSurface dans iOS 2.x, qui a été silencieusement et rapidement obsolète dans 3.x, pour être remplacés par des iOSurface. Je suppose que le fait qu'il est privé et non cotées en bourse dans l'iOS références signifiait que l'app store testeurs n'ai pas fait de test pour elle. Intéressant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X