Как Apple знает, что вы используете частный API?

Я отправил двоичный файл в Apple без какого-либо исходного кода.

Помимо ручной проверки исходного кода, как Apple знает, что было использовано, и какие API вы назвали?

Есть три способа узнать. Это всего лишь некоторые предположения, так как я не работаю в команде Apple по обзору.

1. otool -L

В этом списке будут перечислены все библиотеки, к которым приложение подключилось. Что-то явно не следует использовать, так как IOKit и WebKit могут быть обнаружены этим.

2. nm -u

В нем будут перечислены все связанные символы. Это может обнаружить

  • Недокументированные функции C, такие как _UIImageWithName;
  • Классы Objective-C, такие как UIProgressHUD
  • Ivars, такие как UITouch._phase (что может стать причиной отказа от приложений на основе Three20 за последние несколько месяцев).

3. Перечисление селекторов Objective-C или strings

Селекторы Objective-C хранятся в специальной области двоичного файла, поэтому Apple может извлечь из него контент и проверить, были ли вы использованы некоторые недокументированные методы Objective-C, такие как -[UIDevice setOrientation:] .

Поскольку селекторы не зависят от classа, в котором вы -setOrientation: сообщения, даже если ваш пользовательский class определяет -setOrientation: не имеет отношения к UIDevice, будет возможность отклонения.


Вы можете использовать APIKit от Erica Sadun, чтобы обнаружить потенциальное отклонение из-за (ложных срабатываний) частных API.


(Если вы действительно действительно действительно хотите обходить эти проверки, вы можете использовать функции времени выполнения, такие как

  • dlopen, dlsym
  • objc_getClass, sel_registerName, objc_msgSend
  • -valueForKey: object_getInstanceVariable, object_getIvar и т. д.

получить эти частные библиотеки, classы, методы и ивары. )

Вы можете перечислить селектора в программе 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 

Даже если вы статически связываетесь, в худшем случае они могут брать образцы кода из частных API в свой список и искать в них свои двоичные файлы (также относительно легко автоматизировать).

Зная Apple, я бы сказал, что у них есть всеобъемлющая автоматизированная система, и любая неопределенность, вероятно, либо лишена, либо будет рассмотрена вручную.

Конец дня, я думаю, что это, вероятно, не стоит усилий, чтобы попытаться обмануть Apple.

Это настольное приложение App Scanner позволяет сканировать файлы .app для частного использования api, вытаскивая двоичный файл Mach-O. Если это возможно, то Apple тоже может!

кроме изучения символов …

Apple может очень легко иметь версию sdk, которая проверяет каждый из стеков частных методов при вызове, чтобы убедиться, что он введен с одного из указанных методов.

Давайте будем гением компьютера.