web-dev-qa-db-fra.com

Comment Apple sait-il que vous utilisez une API privée?

J'ai soumis un fichier binaire à Apple sans code source. 

Outre la vérification manuelle du code source, comment Apple sait-il ce qui a été utilisé et quelles API vous avez appelées? 

105
Tattat

Il y a 3 façons que je connais. Ce ne sont que quelques spéculations, car je ne travaille pas dans l'équipe d'évaluation Apple.

1. otool -L

Cela listera toutes les bibliothèques auxquelles l'application est liée. Quelque chose de clair que vous ne devriez pas utiliser, comme IOKit et WebKit peut être détecté par ceci.

2. nm -u

Cela listera tous les symboles liés. Cela peut détecter

  • Fonctions C non documentées telles que _UIImageWithName;
  • Classes Objective-C telles que UIProgressHUD
  • Ivars tels que UITouch._phase (qui pourrait être la cause de rejet des applications basées sur Three20 ces derniers mois.)

3. Liste des sélecteurs Objective-C ou strings

Les sélecteurs Objective-C sont stockés dans une région spéciale du binaire. Apple peut donc en extraire le contenu et vérifier si vous avez utilisé des méthodes Objective-C non documentées, telles que -[UIDevice setOrientation:].

Étant donné que les sélecteurs sont indépendants de la classe dans laquelle vous écrivez, même si votre classe personnalisée définit -setOrientation: non pertinent pour UIDevice, il y aura une possibilité de rejet.


Vous pouvez utiliser APIKit d'Erica Sadun pour détecter un rejet potentiel dû à (de fausses alarmes de) API privées.


(Si vous voulez vraiment vraiment contourner ces vérifications, vous pouvez utiliser des fonctionnalités d’exécution telles que 

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

pour obtenir ces bibliothèques, classes, méthodes et ivars privés. )

164
kennytm

Vous pouvez répertorier les sélecteurs dans un programme Mach-O à l'aide de la ligne suivante dans 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/,$_))))))'
26
Robert Diamond

Supposons que vous souhaitiez utiliser une API privée. Objective C vous permet de construire n'importe quel SEL à partir d'une chaîne:

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

Comment une analyse de robot ou de bibliothèque pourrait-elle résoudre ce problème? Ils devraient résoudre ce problème à l'aide d'un outil qui surveille les accès privés au moment de l'exécution. Même s'ils ont construit un tel outil d'exécution, il est difficile à saisir, car cet appel peut être caché dans un chemin d'accès rarement utilisé.

12
Chris McLuvin

J'imagine qu'ils regardent tous les symboles que votre binaire essaie d'importer (informations sans aucun doute facilement accessibles dans la table des symboles) et vous signalent si l'un de ces symboles se trouve dans leur "liste d'API privée". Assez facile à automatiser, en fait.

7
Alex Martelli

Un exécutable n'est pas exactement une boîte noire. Si vous appelez une bibliothèque, c'est une chose facile à trouver. C'est pourquoi je déplore la perte des langues de l'Assemblée dans les formations modernes en informatique. =] Des outils comme ldd vous diront ce que vous avez lié, bien que je ne me souvienne pas de quelle incarnation de ldd a été intégrée au kit de développement pour iPhone mac.

1
otool -L somebinary
1
dvenema

Au pire, même si vous liez statiquement, ils pourraient prélever des échantillons du code à partir des API privées de leur liste et rechercher votre binaire contre eux (également relativement facile à automatiser).

Connaissant Apple, je parierais qu'ils ont un système complet et automatisé, et toute incertitude est probablement soit refusée, soit examinée manuellement.

En fin de journée, je pense que ça ne vaut probablement pas la peine d'essayer de duper Apple.

0
wash

Il existe de nombreux outils de reverse engineering permettant d'inspecter un code.

  • nm - liste les symboles des fichiers objets objfile
  • objdump - affiche des informations à partir de fichiers objets.
  • otool - affiche le contenu des exécutables de Mach-O
  • strings - cela vous donnera toutes les ficelles.

Vous pouvez trouver exemple ici

0
yoAlex5

en dehors de l'enquête sur les symboles ...

Apple pourrait très facilement disposer d’une version du sdk qui vérifie chacune des piles de méthodes privées lorsqu’elle est appelée pour s’assurer qu’elle est entrée à partir de l’une des méthodes désignées.

0
Grady Player

Cette application de bureau, App Scanner , peut analyser les fichiers .app à des fins d'utilisation privée des API en séparant le fichier binaire Mach-O. Si c'est possible, Apple peut aussi!

0
Andrew