¿Cómo sabe Apple que está utilizando API privada?


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

Aparte de revisar manualmente el código fuente, ¿cómo sabe Apple qué se usó y qué API ha llamado?

Author: Tim Ferrell, 2010-05-16

9 answers

Hay 3 maneras que conozco. 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 la aplicación ha vinculado. Algo que claramente no debes usar, como IOKit y WebKit, puede ser detectado por esto.

2. nm -u

Esto listará todos los símbolos enlazados. Esto puede detectar

  • Funciones C indocumentadas como _UIImageWithName;
  • Clases de Objective-C como UIProgressHUD
  • Ivars como UITouch._phase (que podría ser la causa del rechazo de de las aplicaciones basadas en Three20 últimos meses.)

3. Listing Objective-C selectors, or 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 ha utilizado algunos métodos Objective-C no documentados, como -[UIDevice setOrientation:].

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


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


(Si realmente realmente realmente quiere solucionar estas comprobaciones, puede usar funciones de tiempo de ejecución como

  • dlopen, dlsym{[19]]}
  • objc_getClass, sel_registerName, objc_msgSend
  • -valueForKey:; object_getInstanceVariable, object_getIvar, etc.

Para obtener esas bibliotecas privadas, clases, métodos e ivars. )

 161
Author: kennytm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-16 07:18:39

Puede listar los selectores en un programa Mach-O usando el siguiente one-liner 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/,$_))))))'
 25
Author: Robert Diamond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-02 15:57:17

Digamos que desea usar alguna API privada; objective C le 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 biblioteca detectar esto? Tendrían que capturar esto usando alguna herramienta que monitorea los accesos privados en tiempo de ejecución. Incluso si construyeron una herramienta de tiempo de ejecución, es difícil de atrapar porque esta llamada puede estar oculta en alguna ruta rara vez ejercida.

 12
Author: Chris McLuvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-25 16:43:53

Me imagino que miran todos los símbolos que su binario está tratando de importar (información sin duda fácilmente disponible para ellos en la tabla de símbolos de la misma) y ding si alguno de esos símbolos se encuentran en su "lista de API privada". Bastante fácil de automatizar, de hecho.

 7
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-16 02:09:52

Un ejecutable no es exactamente una caja negra. Si llamas a una biblioteca, es algo fácil de encontrar. Esta es la razón por la que lamento la pérdida de las lenguas de la asamblea en la educación moderna CS. = ] Herramientas como ldd le dirá lo que ha vinculado en, aunque no recuerdo qué encarnación de ldd hizo al mac iPhone dev kit.

 1
Author: Sniggerfardimungus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-16 02:11:16
otool -L somebinary
 1
Author: dvenema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-16 06:43:14

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

Conociendo Apple, apuesto a que tienen un sistema completo y automatizado, y cualquier incertidumbre es probablemente denegada o revisada manualmente.

Al final del día, creo que probablemente no vale la pena el esfuerzo para tratar de engañar a Apple.

 0
Author: wash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-16 02:17:27

Esta aplicación de escritorio, App Scanner, puede escanear .archivos de aplicaciones para uso privado de api separando el archivo binario Mach-O. Si puede, entonces Apple también puede!

 0
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-07 12:57:02

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

Apple podría tener muy fácilmente una versión del sdk que comprueba cada una de las pilas de métodos privados cuando se llama para asegurarse de que se introduce desde uno de los métodos designados.

 0
Author: Grady Player,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-08 16:58:30