Как Apple узнает, что вы используете частный API?
Я отправил двоичный файл в Apple без какого-либо исходного кода.
Помимо ручной проверки исходного кода, как Apple узнает, что использовалось и какие API вы вызывали?
9 ответов
Есть 3 способа, которые я знаю. Это всего лишь некоторые предположения, так как я не работаю в команде обзора Apple.
1. otool -L
Это перечислит все библиотеки, с которыми связано приложение. Что-то явно не следует использовать, например, IOKit и WebKit могут быть обнаружены этим.
2. nm -u
Это будет список всех связанных символов. Это может обнаружить
- Недокументированные функции C, такие как _UIImageWithName;
- Классы Objective-C, такие как UIProgressHUD
- Такие ивары как
UITouch._phase
(что может стать причиной отказа от приложений на базе Three20 в последние несколько месяцев.)
3. Список селекторов Objective-C, или strings
Селекторы Objective-C хранятся в специальной области двоичного файла, и поэтому Apple может извлечь из них содержимое и проверить, не использовали ли вы недокументированные методы Objective-C, такие как -[UIDevice setOrientation:]
,
Поскольку селекторы не зависят от класса, которым вы отправляете сообщения, даже если ваш пользовательский класс определяет -setOrientation:
не имеет отношения к UIDevice, будет возможность быть отклоненным.
Вы можете использовать APIKit Эрики Садун для обнаружения потенциального отклонения из-за (ложных срабатываний) частных API.
(Если вы действительно действительно хотите обойти эти проверки, вы можете использовать такие функции времени выполнения, как
- dlopen, dlsym
- objc_getClass, sel_registerName, objc_msgSend
-valueForKey:
; object_getInstanceVariable, object_getIvar и т. д.
чтобы получить эти частные библиотеки, классы, методы и ivars.)
Вы можете перечислить селекторы в программе Mach-O, используя следующую однострочную строку в Терминале:
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/,$_))))))'
Допустим, вы хотите использовать какой-то частный API; Цель C позволяет вам построить любой SEL из строки:
SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
[UIDevice performSelector:my_sel ...];
Как может робот или библиотека сканировать это? Они должны были бы поймать это, используя некоторый инструмент, который контролирует частные доступы во время выполнения. Даже если они сконструировали такой инструмент времени выполнения, его трудно поймать, потому что этот вызов может быть скрыт в некотором редко используемом пути.
Я предполагаю, что они смотрят на все символы, которые ваш двоичный файл пытается импортировать (информация, без сомнения, легко доступна для них в таблице символов) и определяют, найден ли какой-либо из этих символов в их "частном списке API". На самом деле довольно легко автоматизировать.
Исполняемый файл не совсем черный ящик. Если вы взываете в библиотеку, это легко найти. Вот почему я оплакиваю потерю языков ассемблера в современных образованиях CS. =] Такие инструменты, как ldd, расскажут вам, что вы связали, хотя я не помню, какое воплощение ldd сделало это для девайса Mac iPhone.
Кроме исследования символа...
Apple может очень легко иметь версию sdk, которая проверяет каждый из стеков частных методов при вызове, чтобы убедиться, что он введен одним из назначенных методов.
Даже если вы используете статические ссылки, в худшем случае они могут взять образцы кода из частных API-интерфейсов в своем списке и выполнить поиск по ним в двоичном файле (их также относительно легко автоматизировать).
Зная Apple, я бы поспорил, что у них есть всеобъемлющая автоматизированная система, и любая неопределенность, вероятно, либо опровергается, либо проверяется вручную.
В конце концов, я думаю, что попытка обмануть Apple не стоит.
Существует множество инструментов для реверс-инжиниринга, позволяющих проверять код.
nm
- перечисляет символы из объектных файловobjdump
- отображать информацию из объектных файлов.otool
- просматривать содержимое исполняемых файлов Mach-O [About]strings
- это даст вам все ниточки.
Вы можете найти примеры / представление использования этих команд в сущности для Objective-C и Swift.
Это настольное приложение, App Scanner, может сканировать.app-файлы для личного использования API-интерфейса, разбирая двоичный файл Mach-O. Если это возможно, то Apple тоже может!