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ś?
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. )
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/,$_))))))'
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.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.
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.
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
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.
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!
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.
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