Как Apple знает об использовании частного API?

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

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

109
задан Tim Ferrell 27 August 2014 в 19:41
поделиться

6 ответов

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

1. otool -L

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

2. nm -u

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

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

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

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

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


Вы можете использовать APIKit Эрики Садун для обнаружения потенциального отказа из-за (ложных срабатываний) частных API.


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

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

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

171
ответ дан 24 November 2019 в 03:22
поделиться

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

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

В конце концов, я думаю, что попытки обмануть Apple не стоит.

0
ответ дан 24 November 2019 в 03:22
поделиться

Исполняемый файл - это не совсем черный ящик. Если вы обратитесь к библиотеке, ее легко найти. Вот почему я сетую на потерю языков ассемблера в современном образовании CS. =] Инструменты вроде ldd подскажут вам, что вы подключили, хотя я не помню, какая инкарнация ldd попала в набор разработчика mac iPhone.

1
ответ дан 24 November 2019 в 03:22
поделиться
otool -L somebinary
1
ответ дан 24 November 2019 в 03:22
поделиться

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

7
ответ дан 24 November 2019 в 03:22
поделиться

Предположим, вы хотите использовать какой-то частный API; Objective C позволяет построить любой SEL из строки:

   SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
    [UIDevice performSelector:my_sel ...];

Как сканирование робота или библиотеки может уловить это? Они должны были бы поймать это с помощью какого-то инструмента, который отслеживает частные доступы во время выполнения. Даже если бы они создали такой инструмент времени выполнения, его трудно поймать, потому что этот вызов может быть скрыт в каком-то редко тренируемом пути.

12
ответ дан 24 November 2019 в 03:22
поделиться