Jawaban:
Ada 3 cara yang saya tahu. Ini hanya beberapa spekulasi, karena saya tidak bekerja di tim peninjau Apple.
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.
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.)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. )
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/,$_))))))'
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.
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.
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.
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.
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.
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!
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 executablestrings
- ini akan memberimu semua senar.Anda dapat menemukan contoh / representasi penggunaan perintah ini dalam inti untuk Objective-C dan Swift