Przesłałem plik binarny do Apple bez 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 wywołałeś?
iphone
objective-c
appstore-approval
Tattat
źródło
źródło
Odpowiedzi:
Znam 3 sposoby. To tylko spekulacje, ponieważ nie pracuję w zespole recenzentów Apple.
1.
otool -L
Spowoduje to wyświetlenie wszystkich bibliotek, z którymi aplikacja jest połączona. Coś, czego wyraźnie nie powinieneś używać, jak IOKit i WebKit, może zostać przez to wykryte.
2.
nm -u
Spowoduje to wyświetlenie wszystkich połączonych symboli. To może wykryć
UITouch._phase
(co może być przyczyną odrzucenia aplikacji opartych na Three20 w ciągu ostatnich kilku miesięcy).3. Lista selektorów celu-C, lub
strings
Selektory celu-C są przechowywane w specjalnym regionie pliku binarnego, dlatego Apple może wyodrębnić stamtąd zawartość i sprawdzić, czy użyłeś 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 definiuje
-setOrientation:
nieistotną dla UIDevice, istnieje możliwość odrzucenia.Możesz użyć APIKit Erica Sadun, aby wykryć potencjalne odrzucenie z powodu (fałszywych alarmów) prywatnych interfejsów API.
(Jeśli naprawdę naprawdę chcesz obejść te sprawdzenia, możesz użyć funkcji środowiska wykonawczego, takich jak
-valueForKey:
; object_getInstanceVariable, object_getIvar itp.aby zdobyć te prywatne biblioteki, klasy, metody i ivary. )
źródło
Możesz wyświetlić selektory w programie Mach-O, używając następującego jednoliniowego w Terminalu:
źródło
Powiedzmy, że chcesz użyć prywatnego API; cel C pozwala na skonstruowanie dowolnego SEL z łańcucha:
Jak skan robota lub biblioteki może to wykryć? Musieliby to złapać za pomocą narzędzia, które monitoruje prywatne dostępy w czasie wykonywania. Nawet jeśli skonstruowali takie narzędzie uruchomieniowe, trudno je złapać, ponieważ to wywołanie może być ukryte w jakiejś rzadko ćwiczonej ścieżce.
źródło
Wyobrażam sobie, że patrzą na wszystkie symbole, które twój plik binarny próbuje zaimportować (informacje bez wątpienia są łatwo dostępne dla nich w tabeli symboli) i dadzą ci znać, jeśli którykolwiek z tych symboli znajduje się na ich „prywatnej liście API”. W rzeczywistości dość łatwe do zautomatyzowania.
źródło
Plik wykonywalny nie jest dokładnie czarną skrzynką. Jeśli zadzwonisz do biblioteki, łatwo ją znajdziesz. Dlatego lamentuję nad utratą języków asemblera we współczesnej edukacji CS. =] Narzędzia takie jak ldd powiedzą ci, do czego się podłączyłeś, chociaż nie pamiętam, jakie wcielenie ldd znalazło się w zestawie deweloperskim Mac iPhone.
źródło
źródło
oprócz badania symboli ...
Apple może bardzo łatwo mieć wersję sdk, która sprawdza każdą ze stosów metod prywatnych po wywołaniu, aby upewnić się, że została wprowadzona z jednej z wyznaczonych metod.
źródło
Nawet jeśli łączysz statycznie, w najgorszym przypadku mogą pobrać próbki kodu z prywatnych interfejsów API na swojej liście i przeszukać je w Twoim pliku binarnym (również stosunkowo łatwe do zautomatyzowania).
Znając Apple, założę się, że mają wszechstronny, zautomatyzowany system, a wszelka niepewność jest prawdopodobnie odrzucana lub weryfikowana ręcznie.
Koniec końców, myślę, że prawdopodobnie nie warto próbować oszukać Apple.
źródło
Ta aplikacja komputerowa, App Scanner , może skanować pliki .app w celu prywatnego użytku przez api, rozłączając plik binarny Mach-O. Jeśli tak, to Apple też!
źródło
Istnieje wiele narzędzi do inżynierii wstecznej, które umożliwiają wgląd w kod
nm
- wyświetla symbole z plików obiektowychobjdump
- wyświetla informacje z plików obiektowych.otool
- widok zawartości Macha-O [O] wykonywalnestrings
- to dostaniesz wszystkie struny.Przykłady / reprezentacje użycia tych poleceń można znaleźć w streszczeniach dla Objective-C i Swift
źródło