Domanda

Ho inviato un file binario per Apple, senza alcun codice sorgente.

Oltre a controllare manualmente il codice sorgente come fa Apple a sapere che cosa è stato usato e che cosa Api hai chiamato?

È stato utile?

Soluzione

Ci sono 3 modi che conosco. Queste sono solo alcune speculazioni, dal momento che io non lavoro nella revisione squadra di Apple.

1. otool -L

Questo elencherà tutte le librerie l'applicazione è legati a. Qualcosa evidentemente non si deve usare, come IOKit e WebKit può essere rilevata da questo.

2. nm -u

Questo elencherà tutti i simboli legati. Questo in grado di rilevare

  • funzioni Undocumented C come _UIImageWithName;
  • classi Objective-C, come UIProgressHUD
  • ivars come UITouch._phase (che potrebbe essere causa di rifiuto di applicazioni Three20 basati ultimo mesi pochi.)

3. Listing selettori Objective-C, o strings

Objective-C selettori sono memorizzati in una regione speciale del binario, e quindi Apple potrebbe estrarre il contenuto da lì, e verificare se hai utilizzato alcuni metodi Objective-C senza documenti, come ad esempio -[UIDevice setOrientation:].

Dal momento che i selettori sono indipendenti dalla classe voi sono messaggistica, anche se i vostri definisce di classe personalizzati -setOrientation: irrilevante per UIDevice, ci sarà la possibilità di essere respinto.


Si potrebbe usare Erica Sadun per rilevare il potenziale rifiuto a causa di ( falsi allarmi di API private).


(Se davvero davvero davvero vuole veramente per aggirare questi controlli, è possibile utilizzare il runtime caratteristiche come ad esempio

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

per ottenere quelle private biblioteche, classi, metodi e ivars. )

Altri suggerimenti

Si possono elencare i selettori in un programma di Mach-O utilizzando il seguente one-liner 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/,$_))))))'

Diciamo che si desidera utilizzare alcune API private;obiettivo C permette di costruire qualsiasi SEL da una stringa:

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

Come può un robot o una libreria di scansione di prendere questa?Si dovrebbe prendere questo utilizzando qualche strumento per il monitoraggio di accessi privati in fase di runtime.Anche se hanno costruito un tale strumento di runtime, è difficile da prendere perché questa chiamata potrebbe essere nascosto in qualche raramente esercitato percorso.

immagino guardano tutti i simboli tuo binario è il tentativo di importare (informazioni senza dubbio facilmente a loro disposizione nella tabella dei simboli dello stesso) e si ding se uno qualsiasi di quei simboli si trovano nella loro "lista API private". Abbastanza facile per automatizzare, in realtà.

Un eseguibile non è esattamente una scatola nera. Se si chiama fuori per una libreria, è una cosa facile da trovare. Questo è il motivo per cui mi lamento la perdita delle lingue di assemblaggio nelle moderne educazioni CS. =] Strumenti come LDD vi dirà quello che avete collegato in, anche se non mi ricordo cosa incarnazione di LDD fatto per il mac iPhone dev kit.

otool -L somebinary

a parte il simbolo di indagine...

apple potrebbe facilmente avere una versione del sdk che verifica tutti i metodi privati pile quando ha chiamato per assicurarsi che si è iscritto da uno dei designati metodi.

Anche se si sta collegando staticamente, nel peggiore dei casi, potrebbero prelevare campioni di codice dalle API private sulla loro lista, e cercare la vostra binario contro di loro (anche relativamente facile da automatizzare).

Conoscendo Apple, scommetterei che hanno un sistema completo, automatizzato, e ogni incertezza è probabilmente o negato o rivisto manualmente.

Fine della giornata, penso che probabilmente non vale la pena di cercare di ingannare i Apple.

Questa applicazione desktop, App Scanner , in grado di analizzare i file per uso privato API .app tirando a parte il file Mach-O binario. Se è possibile, allora Apple può troppo!

Ci sono un sacco di strumenti per il reverse engineering che permette ispezionare un codice

  • nm - elenca i simboli dai file oggetto
  • objdump -. Visualizzare le informazioni da file oggetto
  • otool - visualizzare il contenuto di Mach-O [Chi] eseguibili
  • strings -. Questo ti porterà tutte le stringhe

È possibile trovare esempi / rappresentazione di usare questi comandi in GIST per Objective-C e Swift

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