Я отправил двоичный файл в Apple без какого-либо исходного кода.
Помимо ручной проверки исходного кода, как Apple знает, что было использовано и какие API-адреса вы вызывали?
Я отправил двоичный файл в Apple без какого-либо исходного кода.
Помимо ручной проверки исходного кода, как Apple знает, что было использовано и какие API-адреса вы вызывали?
Есть три способа узнать. Это всего лишь некоторые предположения, так как я не работаю в команде Apple по обзору.
otool -L
Здесь будут перечислены все библиотеки, к которым было привязано приложение. Что-то явно не следует использовать, так как IOKit и WebKit могут быть обнаружены этим.
nm -u
Здесь перечислены все связанные символы. Это может обнаружить
UITouch._phase
(что может стать причиной отклонения приложений на основе Three20 в течение нескольких месяцев.)strings
Objective-C сохраняются в специальной области двоичного файла, поэтому Apple может извлечь из него контент и проверить, были ли вы использованы недокументированные методы Objective-C, такие как -[UIDevice setOrientation:]
.
Поскольку селектор не зависит от класса, который вы передаете, даже если ваш пользовательский класс определяет -setOrientation:
не относящийся к UIDevice, будет возможность отклонения.
Вы можете использовать Erica Sadun APIKit, чтобы обнаружить потенциальное отклонение из-за (ложных срабатываний) частных API.
(Если вы действительно действительно очень хотите обходить эти проверки, вы можете использовать функции времени выполнения, такие как
-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 ...];
Как сканировать робот или библиотеку? Им придется поймать это с помощью некоторого инструмента, который контролирует частные обращения во время выполнения. Даже если они построили такой инструмент времени выполнения, его трудно поймать, потому что этот вызов может быть скрыт в некотором редко реализуемом пути.
Я предполагаю, что они смотрят на все символы, которые ваш двоичный файл пытается импортировать (информация, без сомнения, легко доступна для них в таблице символов) и ding you, если какой-либо из этих символов найден в их "приватном списке API". На самом деле довольно легко автоматизировать.
Исполняемый файл не является черным ящиком. Если вы обратитесь в библиотеку, это легко найти. Вот почему я жалуюсь на потерю языков ассемблера в современных образованиях CS. =] Инструменты, такие как ldd, расскажут вам, с чем вы связались, хотя я не помню, какое воплощение ldd сделал это в комплекте iPhone для iPhone.
otool -L somebinary
кроме исследования символов...
Apple может очень легко иметь версию sdk, которая проверяет каждый из стеков частных методов при вызове, чтобы убедиться, что она введена из одного из указанных методов.
Даже если вы статически связываетесь, в худшем случае они могут брать образцы кода из частных API в свой список и искать в них свои двоичные файлы (также относительно легко автоматизировать).
Зная Apple, я бы поспорил, что у них есть комплексная автоматизированная система, и любая неопределенность, вероятно, либо лишена, либо рассмотрена вручную.
Конец дня, я думаю, это, вероятно, не стоило усилий, чтобы попытаться обмануть Apple.
Это настольное приложение App Scanner позволяет сканировать файлы .app для частного использования api, вытаскивая двоичный файл Mach-O. Если это возможно, то Apple тоже может!
Существует множество инструментов для обратного инжиниринга, позволяющих проверять код
nm
- перечисляет символы из объектных файлов objdump
- отображать информацию из объектных файлов.otool
- просматривать содержимое Mach-O[About] исполняемых файловstrings
- это даст вам все строки.Вы можете найти примеры/представление использования этих команд в гистах для Objective-C и Swift