policies para how guideline fast expedite appstore app accurate iphone objective-c appstore-approval

iphone - para - ¿Cómo sabe Apple que estás utilizando una API privada?



itunes connect para iphone (9)

Digamos que quieres usar alguna API privada; el objetivo C te permite construir cualquier SEL a partir de una cadena:

SEL my_sel = NSSelectorFromString([NSString stringWithFormat:/ @"%@%@%@", "se","tOr","ientation:"]); [UIDevice performSelector:my_sel ...];

¿Cómo podría un robot o una exploración de la biblioteca captar esto? Tendrían que atrapar esto usando alguna herramienta que monitoree accesos privados en tiempo de ejecución. Incluso si construyeron una herramienta de tiempo de ejecución de este tipo, es difícil de detectar porque esta llamada puede estar oculta en algún camino raramente utilizado.

Envié un archivo binario a Apple sin ningún código fuente.

Además de verificar manualmente el código fuente, ¿cómo sabe Apple qué se utilizó y qué API ha llamado?


Esta aplicación de escritorio, App Scanner , puede escanear archivos .app para el uso privado de la API retirando el archivo binario Mach-O. Si puede, ¡Apple también puede!


Hay 3 formas que sé. Estas son solo algunas especulaciones, ya que no trabajo en el equipo de revisión de Apple.

1. otool -L

Esto mostrará una lista de todas las bibliotecas a las que se ha vinculado la aplicación. Algo claramente no deberías usar, como IOKit y WebKit pueden ser detectados por esto.

2. nm -u

Esto mostrará una lista de todos los símbolos vinculados. Esto puede detectar

3. Listado de selectores Objective-C o strings

Los selectores Objective-C se almacenan en una región especial del binario y, por lo tanto, Apple podría extraer el contenido de allí y comprobar si has utilizado algunos métodos Objective-C no documentados, como -[UIDevice setOrientation:] .

Como los selectores son independientes de la clase a la que está -setOrientation: mensajes, incluso si su clase personalizada define -setOrientation: irrelevante para UIDevice, habrá una posibilidad de rechazo.

Puede utilizar APIKit de Erica Sadun para detectar posibles rechazos debido a (falsas alarmas de) API privadas.

(Si realmente desea realmente solucionar estas comprobaciones, podría usar características de tiempo de ejecución como

  • dlopen, dlsym
  • objc_getClass, sel_registerName, objc_msgSend
  • -valueForKey: object_getInstanceVariable, object_getIvar, etc.

para obtener esas bibliotecas privadas, clases, métodos y ivars. )


Imagino que miran todos los símbolos que su binario está tratando de importar (información que sin duda está fácilmente disponible para ellos en la tabla de símbolos del mismo) y le preguntan si alguno de esos símbolos se encuentra en su "lista de API privada". Muy fácil de automatizar, de hecho.


Incluso si está vinculando estáticamente, en el peor de los casos, podrían tomar muestras del código de las API privadas en su lista, y buscar en su binario (también relativamente fácil de automatizar).

Conociendo a Apple, apostaría a que tienen un sistema integral y automatizado, y cualquier duda probablemente sea denegada o revisada manualmente.

Al final del día, creo que probablemente no valga la pena intentar engañar a Apple.


Puede enumerar los selectores en un programa Mach-O usando el siguiente trazador de líneas en Terminal:

otool -s __TEXT __objc_methname "$1" |expand -8 | cut -c17- | sed -n ''3,$p'' | perl -n -e ''print join("/n",split(//x00/,scalar reverse (reverse unpack("(a4)*",pack("(H8)*",split(//s/,$_))))))''


Un ejecutable no es exactamente una caja negra. Si llama a una biblioteca, es algo fácil de encontrar. Esta es la razón por la que lamento la pérdida de los lenguajes ensambladores en las modernas enseñanzas de CS. =] Las herramientas como ldd le dirán en qué se ha vinculado, aunque no recuerdo qué encarnación de ldd llegó al kit de desarrollo mac de iPhone.


aparte de la investigación de símbolos ...

apple podría muy fácilmente tener una versión de sdk que verifique cada una de las pilas de métodos privados cuando se le llame para asegurarse de que se ingrese desde uno de los métodos designados.


otool -L somebinary