Antworten:
Ich kenne drei Möglichkeiten. Dies sind nur einige Spekulationen, da ich nicht im Apple Review Team arbeite.
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.
nm -u
Dadurch werden alle verknüpften Symbole aufgelistet. Dies kann erkennen
UITouch._phase
(was die Ursache für die Ablehnung von Three20-basierten Apps in den letzten Monaten sein könnte.)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
-valueForKey:
;; object_getInstanceVariable, object_getIvar usw.um diese privaten Bibliotheken, Klassen, Methoden und Ivars zu bekommen. )
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/,$_))))))'
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.
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.
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.
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.
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.
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!
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] anstrings
- das bringt dir alle Saiten.Beispiele / Darstellungen zur Verwendung dieser Befehle finden Sie in den Listen für Objective-C und Swift