Bagaimana Apple tahu Anda menggunakan API pribadi?

109

Saya mengirimkan file biner ke Apple tanpa kode sumber apa pun.

Selain memeriksa kode sumber secara manual, bagaimana Apple mengetahui apa yang digunakan dan API apa yang Anda panggil?

Tattat
sumber
mengubah judul - Saya kira maksud Anda "Bagaimana Apple tahu .."
Anurag

Jawaban:

173

Ada 3 cara yang saya tahu. Ini hanya beberapa spekulasi, karena saya tidak bekerja di tim peninjau Apple.

1. otool -L

Ini akan mencantumkan semua pustaka yang telah ditautkan oleh aplikasi. Sesuatu yang jelas tidak boleh Anda gunakan, seperti IOKit dan WebKit dapat dideteksi dengan ini.

2. nm -u

Ini akan mencantumkan semua simbol yang ditautkan. Ini bisa mendeteksi

  • Fungsi C tidak berdokumen seperti _UIImageWithName;
  • Kelas Objective-C seperti UIProgressHUD
  • Ivars seperti UITouch._phase(yang dapat menjadi penyebab penolakan aplikasi berbasis Three20 beberapa bulan terakhir.)

3. Membuat daftar pemilih Objective-C, atau strings

Pemilih Objective-C disimpan di wilayah khusus biner, dan oleh karena itu Apple dapat mengekstrak konten dari sana, dan memeriksa apakah Anda telah menggunakan beberapa metode Objective-C yang tidak terdokumentasi, seperti -[UIDevice setOrientation:] .

Karena penyeleksi tidak bergantung pada kelas yang Anda kirimi pesan, meskipun kelas kustom Anda -setOrientation:tidak relevan dengan UIDevice, ada kemungkinan akan ditolak.


Anda dapat menggunakan APIKit Erica Sadun untuk mendeteksi potensi penolakan karena (alarm palsu) API pribadi.


(Jika Anda benar-benar sangat ingin menyelesaikan pemeriksaan ini, Anda dapat menggunakan fitur runtime seperti

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

untuk mendapatkan perpustakaan, kelas, metode, dan ivars pribadi tersebut. )

kennytm
sumber
Jawaban yang bagus. Saya hanya akan menambahkan bahwa jika aplikasi Anda melakukan sesuatu yang sangat sulit dilakukan tanpa menggunakan API pribadi, saya yakin aplikasi Anda mendapat pengawasan ekstra.
Matthew Frederick
Saya ingin tahu tentang solusi memanggil metode privat. Saya pikir kompilator akan menghasilkan panggilan ke objc_msgSend (foo, @selector (privateMethod)) untuk [foo privateMethod], jadi jika Apple dapat mendeteksi panggilan langsung privateMethod mereka juga dapat mendeteksi panggilan tidak langsung melalui objc_msgSend (atau performSelector :).
an0
Saya bertanya-tanya mengapa Anda mengatakan bahwa Anda tidak boleh menautkan ke IOKit dan WebKit?
hjaltij
2
Apa yang Anda lakukan dengan otool? File .app?
Rob
1
@Eric, mereka bisa , meskipun versi instrumentasi seperti itu mungkin akan memengaruhi kinerja. Terlepas dari itu, melihat API pribadi masuk ke App Store berulang kali, jelas bahwa mereka tidak melakukan ini, atau setidaknya tidak melakukannya sepanjang waktu.
Nate
26

Anda dapat membuat daftar pemilih dalam program Mach-O menggunakan satu baris berikut di Terminal:

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/,$_))))))'
Robert Diamond
sumber
+1, @Robert Diamond, Bisakah Anda menjelaskan lebih banyak untuk hal yang sama. Saya perlu memeriksa analitik Google menggunakan panggilan UDID atau tidak. Terima kasih
Mangesh
13

Katakanlah Anda ingin menggunakan beberapa API pribadi; obyektif C memungkinkan Anda untuk membangun SEL apa pun dari string:

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

Bagaimana robot atau pindaian perpustakaan menangkap ini? Mereka harus menangkap ini menggunakan beberapa alat yang memantau akses pribadi pada waktu proses. Bahkan jika mereka membangun alat runtime seperti itu, sulit untuk menangkapnya karena panggilan ini mungkin tersembunyi di beberapa jalur yang jarang dilakukan.

Chris McLuvin
sumber
user1203764 berkomentar bahwa panggilan semacam ini sebenarnya dapat dideteksi
Rup
@Rup ingin memberikan pendapat tentang pertanyaan saya di sini tentang menggunakan valueForKey? stackoverflow.com/questions/11923597/…
Dan Rosenstark
1
@Yar pertanyaan menarik! Tapi saya tidak cukup ahli untuk berkomentar, maaf. Apa yang dikatakan Farcaller tampaknya masuk akal bagi saya
Rup
Terima kasih @Rup, tampaknya tidak ada yang cukup ahli dalam bidang ini :)
Dan Rosenstark
Seseorang yang saya kenal mengatakan dia baru saja mendapat telepon seperti ini di App Store.
bugloaf
7

Saya membayangkan mereka melihat semua simbol yang biner Anda coba impor (info pasti tersedia dengan mudah bagi mereka dalam tabel simbol darinya) dan memberi tahu Anda jika salah satu simbol itu ditemukan dalam "daftar API pribadi" mereka. Sebenarnya, cukup mudah untuk diotomatisasi.

Alex Martelli
sumber
1
Sebenarnya, saya dapat mengatakan dengan pasti bahwa ini bukan masalahnya (setidaknya tidak semua yang mereka lakukan), berdasarkan penggunaan API pribadi yang saya tahu telah berhasil. Jika hanya ini yang diperlukan, penggunaan API pribadi tidak akan lolos . Pengalaman saya menunjukkan bahwa jawaban KennyTM hampir pasti benar. Ini adalah area di mana Objective-C secara fundamental berbeda dari bahasa lain, seperti C.
Nate
1

Eksekusi bukanlah kotak hitam. Jika Anda menelepon ke perpustakaan, itu adalah hal yang mudah ditemukan. Inilah mengapa saya menyesali hilangnya bahasa assembly dalam pendidikan Ilmu Komputer modern. =] Alat seperti ldd akan memberi tahu Anda apa yang telah Anda tautkan, meskipun saya tidak ingat inkarnasi ldd apa yang berhasil sampai ke kit dev iPhone mac.

Sniggerfardimungus
sumber
1
Saya sering bertanya-tanya: jika Anda menulis biner Anda untuk memodifikasi sendiri, hanya membuat kode untuk mengimpor API pribadi setelah beberapa kriteria terpenuhi (katakanlah, setelah tanggal publikasi aplikasi Anda) apakah Apple akan menangkapnya. Mereka pasti melaporkan kembali kepada kami beberapa statistik menarik, seperti jumlah game kami yang dijalankan pada ponsel yang di-jailbreak.
Sniggerfardimungus
@ user30997, Kode istimewa mungkin hanya dapat diakses melalui panggilan sistem; utas pelaksana beralih ke hak istimewa yang lebih tinggi dan memeriksa apakah hak istimewa sebelumnya memiliki izin untuk menjalankan kode atau tidak. Itu hanya sebuah contoh, ada cara lain untuk melakukannya, tapi saya sangat meragukan pengembang cukup naif untuk meninggalkan mekanisme pemeriksaan hak istimewa runtime dasar seperti ini, itu pasti telah dipublikasikan sekarang.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
1
otool -L somebinary
dvenema
sumber
1

selain dari investigasi simbol ...

apple dapat dengan mudah memiliki versi sdk yang memeriksa setiap tumpukan metode privat saat dipanggil untuk memastikannya dimasukkan dari salah satu metode yang ditentukan.

Pemain Grady
sumber
Itu tidak akan cukup, karena program hanya dapat memanggil panggilan pribadi ini pada waktu yang sewenang-wenang di masa mendatang, bergantung pada logika lain. Untuk melakukan pengawasan ini, Apple harus benar-benar memblokir API pribadi sama sekali, atau meminta kerangka kerja melaporkan panggilan API pribadi ke Apple secara otomatis - yang secara signifikan merusak kinerja.
Motti Shneor
0

Bahkan jika Anda menautkan secara statis, paling buruk, mereka dapat mengambil contoh kode dari API pribadi di daftar mereka, dan menelusuri biner Anda terhadapnya (juga relatif mudah untuk diotomatiskan).

Mengetahui Apple, saya yakin mereka memiliki sistem otomatis yang komprehensif, dan ketidakpastian apa pun mungkin ditolak atau ditinjau secara manual.

Di penghujung hari, saya pikir mungkin tidak sepadan dengan usaha untuk mencoba dan menipu Apple.

mencuci
sumber
4
Mengetahui Apple proses peninjauan mereka setelah menghadapi ketidakpastian apa pun melibatkan pemecahan satu set dadu untuk imajinasi maksimum.
HANYA PENDAPAT SAYA yang benar
0

Aplikasi desktop ini, App Scanner , dapat memindai file .app untuk penggunaan api pribadi dengan memisahkan file Mach-O Binary. Jika bisa, maka Apple juga bisa!

Andrew
sumber
0

Ada banyak alat untuk rekayasa balik yang memungkinkan pemeriksaan kode

  • nm - mencantumkan simbol dari file objek
  • objdump - Menampilkan informasi dari file objek.
  • otool- lihat konten Mach-O [About] file executable
  • strings - ini akan memberimu semua senar.

Anda dapat menemukan contoh / representasi penggunaan perintah ini dalam inti untuk Objective-C dan Swift

yoAlex5
sumber