Question

Un consensus qui se dégage dans la communauté des développeurs iPhone est qu'Apple a récemment commencé à utiliser un outil d'analyse de code statique pour détecter l'utilisation d'appels d'API non documentés.

Juste pour les besoins de l’argument, je me demande s’il serait possible de contourner cet outil en générant l’invocation à l’exécution de la manière suivante:

NSString *const aMethod = @"doStuff:withStuff:";
SEL aSelector = NSSelectorFromString(aMethod);
NSMethodSignature *aSignature = [targetObject methodSignatureForSelector:aSelector];
NSInvokation *anInvokation = [NSInvokation invocationWithMethodSignature:aSignature];
[anInvokation setTarget:targetObject];
[anInvokation setSelector:aSelector];
[anInvokation setArgument:&firstArg atIndex:2];
[anInvokation setArgument:&secondArg atIndex:3];
[anInvokation invoke];

Cela semble presque trop facile, alors je me demande - qu'est-ce qui me manque? Comment Apple peut-il le détecter en utilisant une analyse de code statique sur l’ensemble?

Quelques points:

  1. Je suis conscient que le nom de la méthode sera être stocké dans le binaire en tant que statique chaîne. Ce serait cependant trivial générer le nom de la méthode à exécution aussi bien en utilisant stringWithFormat: ou un autre type de légère obfuscation (assez pour confondre l’analyseur statique).
  2. Je sais que cette astuce serait révélée même par l'analyse d'exécution la plus triviale utilisant gdb. D'après ce que j'ai compris, Apple a analysé le binaire lui-même. Peut-être que je me trompe complètement à ce sujet.
Était-ce utile?

La solution

Pourquoi se soucier? Vous n'êtes pas censé utiliser l'API privée pour une bonne raison: Apple pourrait facilement casser votre application à tout moment, en dérangeant vos utilisateurs.

Cela dit, l'utilisation de NSInvocation, de -performSelector: ou de toute autre technique similaire est probablement suffisante pour éviter la détection par un analyseur statique.

Autres conseils

Je suppose que vous avez lu cet article . Celui-ci est également intéressant . Mon interprétation est que l'analyseur statique d'Apple génère des faux positifs simplement parce que certaines personnes utilisent des méthodes portant le même nom que des méthodes privées. Cela n'aurait pas été le cas si l'analyseur avait effectué une analyse d'exécution ou une vérification approfondie du sélecteur de classes qui avait été appelé. Il semble donc qu'ils recherchent principalement des chaînes ou des sélecteurs correspondants dans votre fichier binaire. Je pense que l'utilisation de NSInvocation combinée à une certaine obfuscation de chaîne vous permettra de passer à travers. Je recommanderais quand même de ne pas compter sur des API privées, cependant.

Il existe un moyen facile de le savoir!

Créez une application qui utilise délibérément une API masquée via la méthode de votre question et vérifiez si elle est acceptée!

Sam

PS Si vous le découvrez, assurez-vous de nous le dire; nous aimerions tous savoir avec certitude et Apple ne nous dira sûrement pas!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top