Я отправил двоичный файл Apple без любого исходного кода.
Кроме ручной проверки исходного кода, как Apple знает то, что использовалось и какие API Вы назвали?
Я знаю 3 способа. Это всего лишь предположения, поскольку я не работаю в группе проверки Apple.
otool -L
Здесь будут перечислены все библиотеки, с которыми связано приложение. То, что вам явно не следует использовать, например, IOKit и WebKit, могут быть обнаружены этим.
nm -u
Это список всех связанных символов. Это может обнаруживать
UITouch._phase
(что могло быть причиной отказа Приложения на базе Three20 за последние несколько месяцев.) строк
Селекторы Objective-C хранятся в специальной области двоичного файла, и поэтому Apple может извлечь оттуда контент и проверить, использовали ли вы недокументированный Objective-C методы, такие как - [UIDevice setOrientation:]
.
Поскольку селекторы не зависят от класса, с которым вы отправляете сообщения, , даже если ваш пользовательский класс определяет -setOrientation:
, не имеющий отношения к UIDevice, будет возможность отклонения.
Вы можете использовать APIKit Эрики Садун для обнаружения потенциального отказа из-за (ложных срабатываний) частных API.
(Если вы действительно действительно хотите обойти эти проверки, вы можете использовать функции времени выполнения, такие как
-valueForKey:
; object_getInstanceVariable, object_getInstanceVariable, object_getInstanceVariable, object_getInstanceVariable и т. д. , чтобы получить эти частные библиотеки, классы, методы и ivars.)
Даже если вы статически связываетесь, в худшем случае они могут взять образцы кода из частных API-интерфейсов в своем списке и выполнить поиск вашего двоичного файла по ним (также относительно легко автоматизировать).
Зная Apple, я готов поспорить, что у них есть комплексная автоматизированная система, и любая неопределенность, вероятно, либо отрицается, либо проверяется вручную.
В конце концов, я думаю, что попытки обмануть Apple не стоит.
Исполняемый файл - это не совсем черный ящик. Если вы обратитесь к библиотеке, ее легко найти. Вот почему я сетую на потерю языков ассемблера в современном образовании CS. =] Инструменты вроде ldd подскажут вам, что вы подключили, хотя я не помню, какая инкарнация ldd попала в набор разработчика mac iPhone.
Я представляю, что они просматривают все символы, которые ваш бинарник пытается импортировать (информация, несомненно, легко доступна им в таблице символов), и вычисляют вас, если любой из этих символов найден в их "частном списке API". На самом деле, это довольно легко автоматизировать.
Предположим, вы хотите использовать какой-то частный API; Objective C позволяет построить любой SEL из строки:
SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
[UIDevice performSelector:my_sel ...];
Как сканирование робота или библиотеки может уловить это? Они должны были бы поймать это с помощью какого-то инструмента, который отслеживает частные доступы во время выполнения. Даже если бы они создали такой инструмент времени выполнения, его трудно поймать, потому что этот вызов может быть скрыт в каком-то редко тренируемом пути.