Skąd Apple wie, że używasz prywatnego API?

Wysłałem plik binarny do Apple bez żadnego kodu źródłowego.

Oprócz ręcznego sprawdzania kodu źródłowego skąd Apple wie, co zostało użyte i jakie API nazwałeś?

Author: Tim Ferrell, 2010-05-16

9 answers

Znam trzy sposoby. To tylko spekulacje, ponieważ nie pracuję w zespole Apple review.

1. otool -L

Wyświetli listę wszystkich bibliotek, do których aplikacja jest połączona. Coś wyraźnie nie należy używać, jak IOKit i WebKit można wykryć przez to.

2. nm -u

Wyświetli listę wszystkich połączonych symboli. To może wykryć

  • nieudokumentowane funkcje C, takie jak _UIImageWithName;
  • Objective - C klasy takie jak UIProgressHUD
  • Ivars takie jak UITouch._phase (co może być przyczyną odrzucenia aplikacji opartych na Three20 w ciągu ostatnich kilku miesięcy.)

3. Lista selektorów Objective-C lub strings

Selektory Objective-C są przechowywane w specjalnym obszarze binarnym, dlatego Apple może wyodrębnić z niego zawartość i sprawdzić, czy użyto nieudokumentowanych metod Objective-C, takich jak -[UIDevice setOrientation:].

Ponieważ selektory są niezależne od klasy, którą wysyłasz, nawet jeśli twoja niestandardowa Klasa zdefiniuje -setOrientation: nieistotne dla UIDevice, istnieje możliwość odrzucenia.


Możesz użyć APIKit Eriki Sadun, aby wykryć potencjalne odrzucenie z powodu (fałszywych alarmów) prywatnych interfejsów API.

(Jeśli naprawdę naprawdę chcesz obejść te kontrole, możesz użyć funkcji runtime, takich jak

  • dlopen, dlsym
  • objc_getClass, sel_registerName, objc_msgSend
  • -valueForKey:; object_getInstanceVariable, object_getIvar itp.

Aby zdobyć te prywatne biblioteki, klasy, metody i Ivary. )

 161
Author: kennytm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-16 07:18:39

Możesz wyświetlić listę selektorów w programie Mach-O używając następującej Jedynki w Terminalu:

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/,$_))))))'
 25
Author: Robert Diamond,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-02 15:57:17

Załóżmy, że chcesz użyć jakiegoś prywatnego API; objective C pozwala na zbudowanie dowolnego Sel z ciągu znaków:

   SEL my_sel = NSSelectorFromString([NSString stringWithFormat:\
@"%@%@%@", "se","tOr","ientation:"]);
    [UIDevice performSelector:my_sel ...];
Jak robot lub skaner biblioteki mogą to złapać? Musieliby to złapać za pomocą jakiegoś narzędzia, które monitoruje prywatne dostępy w czasie wykonywania. Nawet jeśli stworzyli takie narzędzie runtime, trudno je złapać, ponieważ to wywołanie może być ukryte w rzadko wykonywanej ścieżce.
 12
Author: Chris McLuvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-25 16:43:53

Wyobrażam sobie, że patrzą na wszystkie symbole, które twój binarny próbuje zaimportować (informacje bez wątpienia łatwo dostępne dla nich w tabeli symboli) i sprawdzają, czy któryś z tych symboli znajduje się na ich"liście prywatnego API". Całkiem łatwe do zautomatyzowania, w rzeczywistości.

 7
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-16 02:09:52

Plik wykonywalny nie jest do końca czarną skrzynką. Jeśli zadzwonisz do biblioteki, łatwo ją znaleźć. Dlatego też ubolewam nad utratą języków asemblacyjnych we współczesnej edukacji CS. = ] Narzędzia takie jak ldd powiedzą ci co linkowałeś, choć nie pamiętam jakie wcielenie ldd do Mac iPhone Dev kit.

 1
Author: Sniggerfardimungus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-16 02:11:16
otool -L somebinary
 1
Author: dvenema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-16 06:43:14

Nawet jeśli łączysz statycznie, w najgorszym wypadku mogą pobrać próbki kodu z prywatnych interfejsów API z ich listy i przeszukać Twoje dane binarne (również stosunkowo łatwe do zautomatyzowania).

Znając Apple, założę się, że mają kompleksowy, zautomatyzowany system, a każda niepewność jest prawdopodobnie odrzucana lub sprawdzana ręcznie.

Pod koniec dnia, myślę, że prawdopodobnie nie warto próbować oszukać Apple.

 0
Author: wash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-16 02:17:27

Ta aplikacja desktopowa, App Scanner , może skanować .pliki aplikacji do użytku prywatnego API poprzez rozłączenie pliku binarnego Mach-O. Jeśli może, to Apple też może!

 0
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-07 12:57:02

Poza badaniem symboli...

Apple może bardzo łatwo mieć wersję sdk, która sprawdza stosy każdej z prywatnych metod, gdy jest wywoływana, aby upewnić się, że jest wprowadzana z jednej z wyznaczonych metod.

 0
Author: Grady Player,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-08 16:58:30