Как Apple знает, что вы используете частный API?
Я отправил двоичный файл в Apple без какого-либо исходного кода.
помимо ручной проверки исходного кода, как Apple знает, что было использовано и какие API вы вызвали?
9 ответов
есть 3 способа, которые я знаю. Это всего лишь некоторые предположения, так как я не работаю в команде Apple review.
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.
(если вы действительно действительно хотите обойти эти проверки, вы можете использовать runtime такие функции, как
- функции выглядит, и dlsym
- objc_getClass, sel_registerName, objc_msgSend
-
-valueForKey:
; object_getInstanceVariable, object_getIvar и т. д.
чтобы получить эти частные библиотеки, классы, методы и ivars. )
вы можете перечислить селекторы в программе Mach-O, используя следующий однострочный в терминале:
otool -s __TEXT __objc_methname "" |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; objective C позволяет вам построить любой SEL из строки:
SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
[UIDevice performSelector:my_sel ...];
как робот или библиотека сканирования поймать это? Они должны были бы поймать это, используя какой-то инструмент, который контролирует частные доступы во время выполнения. Даже если они создали такой инструмент выполнения, его трудно поймать, потому что этот вызов может быть скрыт в каком-то редко используемом пути.
Я предполагаю, что они смотрят на все символы, которые ваш двоичный файл пытается импортировать (информация, без сомнения, легко доступна для них в таблице символов) и ding вас, если какой-либо из этих символов найден в их "частном списке API". Довольно легко автоматизировать, на самом деле.
исполняемый файл-это не совсем черный ящик. Если вы звоните в библиотеку, это легко найти. Вот почему я сожалею о потере ассемблерных языков в современном образовании CS. = ] Инструменты, такие как ldd, расскажут вам, что вы связали, хотя я не помню, какое воплощение ldd сделало его для Mac iPhone dev kit.
даже если вы статически связываете, в худшем случае, они могут взять образцы кода из частных API в своем списке и искать ваш двоичный файл против них (также относительно легко автоматизировать).
зная Apple, я бы поспорил, что у них есть всеобъемлющая автоматизированная система, и любая неопределенность, вероятно, либо отрицается, либо пересматривается вручную.
В конце концов, я думаю, что это, вероятно, не стоит усилий, чтобы попытаться обмануть Apple.
это настольное приложение,Сканер, может сканировать .файлы приложений для частного использования api, разделяя двоичный файл Mach-O. Если он может, то Apple может!
помимо исследования символов...
apple может очень легко иметь версию sdk, которая проверяет каждый из стеков частных методов при вызове, чтобы убедиться, что он введен из одного из назначенных методов.