sonido puedo porque para pantalla guardar grabar grabacion funciona error con como app iphone objective-c ios

porque - no puedo grabar la pantalla del iphone



¿Cómo registra la aplicación Grabadora de la aplicación iOS la pantalla sin usar una API privada? (2)

La aplicación Display Recorder de iOS afirma ser capaz de grabar la pantalla de un dispositivo iOS, incluso mientras está en segundo plano. Dado que UIGetScreenImage() es una API privada y provocará un rechazo en el envío de la aplicación cuando se detecte mediante el análisis estático que ejecuta Apple, ¿cómo pudieron hacer esta grabación en una aplicación aprobada?

Además, la aplicación hace que aparezca una barra roja en la parte superior de la pantalla mientras se graba, de forma similar a la funcionalidad de llamada telefónica del iOS nativo.

He sido desarrollador de iOS por un tiempo, y estoy un poco perplejo sobre cómo se hizo esto, incluso hasta el detalle de poner la barra roja en la parte superior cuando estaba fuera de la aplicación. Tenía la impresión de que básicamente no teníamos control de lo que sucede cuando la aplicación se ejecuta en segundo plano, salvo algunas piezas clave de funcionalidad (como reproducción de audio, etc.).

Incluso si el desarrollador recurrió a API / bibliotecas privadas para lograr esto, ¿cómo pudieron hacer esto de una manera que no se detectó durante la revisión? Mis disculpas si me falta algo obvio que se presentó con una versión posterior de iOS aquí.


La sugerencia de @ C0deH4cker del marco IOSurface es lo suficientemente loco como para funcionar. IOSurface proporciona una interfaz kernel (lo que permite que una aplicación salga silenciosamente de su sandbox), para un buffer de píxeles rectangulares (capturas de pantalla), que se puede convertir a un CGImage o UIImage usando métodos relacionados con el framework.

Incluso Apple sugiere que la razón de ser del marco es:

Contienen interfaces de bajo nivel para compartir superficies gráficas entre aplicaciones.

La mejor parte es que no es legal en iOS. El framework solía llamarse CoreSurface en iOS 2.x, que fue rápidamente y silenciosamente obsoleto en 3.x, solo para ser reemplazado por iOSurface. Supongo que el hecho de que sea privado y no figure en las referencias de iOS significa que los probadores de la tienda de aplicaciones no lo probaron. Interesante.


Lo analizó y no se vincula con IOSurface. Sin embargo, encontré que usa dlsym , y después de un poco más de ingeniería inversa, encontré esto:

/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

Entonces, como puede ver aquí, después de cada ruta de estructura están las cadenas de los símbolos que carga de cada marco, dinámicamente. Esto es para evitar meterse en problemas por vincularse contra un Marco Privado. Como está cargado en tiempo de ejecución, un analizador estático no puede decir que esta aplicación lo usa, escapando así de la detección.

Parece que mi sospecha inicial era correcta; está utilizando IOSurface para escabullirse de las restricciones de la zona de pruebas para tener acceso de pantalla sin formato. También usa UIGetScreenImage , que supongo que es para el segundo método de generación de video. También usa algunas funciones de IOKit y funciones de IOMobileFramebuffer. Parece que la aplicación está tomando una IOSurface de la función IOMobileFramebufferGetLayerDefaultSurface . Sin embargo, no estoy seguro de qué usa IOKit.

En conclusión, esta aplicación utiliza algunas técnicas furtivas para evitar la detección por analizadores estáticos: no se vincula con los marcos privados, sino que capta los símbolos dinámicamente. Utiliza una combinación de IOSurface e IOMobileFramebuffer para grabar el video, o UIGetScreenImage para el otro modo. Es una aplicación engañosa que se TENDRÁ de la AppStore, así que si la quieres, será mejor que la obtengas ahora.

ACTUALIZAR:

Parece que esta aplicación fue extraída de la AppStore. Si tuvo la suerte de agarrar una copia antes de que se tirara, eso es genial. Sé que estoy contento de haberlo conseguido.

Apple probablemente justificó su decisión al afirmar que la aplicación utilizaba API privadas y podría ser vista como un posible problema de seguridad (una aplicación que lo observa a medida que ingresa su contraseña de iTunes es un ejemplo, pensamiento aterrador). Me pregunto si esto llevará a un cambio en su proceso de revisión, pero es probable que nunca lo sepamos. Una cosa que es interesante para mí es que todavía hay muchos más trucos que los desarrolladores podrían utilizar para ocultar el comportamiento de su aplicación del análisis estático. Ningún proceso de revisión es perfecto, pero pueden funcionar bastante bien. Incluso si Apple rechaza automáticamente las aplicaciones que enlazan con el símbolo dlsym , existen métodos que pueden usarse para eludir la detección.

ACTUALIZACIÓN 2:

Aparentemente, ahora hay otra versión de esta aplicación en la AppStore. Se llama "Grabadora de Disp" y tiene el mismo icono exacto que el primero. La GUI se ve casi idéntica a la original con algunos cambios menores. Todavía no he revertido el más nuevo, pero estaría dispuesto a apostar que usaron las mismas técnicas para ocultar el comportamiento ilegal. Actualizaré esta respuesta una vez que invierta la nueva versión. El nuevo cuesta $ 5, pero si alguna vez ha deseado una aplicación de grabación de pantalla en un dispositivo no liberado, debe tomarla antes de extraerla.

ACTUALIZACIÓN 3:

Parece que estaba en lo cierto con la forma en que funciona esta aplicación. Hay una implementación de código abierto de esto en GitHub por @coolstarorg llamada RecordMyScreen . Si aún te preguntas cómo funciona esta aplicación, te sugiero que la revises.