Apple, özel API kullandığınızı nereden biliyor?


109

Herhangi bir kaynak kodu olmadan Apple'a bir ikili dosya gönderdim.

Kaynak kodunu manuel olarak kontrol etmenin yanı sıra, Apple neyin kullanıldığını ve hangi API'leri çağırdığınızı nasıl biliyor?


başlık değiştirildi - Sanırım "Apple nasıl biliyor?" demek
istediniz

Yanıtlar:


173

Bildiğim 3 yol var. Apple inceleme ekibinde çalışmadığım için bunlar sadece biraz spekülasyon.

1. otool -L

Bu, uygulamanın bağlandığı tüm kitaplıkları listeler. Açıkça kullanmamanız gereken bir şey, IOKit ve WebKit gibi, bununla tespit edilebilir.

2. nm -u

Bu, tüm bağlantılı sembolleri listeleyecektir. Bu tespit edebilir

3. Amaç-C seçicilerini listeleme veya strings

Objective-C seçicileri, ikilinin özel bir bölgesinde saklanır ve bu nedenle Apple, içeriği oradan çıkarabilir ve bazı belgelenmemiş Objective-C yöntemlerini kullanıp kullanmadığınızı kontrol edebilir -[UIDevice setOrientation:].

Seçiciler, mesajlaştığınız sınıftan bağımsız olduğundan, özel sınıfınız -setOrientation:UIDevice ile ilgisiz tanımlasa bile , reddedilme olasılığı olacaktır.


Özel API'ler (yanlış alarmlar) nedeniyle olası reddi tespit etmek için Erica Sadun'un APIKit'ini kullanabilirsiniz.


(Bu kontrolleri gerçekten gerçekten gerçekten çözmek istiyorsanız, aşağıdaki gibi çalışma zamanı özelliklerini kullanabilirsiniz.

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

bu özel kütüphaneleri, sınıfları, yöntemleri ve ivarları elde etmek için. )


Mükemmel cevap. Sadece, uygulamanız özel bir API kullanmadan yapması son derece zor bir şey yapıyorsa, eminim uygulamanızın daha fazla inceleneceğini ekleyeceğim.
Matthew Frederick

Özel yöntemleri çağırmanın geçici çözümünü merak ediyorum. Derleyicinin [foo privateMethod] için objc_msgSend (foo, @selector (privateMethod)) çağrısı oluşturacağını düşünüyorum, böylece Apple privateMethod'un doğrudan çağrısını algılayabilirse, objc_msgSend (veya performSelector :) aracılığıyla dolaylı çağrıyı da algılayabilir.
an0

Neden IOKit ve WebKit'e bağlanmamalısın dediğini merak ediyorum?
hjaltij

2
Otool'u neye uyguluyorsunuz? .App dosyası mı?
Rob

1
@Eric, böyle bir enstrümantasyonlu sürüm muhtemelen performansı etkileyecek olsa da yapabilirler . Ne olursa olsun, görme özel API'ler defalarca App Store içine geçmek, bunların çok açık değil o her zaman yapmayın en azından bunu ya.
Nate

26

Bir Mach-O programındaki seçicileri, Terminal'de aşağıdaki tek satırlık kullanarak listeleyebilirsiniz:

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, Aynı şekilde daha fazlasını açıklayabilir misiniz? Google analitiğinin UDID araması kullanıp kullanmadığını kontrol etmem gerekiyor. Teşekkürler
Mangesh

13

Diyelim ki bazı özel API kullanmak istiyorsunuz; C hedefi, bir dizeden herhangi bir SEL oluşturmanıza izin verir:

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

Bir robot veya kütüphane taraması bunu nasıl yakalayabilir? Bunu, çalışma zamanında özel erişimleri izleyen bir araç kullanarak yakalamak zorunda kalacaklardı. Böyle bir çalışma zamanı aracı oluşturmuş olsalar bile, yakalamak zordur çünkü bu çağrı nadiren uygulanan bir yolda gizlenmiş olabilir.


user1203764 comments aramaları bu tür aslında tespit edilebileceğini
Rup

@Rup, lütfen valueForKey'i kullanma hakkındaki soruma bir fikir vermek ister misiniz? stackoverflow.com/questions/11923597/…
Dan Rosenstark

1
@Yar ilginç soru! Ama özür dileyecek kadar uzman değilim. Farcaller'ın söyledikleri bana mantıklı geliyor
Rup

Teşekkürler @Rup, görünüşe göre bu alanda uzman olan kimse yeterli değil :)
Dan Rosenstark

Tanıdığım biri App Store'dan böyle bir telefon aldığını söyledi.
bugloaf

7

İkilinizin içe aktarmaya çalıştığı tüm sembollere baktıklarını (sembol tablosunda hiç şüphesiz bilgi onlara kolayca erişilebilir) ve bu sembollerden herhangi biri kendi "özel API listesinde" bulunursa sizi rahatsız ettiklerini hayal ediyorum. Aslında, otomatikleştirmek oldukça kolay.


1
Aslında, bu (en azından öyle değil böyle olmadığını kesinlikle söyleyebiliriz tüm İçinden almış Bilin diye özel API kullanıma göre, yaptıkları). İhtiyaç duyulan tek şey buysa, özel API kullanımı gözden kaçmaz . Deneyimlerim, KennyTM'nin cevabının neredeyse kesinlikle doğru olduğunu gösteriyor. Bu, Objective-C'nin temelde C gibi diğer dillerden farklı olduğu bir alandır.
Nate

1

Bir yürütülebilir dosya tam olarak bir kara kutu değildir. Bir kütüphaneye seslenirseniz, bulması kolay bir şeydir. Bu nedenle, modern bilgisayar bilimleri eğitimlerinde montaj dillerinin kaybına üzülüyorum. =] Ldd gibi araçlar size neye bağlandığınızı söyleyecektir, ancak ldd'nin mac iPhone geliştirici kitine nasıl geldiğini hatırlamıyorum.


1
Sık sık merak ettim: İkili programınızı kendi kendini değiştirmek için yazacak olsaydınız, yalnızca bazı kriterler karşılandıktan sonra (örneğin, uygulamanızın yayın tarihinden sonra) özel bir API içe aktarmak için kod oluşturarak Apple'ın onu yakalayıp yakalayamayacağını. Jailbreak'li telefonlarda çalıştırılan oyunlarımızın sayısı gibi bazı ilginç istatistikleri bize kesinlikle bildiriyorlar.
Sniggerfardimungus

@ user30997, Ayrıcalıklı koda muhtemelen yalnızca bir sistem çağrısı yoluyla erişilebilir; yürütme iş parçacığı daha yüksek bir ayrıcalığa geçer ve önceki ayrıcalığın kodu yürütme iznine sahip olup olmadığını kontrol eder. Oradaki bunu yapmanın başka yolları vardır, ama olsa sadece bir örnek son derece geliştiriciler bu gibi mekanizmayı kontrol temel çalışma zamanı ayrıcalık dışarıda bırakmak naif yeterliydi şüphe, kesinlikle artık kamuoyuna olurdu.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳


1

sembol araştırmasının yanı sıra ...

apple, sdk'nin, belirtilen yöntemlerden birinden girildiğinden emin olmak için çağrıldığında her özel yöntem yığınını kontrol eden bir sdk sürümüne kolayca sahip olabilir.


Bu yeterli olmayacak, çünkü program bu özel aramayı yalnızca diğer mantığa bağlı olarak gelecekte keyfi bir zamanda arayabilir. Bu incelemeyi yapmak için Apple'ın aslında özel API'leri tamamen engellemesi veya çerçevelerin özel API çağrılarını Apple'a otomatik olarak rapor etmesini sağlaması gerekir ki bu da performansa önemli ölçüde zarar verir.
Motti shneor

0

Statik olarak bağlansanız bile, en kötü ihtimalle, kendi listelerindeki özel API'lerden kodun örneklerini alabilir ve bunlara karşı ikili programınızı arayabilirler (ayrıca otomatikleştirilmesi nispeten kolaydır).

Apple'ı tanıyarak, kapsamlı, otomatik bir sisteme sahip olduklarına bahse girerim ve herhangi bir belirsizlik muhtemelen reddedilir veya manuel olarak incelenir.

Günün sonunda, Apple'ı kandırmaya çalışmak muhtemelen çabaya değmeyeceğini düşünüyorum.


4
Herhangi bir belirsizlikle karşılaştıktan sonra Apple'ın gözden geçirme sürecini bilmek, maksimum tuhaflık için bir dizi zar atmayı içerir.
SADECE DOĞRU GÖRÜŞÜM

0

Bu masaüstü uygulaması, App Scanner , Mach-O Binary dosyasını ayırarak .app dosyalarını özel api kullanımı için tarayabilir. Mümkünse, Apple da yapabilir!


0

Tersine mühendislik için bir kodu incelemeye izin veren birçok araç vardır.

  • nm - nesne dosyalarındaki sembolleri listeler
  • objdump - nesne dosyalarındaki bilgileri görüntüleyin.
  • otool- Mach-O [Hakkında] çalıştırılabilir dosyaların içeriğini görüntüleyin
  • strings - bu size tüm ipleri verecek.

Bu komutları kullanmanın örneklerini / temsilini Objective-C ve Swift için özetlerde bulabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.