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?
iphone
objective-c
appstore-approval
Tattat
sumber
sumber
Jawaban:
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
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
-valueForKey:
; object_getInstanceVariable, object_getIvar, dll.untuk mendapatkan perpustakaan, kelas, metode, dan ivars pribadi tersebut. )
sumber
Anda dapat membuat daftar pemilih dalam program Mach-O menggunakan satu baris berikut di Terminal:
sumber
Katakanlah Anda ingin menggunakan beberapa API pribadi; obyektif C memungkinkan Anda untuk membangun SEL apa pun dari string:
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.
sumber
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.
sumber
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.
sumber
sumber
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.
sumber
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.
sumber
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!
sumber
Ada banyak alat untuk rekayasa balik yang memungkinkan pemeriksaan kode
nm
- mencantumkan simbol dari file objekobjdump
- Menampilkan informasi dari file objek.otool
- lihat konten Mach-O [About] file executablestrings
- ini akan memberimu semua senar.Anda dapat menemukan contoh / representasi penggunaan perintah ini dalam inti untuk Objective-C dan Swift
sumber