Risposte:
Ci sono 3 modi che conosco. Queste sono solo alcune speculazioni, dal momento che non lavoro nel team di revisione di Apple.
otool -L
Questo elencherà tutte le librerie a cui l'app è collegata. Qualcosa che chiaramente non dovresti usare, come IOKit e WebKit può essere rilevato da questo.
nm -u
Questo elencherà tutti i simboli collegati. Questo può rilevare
UITouch._phase
(che potrebbe essere la causa del rifiuto delle app basate su Three20 negli ultimi mesi.)strings
I selettori Objective-C sono memorizzati in una regione speciale del binario, quindi Apple potrebbe estrarre il contenuto da lì e verificare se hai utilizzato alcuni metodi Objective-C non documentati, come -[UIDevice setOrientation:]
.
Poiché i selettori sono indipendenti dalla classe a cui stai messaggiando, anche se la tua classe personalizzata definisce -setOrientation:
irrilevante per UIDevice, ci sarà la possibilità di essere rifiutati.
È possibile utilizzare APIKit di Erica Sadun per rilevare un potenziale rifiuto a causa di (falsi allarmi di) API private.
(Se vuoi davvero davvero davvero davvero aggirare questi controlli, potresti usare le funzionalità di runtime come
-valueForKey:
; object_getInstanceVariable, object_getIvar, ecc.per ottenere quelle librerie private, classi, metodi e ivars. )
È possibile elencare i selettori in un programma Mach-O utilizzando la seguente riga singola nel Terminale:
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/,$_))))))'
Supponiamo che tu voglia utilizzare alcune API private; l'obiettivo C ti consente di costruire qualsiasi SEL da una stringa:
SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
[UIDevice performSelector:my_sel ...];
Come potrebbe un robot o una scansione di una libreria rilevarlo? Dovrebbero rilevarlo utilizzando uno strumento che monitora gli accessi privati in fase di esecuzione. Anche se hanno costruito uno strumento di runtime di questo tipo, è difficile da catturare perché questa chiamata potrebbe essere nascosta in qualche percorso raramente esercitato.
Immagino che guardino tutti i simboli che il tuo binario sta cercando di importare (informazioni senza dubbio facilmente disponibili per loro nella relativa tabella dei simboli) e ti chiedono se qualcuno di questi simboli si trova nella loro "lista API privata". Abbastanza facile da automatizzare, infatti.
Un eseguibile non è esattamente una scatola nera. Se chiami una biblioteca, è una cosa facile da trovare. Questo è il motivo per cui mi lamento della perdita dei linguaggi assembly nella moderna istruzione CS. =] Strumenti come ldd ti diranno a cosa ti sei collegato, anche se non ricordo quale incarnazione di ldd sia arrivata al kit di sviluppo per Mac iPhone.
a parte l'indagine sui simboli ...
apple potrebbe avere molto facilmente una versione di sdk che controlla ciascuno degli stack dei metodi privati quando viene chiamato per assicurarsi che sia inserito da uno dei metodi designati.
Anche se stai collegando staticamente, nel peggiore dei casi, potrebbero prendere campioni del codice dalle API private nel loro elenco e cercare il tuo binario con loro (anche relativamente facile da automatizzare).
Conoscendo Apple, scommetterei che hanno un sistema completo e automatizzato e qualsiasi incertezza viene probabilmente negata o rivista manualmente.
Alla fine della giornata, penso che probabilmente non valga la pena provare a ingannare Apple.
Questa applicazione desktop, App Scanner , può eseguire la scansione dei file .app per l'utilizzo privato delle API separando il file binario Mach-O. Se può, anche Apple può farlo!
Esistono molti strumenti per il reverse engineering che consentono di ispezionare un codice
nm
- elenca i simboli dai file oggetto objdump
- visualizzare le informazioni dai file oggetto.otool
- visualizzare il contenuto degli eseguibili di Mach-O [About]strings
- questo ti darà tutte le corde.Puoi trovare esempi / rappresentazioni dell'utilizzo di questi comandi in sintesi per Objective-C e Swift