Woher weiß Apple, dass Sie eine private API verwenden?


109

Ich habe eine Binärdatei ohne Quellcode an Apple gesendet.

Woher weiß Apple neben der manuellen Überprüfung des Quellcodes, was verwendet wurde und welche APIs Sie aufgerufen haben?


geänderter Titel - Ich nehme an, Sie meinten "Woher weiß Apple ..."
Anurag

Antworten:


173

Ich kenne drei Möglichkeiten. Dies sind nur einige Spekulationen, da ich nicht im Apple Review Team arbeite.

1. otool -L

Dadurch werden alle Bibliotheken aufgelistet, mit denen die App verknüpft ist. Etwas, das Sie eindeutig nicht verwenden sollten, wie IOKit und WebKit, kann dadurch erkannt werden.

2. nm -u

Dadurch werden alle verknüpften Symbole aufgelistet. Dies kann erkennen

  • Undokumentierte C-Funktionen wie _UIImageWithName;
  • Objective-C-Klassen wie UIProgressHUD
  • Ivars wie UITouch._phase(was die Ursache für die Ablehnung von Three20-basierten Apps in den letzten Monaten sein könnte.)

3. Auflisten der Objective-C-Selektoren oder strings

Objective-C-Selektoren werden in einem speziellen Bereich der Binärdatei gespeichert. Daher kann Apple den Inhalt von dort extrahieren und prüfen, ob Sie einige undokumentierte Objective-C-Methoden verwendet haben, z -[UIDevice setOrientation:].

Da Selektoren unabhängig von der Klasse sind, für die Sie Nachrichten senden, besteht die Möglichkeit, dass sie abgelehnt werden , auch wenn Ihre benutzerdefinierte Klasse -setOrientation:für UIDevice irrelevant ist.


Sie können das APIKit von Erica Sadun verwenden , um eine mögliche Ablehnung aufgrund von (Fehlalarmen) privater APIs zu erkennen.


(Wenn Sie diese Überprüfungen wirklich wirklich wirklich wirklich umgehen möchten, können Sie Laufzeitfunktionen wie verwenden

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

um diese privaten Bibliotheken, Klassen, Methoden und Ivars zu bekommen. )


Gute Antwort. Ich füge nur hinzu, dass wenn Ihre Anwendung etwas tut, das ohne die Verwendung einer privaten API äußerst schwierig ist, ich sicher bin, dass Ihre App einer zusätzlichen Prüfung unterzogen wird.
Matthew Frederick

Ich bin gespannt auf die Problemumgehung beim Aufrufen privater Methoden. Ich denke, der Compiler generiert einen Aufruf von objc_msgSend (foo, @selector (privateMethod)) für [foo privateMethod]. Wenn Apple also den direkten Aufruf von privateMethod erkennen kann, kann er den indirekten Aufruf auch über objc_msgSend (oder performSelector :) erkennen.
an0

Ich frage mich, warum Sie sagen, dass Sie nicht gegen IOKit und WebKit verlinken sollten?
Hjaltij

2
Worauf führen Sie otool aus? Die .app-Datei?
Rob

1
@Eric, sie könnten , obwohl eine solche instrumentierte Version wahrscheinlich die Leistung beeinträchtigen würde. Unabhängig davon, ob private APIs wiederholt in den App Store gelangen, ist klar, dass sie dies nicht oder zumindest nicht immer tun.
Nate

26

Sie können die Selektoren in einem Mach-O-Programm mit dem folgenden Einzeiler im Terminal auflisten:

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, Können Sie mehr für dasselbe beschreiben? Ich muss überprüfen, ob Google Analytic einen UDID-Aufruf verwendet oder nicht. Danke
Mangesh

13

Angenommen, Sie möchten eine private API verwenden. Mit Ziel C können Sie jedes SEL aus einer Zeichenfolge erstellen:

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

Wie könnte ein Roboter- oder Bibliotheksscan dies erfassen? Sie müssten dies mit einem Tool abfangen, das private Zugriffe zur Laufzeit überwacht. Selbst wenn sie ein solches Laufzeit-Tool erstellt haben, ist es schwer zu erfassen, da dieser Aufruf möglicherweise in einem selten ausgeübten Pfad versteckt ist.


user1203764 kommentiert, dass diese Art von Anrufen tatsächlich erkannt werden kann
Rup

@ Rup möchte hier eine Meinung zu meiner Frage zur Verwendung von valueForKey abgeben, bitte? stackoverflow.com/questions/11923597/…
Dan Rosenstark

1
@ Ihre interessante Frage! Aber ich bin nicht genug Experte, um mich zu entschuldigen. Was Farcaller sagte, erscheint mir vernünftig
Rup

Danke @ Rup, niemand ist anscheinend genug von einem Experten auf diesem Gebiet :)
Dan Rosenstark

Jemand, den ich kenne, sagt, er habe gerade einen solchen Anruf im App Store erhalten.
Bugloaf

7

Ich stelle mir vor, sie sehen sich alle Symbole an, die Ihre Binärdatei zu importieren versucht (Informationen, die ihnen zweifellos in der Symboltabelle leicht zugänglich sind) und Sie benachrichtigen, wenn eines dieser Symbole in ihrer "privaten API-Liste" gefunden wird. Tatsächlich ziemlich einfach zu automatisieren.


1
Eigentlich kann ich mit Sicherheit sagen, dass dies nicht der Fall ist (zumindest ist es nicht alles, was sie tun), basierend auf der privaten API-Nutzung, von der ich weiß, dass sie durchgekommen ist. Wenn das alles ist, was man braucht, würde private API - Nutzung nicht rutschen durch. Meine Erfahrung zeigt, dass die Antwort von KennyTM mit ziemlicher Sicherheit richtig ist. Dies ist ein Bereich, in dem sich Objective-C grundlegend von anderen Sprachen wie C unterscheidet.
Nate

1

Eine ausführbare Datei ist nicht gerade eine Black Box. Wenn Sie eine Bibliothek anrufen, ist dies leicht zu finden. Deshalb beklage ich den Verlust der Assemblersprachen in modernen CS-Ausbildungen. =] Tools wie ldd werden Ihnen sagen, was Sie verlinkt haben, obwohl ich mich nicht erinnere, welche Inkarnation von ldd es in das Mac iPhone Dev Kit geschafft hat.


1
Ich habe mich oft gefragt: Wenn Sie Ihre Binärdatei zur Selbständerung schreiben und den Code zum Importieren einer privaten API erst generieren, nachdem einige Kriterien erfüllt wurden (z. B. nach dem Veröffentlichungsdatum Ihrer App), ob Apple sie abfangen würde. Sie berichten uns sicherlich einige interessante Statistiken, wie die Anzahl unserer Spiele, die auf Telefonen mit Jailbreak ausgeführt werden.
Sniggerfardimungus

@ user30997, Auf den privilegierten Code kann wahrscheinlich nur über einen Systemaufruf zugegriffen werden. Der ausführende Thread wechselt in eine höhere Berechtigung und prüft, ob die vorherige Berechtigung zum Ausführen des Codes berechtigt ist oder nicht. Das ist nur ein Beispiel, es gibt andere Möglichkeiten, aber ich bezweifle sehr, dass die Entwickler naiv genug waren, um einen grundlegenden Mechanismus zur Überprüfung von Laufzeitprivilegien wie diesen wegzulassen. Er wäre definitiv inzwischen veröffentlicht worden.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳


1

abgesehen von der Symboluntersuchung ...

Apple könnte sehr leicht eine Version des SDK haben, die jeden der privaten Methodenstapel beim Aufruf überprüft, um sicherzustellen, dass er von einer der angegebenen Methoden eingegeben wird.


Das wird nicht ausreichen, da das Programm diesen privaten Aufruf abhängig von anderer Logik nur zu einem beliebigen Zeitpunkt in der Zukunft aufrufen kann. Um diese Prüfung durchzuführen, muss Apple private APIs tatsächlich vollständig blockieren oder die Frameworks private API-Aufrufe automatisch an Apple melden lassen - was die Leistung erheblich beeinträchtigt.
Motti Shneor

0

Selbst wenn Sie statisch verknüpfen, können sie im schlimmsten Fall Beispiele des Codes aus den privaten APIs auf ihrer Liste entnehmen und Ihre Binärdatei danach durchsuchen (auch relativ einfach zu automatisieren).

Wenn ich Apple kenne, würde ich wetten, dass sie ein umfassendes, automatisiertes System haben und dass jede Unsicherheit wahrscheinlich entweder geleugnet oder manuell überprüft wird.

Letztendlich denke ich, dass es wahrscheinlich nicht die Mühe wert ist, Apple zum Narren zu halten.


4
Wenn Sie wissen, dass Apple bei Ungewissheit einen Überprüfungsprozess durchführt, müssen Sie eine Reihe von Würfeln ausbrechen, um maximale Laune zu erzielen.
NUR MEINE RICHTIGE MEINUNG

0

Diese Desktop-Anwendung, App Scanner , kann .app-Dateien für die private API-Verwendung scannen, indem die Mach-O-Binärdatei auseinandergezogen wird. Wenn es geht, kann es auch Apple!


0

Es gibt viele Tools für das Reverse Engineering, mit denen ein Code überprüft werden kann

  • nm - listet die Symbole aus Objektdateien auf
  • objdump - Informationen aus Objektdateien anzeigen.
  • otool- Zeigen Sie den Inhalt der ausführbaren Dateien von Mach-O [About] an
  • strings - das bringt dir alle Saiten.

Beispiele / Darstellungen zur Verwendung dieser Befehle finden Sie in den Listen für Objective-C und Swift

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.