Come fa Apple a sapere che stai utilizzando un'API privata?


109

Ho inviato un file binario ad Apple senza alcun codice sorgente.

Oltre a controllare manualmente il codice sorgente, come fa Apple a sapere cosa è stato utilizzato e quali API hai chiamato?


titolo cambiato - Suppongo che tu intendessi "Come fa Apple a saperlo .."
Anurag

Risposte:


173

Ci sono 3 modi che conosco. Queste sono solo alcune speculazioni, dal momento che non lavoro nel team di revisione di Apple.

1. 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.

2. nm -u

Questo elencherà tutti i simboli collegati. Questo può rilevare

3. Elenco dei selettori Objective-C, o 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

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

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


Bella risposta. Aggiungerò solo che se la tua applicazione sta facendo qualcosa che è estremamente difficile da fare senza utilizzare un'API privata, sono sicuro che la tua app riceverà un controllo extra.
Matthew Frederick

Sono curioso della soluzione alternativa per chiamare metodi privati. Penso che il compilatore genererà la chiamata a objc_msgSend (foo, @selector (privateMethod)) per [foo privateMethod], quindi se Apple può rilevare la chiamata diretta di privateMethod possono anche rilevare la chiamata indiretta tramite objc_msgSend (o performSelector :).
an0

Mi chiedo perché dici che non dovresti collegarti a IOKit e WebKit?
hjaltij

2
Su cosa esegui otool? Il file .app?
Rob

1
@ Eric, potrebbero , anche se una versione così strumentata avrebbe probabilmente un impatto sulle prestazioni. Indipendentemente da ciò, vedendo API private entrare ripetutamente nell'App Store, è chiaro che non lo fanno, o almeno non lo fanno sempre.
Nate

26

È 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/,$_))))))'

+1, @Robert Diamond, puoi descrivere di più per lo stesso. Devo controllare che Google Analytics utilizzi la chiamata UDID o meno. Grazie
Mangesh

13

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.


user1203764 commenta che questo tipo di chiamate può effettivamente essere rilevato
Rup

@ Rup vuole esprimere un'opinione sulla mia domanda sull'uso di valueForKey, per favore? stackoverflow.com/questions/11923597/...
Dan Rosenstark

1
@Yar domanda interessante! Ma non sono abbastanza esperto per commentare scusa. Quello che ha detto Farcaller mi sembra ragionevole
Rup

Grazie @Rup, a quanto pare nessuno è abbastanza esperto in questo campo :)
Dan Rosenstark

Qualcuno che conosco dice di aver appena ricevuto una chiamata come questa nell'App Store.
bugloaf

7

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.


1
In realtà, posso dire con certezza che questo non è il caso (almeno non è tutto ciò che fanno), sulla base dell'utilizzo di API private che so che è passato. Se questo è tutto ciò che era necessario, l'utilizzo dell'API privata non sarebbe sfuggito . La mia esperienza suggerisce che la risposta di KennyTM è quasi certamente corretta. Questa è un'area in cui Objective-C è fondamentalmente diverso da altre lingue, come C.
Nate

1

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.


1
Mi sono spesso chiesto: se dovessi scrivere il tuo binario per auto-modificarlo, generando il codice per importare un'API privata solo dopo che alcuni criteri sono stati soddisfatti (ad esempio, dopo la data di pubblicazione della tua app) se Apple lo catturerebbe. Certamente ci riportano alcune statistiche interessanti, come il numero dei nostri giochi che vengono eseguiti su telefoni jailbreak.
Sniggerfardimungus

@ user30997, Probabilmente è possibile accedere al codice privilegiato solo tramite una chiamata di sistema; il thread in esecuzione passa a un privilegio più alto e controlla se il privilegio precedente ha i permessi per eseguire il codice o meno. Questo è solo un esempio, ci sono altri modi per farlo, ma dubito fortemente che gli sviluppatori siano stati così ingenui da tralasciare un meccanismo di controllo dei privilegi di runtime di base come questo, che sarebbe stato sicuramente pubblicizzato ormai.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳


1

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.


Ciò non sarà sufficiente, perché il programma può chiamare questa chiamata privata solo in un momento arbitrario in futuro, a seconda di un'altra logica. Per eseguire questo controllo, Apple deve effettivamente bloccare del tutto le API private o fare in modo che i framework segnalino automaticamente le chiamate API private ad Apple, il che danneggia in modo significativo le prestazioni.
Motti Shneor

0

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.


4
Conoscere Apple durante il processo di revisione dopo aver riscontrato qualsiasi incertezza comporta lo scoppio di una serie di dadi per la massima fantasia.
SOLO LA MIA OPINIONE corretta

0

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!


0

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.