Domanda

Un consenso in via di sviluppo tra la comunità di sviluppatori di iPhone è che Apple ha recentemente iniziato a utilizzare uno strumento di analisi del codice statico per rilevare l'uso di chiamate API non documentate.

Solo per il bene dell'argomento, mi chiedo se sarebbe possibile aggirare questo strumento generando l'invocazione in fase di esecuzione in questo modo:

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];

Sembra quasi troppo facile, quindi mi chiedo: cosa mi sto perdendo? Come può Apple eventualmente rilevarlo utilizzando l'analisi del codice statico sull'assieme?

Un paio di punti:

  1. Sono consapevole che il nome del metodo lo farà essere archiviato nel file binario come statico stringa. Sarebbe comunque banale per generare il nome del metodo in runtime pure usando stringWithFormat: o altro tipo di lieve offuscamento (abbastanza per confondere l'analizzatore statico).
  2. So che questo trucco sarebbe stato rivelato anche dall'analisi di runtime più banale usando gdb - la mia comprensione è stata che Apple analizza il binario stesso, e forse mi sbaglio completamente.
È stato utile?

Soluzione

Perché preoccuparsi? Non dovresti usare API private per una buona ragione: Apple potrebbe facilmente rompere l'applicazione in qualsiasi momento, sconvolgendo i tuoi utenti.

Detto questo, l'uso di NSInvocation, -performSelector: o qualsiasi altra tecnica simile è probabilmente sufficiente per evitare il rilevamento da parte di un analizzatore statico.

Altri suggerimenti

Suppongo che tu abbia letto questo articolo . Interessante è anche questo . La mia interpretazione è che l'analizzatore statico di Apple genera falsi positivi solo perché alcune persone usano metodi con lo stesso nome dei metodi privati. Ciò non sarebbe accaduto se l'analizzatore avesse effettuato un'analisi di runtime o un controllo approfondito di quale selettore di classi è stato chiamato. Quindi, sembra che stiano cercando principalmente stringhe o selettori corrispondenti nel tuo binario. Penso che l'uso di NSInvocation combinato con un po 'di offuscamento delle stringhe ti farà passare. Consiglio comunque di non fare affidamento su API private.

C'è un modo semplice per scoprirlo!

Crea un'app che utilizza deliberatamente un'API nascosta attraverso il metodo in questione e visualizzala se viene accettata!

Sam

PS Se lo scopri, assicurati di dircelo; tutti vorremmo saperlo con certezza e sicuramente Apple non ce lo dirà!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top