Як Apple знає, що ви використовуєте приватний API?


109

Я подав бінарний файл в Apple без жодного вихідного коду.

Крім того, що вручну перевіряти вихідний код, як Apple знає, що використовувалося та які API ви викликали?


змінив назву - я думаю, ви мали на увазі "Як Apple знає .."
Анураг

Відповіді:


173

Я знаю 3 способи. Це лише певні домисли, оскільки я не працюю в команді з огляду Apple.

1. otool -L

У цьому списку будуть вказані всі бібліотеки, до яких додаток пов’язано. Щось, очевидно, ви не повинні використовувати, наприклад, IOKit і WebKit можна виявити цим.

2. nm -u

Тут буде перераховано всі пов'язані символи. Це може виявити

3. Лістинг селекторів Objective-C, або strings

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

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


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


(Якщо ви дійсно дуже хочете вирішити ці перевірки, ви можете використовувати такі функції виконання, як

  • dlopen, dlsym
  • objc_getClass, sel_registerName, objc_msgSend
  • -valueForKey:; object_getInstanceVariable, object_getIvar тощо.

отримати ті приватні бібліотеки, класи, методи та івари. )


Чудова відповідь. Я просто додам, що якщо у вашій програмі робиться щось надзвичайно складно без використання приватного API, я впевнений, що ваш додаток додатково перевіряє.
Меттью Фредерік

Мені цікаво подолати приватні методи. Я думаю, що компілятор генерує виклик до objc_msgSend (foo, @selector (privateMethod)) для [foo privateMethod], тож якщо Apple може виявити прямий виклик privateMethod, вони також можуть виявити непрямий виклик через objc_msgSend (або performSelector :).
an0

Мені цікаво, чому ви кажете, що не слід зв'язуватися проти IOKit та WebKit?
hjaltij

2
На чому ви виконуєте отоол? Файл .app?
Роб

1
@Eric, вони могли , хоча така інструментальна версія, мабуть, вплине на продуктивність. Незважаючи на те, що приватні API неодноразово проникають у App Store, зрозуміло, що вони цього не роблять, або принаймні не роблять це постійно.
Нейт

26

Ви можете перерахувати селектори в програмі 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/,$_))))))'

+1, @Robert Diamond, чи можете ви описати більше того ж. Мені потрібно перевірити, чи використовує Google аналітичний дзвінок UDID чи ні. Спасибі
Мангеш

13

Скажімо, ви хочете використовувати приватний API; мета C дозволяє побудувати будь-який SEL з рядка:

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

Як робот чи бібліотека могли сканувати це? Їм доведеться зафіксувати це за допомогою певного інструменту, який контролює приватний доступ під час виконання. Навіть якщо вони побудували такий інструмент виконання, важко зловити, тому що цей виклик може бути прихований у якомусь рідко здійсненому шляху.


user1203764 коментує, що подібні дзвінки дійсно можна виявити
Rup

@Rup хочете висловити свою думку на питання про використання valueForKey, будь ласка? stackoverflow.com/questions/11923597/…
Дан Розенстарк

1
@Yar цікаве запитання! Але мені недостатньо експерта, щоб прокоментувати вибачення. Те, що сказав Фаркаллер, мені здається розумним
Rup

Дякую @Rup, очевидно, ніхто не вистачає експерта в цій галузі :)
Dan Rosenstark

Хтось, кого я знаю, каже, що він щойно отримав такий дзвінок у App Store.
bugloaf

7

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


1
Насправді я можу з впевненістю сказати, що це не так (принаймні, це не все, що вони роблять), грунтуючись на приватному використанні API, яке я знаю. Якщо це все, що потрібно, приватне використання API не проскочить . Мій досвід говорить про те, що відповідь KennyTM майже напевно правильна. Це область, де Objective-C принципово відрізняється від інших мов, наприклад, C.
Нейт

1

Виконавчий файл - це не зовсім чорна скринька. Якщо ви телефонуєте до бібліотеки, це легко знайти. Ось чому я скаржуюся на втрату асемблерних мов у сучасній освіті CS. =] Інструменти, такі як ldd, скажуть вам, що ви пов’язали, хоча я не пам’ятаю, яке втілення ldd зробило його набором для Mac Mac Dev Kit.


1
Я часто замислювався: якщо ви повинні написати свій двійковий файл для самовиправлення, генеруючи код для імпорту приватного API після того, як були виконані деякі критерії (скажімо, після дати публікації вашої програми), чи захопить Apple це. Вони, безумовно, повідомляють нам про цікаву статистику, наприклад, про кількість наших ігор, які проводяться на в'язаних телефонах.
Sniggerfardimungus

@ user30997, Привілейований код може бути доступний лише через системний виклик; виконувальний потік перемикається на більш високу привілей та перевіряє, чи має попередній привілей дозволи на виконання коду чи ні. Це лише приклад, але існують і інші способи цього зробити, але я дуже сумніваюся, що розробники були досить наївні, щоб не допустити базового механізму перевірки привілеїв під час виконання, такого як цей, він би напевно вже був оприлюднений.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳


1

окрім розслідування символів ...

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


Цього буде недостатньо, оскільки програма може в майбутньому викликати цей приватний дзвінок лише довільно, залежно від інших логік. Для цього слід перевірити, що Apple фактично взагалі блокує приватні API, або матимуть фреймворки автоматично повідомляти про приватні дзвінки API в Apple - це значно погіршує продуктивність.
Motti Shneor

0

Навіть якщо ви стаціонарно зв’язуєтесь, в гіршому випадку вони можуть брати зразки коду з приватних API в їх списку та здійснювати пошук у вашому бінарному файлі (також відносно легко автоматизувати).

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

Кінець дня, я думаю, що, мабуть, не варто докладати зусиль, щоб спробувати обдурити Apple.


4
Знання Apple щодо їхнього процесу перегляду при виявленні будь-якої невизначеності передбачає розбиття набору кісток для максимальної примхи.
ДАЙТЕ МОЕ правильне ДУМКА

0

Цей настільний додаток, Сканер додатків , може сканувати .app файли для приватного користування api, відчепивши файл Mach-O Binary. Якщо це може, то і Apple може!


0

Існує маса інструментів зворотної інженерії, які дозволяють перевірити код

  • nm - перераховує символи з об’єктних файлів
  • objdump - відображення інформації з об’єктних файлів.
  • otool- перегляд вмісту виконуваних файлів Mach-O [About]
  • strings - це отримає у вас всі струни.

Ви можете знайти приклади / представлення використання цих команд у списках для Objective-C і Swift

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.