Pertanyaan Aplikasi Debug iOS pada perangkat tanpa simbol


Saya perlu men-debug startup untuk aplikasi ios pada perangkat yang sebenarnya ... dan dengan memulai saya maksud instruksi pertama yang dijalankan ketika tangan OS kontrol ke aplikasi. Bukan "utama". Juga, aplikasi ini tidak memiliki simbol (mis. Informasi debug tidak tersedia .. belum). Saya tidak peduli jika saya harus melakukan debug pada level instruksi CPU. Saya tahu cara melakukannya (melakukannya selama lebih dari 30 tahun). Saya ingin debugger berhenti saat kontrol akan ditransfer ke aplikasi. Ketika saya menggunakan perintah Attach | by Name dan jalankan, itu hanya mengatakan "Selesai berjalan".

Oh, dan aplikasi ini tidak dibangun di Xcode. Saya t aku sNamun, aplikasi yang saya buat, ditandatangani, ditetapkan, dan dipindahkan ke perangkat. Aplikasi berjalan karena saya bisa melihat keluaran konsol. Kalau-kalau Anda berpikir saya beberapa hacker mencoba untuk debug aplikasi seseorang.

Bagaimana dengan urutan yang tinggi? Saya berani bertaruh tidak ada yang bisa menjawab ini ... Saya tidak dapat menemukan informasi tentang bagaimana saya bisa melakukan ini dengan proyek XCode-dibangun. Saya bertanya-tanya apakah itu tidak mungkin atau "diizinkan" oleh tuan Apple?

Apa yang Anda katakan, dewa Stack Overflow?

UPDATE: Saya harus mengklarifikasi sesuatu. Aplikasi ini tidak dibangun dengan alat yang tersedia secara komersial atau sumber terbuka. Saya bekerja dengan vendor alat yang membuat kompiler, kerangka kerja, dan IDE. TKI, Anda belum bisa mendapatkan alat ini ... Dalam proses bootstrap rantai alat baru, secara teratur harus menggunakan beberapa debugging mentah tingkat rendah. Terutama jika ada bug di kode yang dihasilkan oleh alat.


32
2018-05-27 21:00


asal


Jawaban:


Saya akan menjawab pertanyaan saya sendiri karena saya pikir saya menemukan solusi. Jika ada yang lebih elegan dan sederhana dari ini, tolong jawab juga. Aktif ke langkah-langkah:

Dimulai dengan eksekusi iOS monolitik mentah (bukan berkas .app, tetapi file bin-o bin aktual yang merupakan kode mesin).

  1. Buat proyek Xcode kosong bernama baru. Bangun dan jalankan di perangkat.
  2. Cari folder .app bundel.
  3. Salin iOS mentah di atas yang dapat dieksekusi di atas yang sudah ada di folder .app bundle.
  4. Aplikasi ini sekarang akan memiliki tanda tangan yang tidak valid dan tidak dapat digunakan dan dijalankan.
  5. Jalankan codesign terhadap bundel aplikasi (Anda dapat menemukan baris perintah dengan menjalankan xcodebuild pada proyek Xcode di atas).
  6. Di dalam folder .app, jalankan otool -h -l pada gambar biner. Cari perintah beban LC_UNIXTHREAD dan temukan nilai yang terkait dengan register 'pc'. Ini adalah alamat tempat os loader akan melompat ke aplikasi Anda. Jika alamat ini aneh, maka ini adalah instruksi Jempol jika tidak maka akan menjadi ARM (saya pikir itulah cara kerjanya).
  7. Tambahkan breakpoint simbolik (saya menggunakan GDB bukan LLDB) dan masukkan alamat sebagai '* 0x00001234' sebagai simbol.
  8. Pilih Produk | Lakukan Tindakan | Jalankan Tanpa Bangunan.

Dengan asumsi bahwa GDB dapat mengevaluasi ekspresi breakpoint dan mengatur break point, dan Anda telah memilih Product | Debug Workflow | Show Disassembly When Debugging, proses tersebut harus diputuskan pada instruksi pertama yang akan dijalankan dalam aplikasi.

Anda sekarang dapat melakukan satu langkah instruksi dan menggunakan konsol GDB untuk mendapatkan / mengatur nilai register.


22
2018-05-28 23:50



Pertanyaan Anda tidak masuk akal - utama adalah titik masuk ke dalam aplikasi. Ini adalah kode pertama yang harus ditemui, kecuali mungkin Anda telah menginisialisasi () diganti untuk beberapa kelas (tapi bahkan kemudian saya pikir utama akan tertabrak sebelum runtime).

Saya pikir Anda melihat beberapa jenis kesalahan aneh pada peluncuran dan Anda pikir Anda ingin mengatur breakpoint pada entri untuk menangkapnya, tetapi jauh lebih mungkin apa yang akan membantu Anda adalah untuk menggambarkan masalah pada peluncuran dan membiarkan salah satu dari 4000 orang yang telah melihat dan memperbaiki kerusakan yang sama membantu Anda ...

Namun, jika Anda benar-benar ingin menggunakan GDB untuk membobol aplikasi tanpa simbol (tetapi yang Anda luncurkan dari XCode), Anda dapat memiliki GDB yang diputus pada alamat perakitan sesuai:

Bagaimana cara memutuskan instruksi perakitan di alamat tertentu di gdb?

Untuk menemukan alamat utama (atau metode lainnya), Anda dapat menggunakan alat atau atos, beberapa contoh dalam pertanyaan ini:

Mencocokkan offset di crash dump iOS untuk pembongkaran biner

TAMBAHAN:

Jika karena alasan tertentu XCode tidak dapat meluncurkan aplikasi Anda untuk debugging, Anda juga dapat melakukan jailbreak dan menginstal GDB di perangkat itu sendiri yang akan memberikan kontrol penuh atas debugging. Jika XCode dapat meluncurkan aplikasi Anda, saya tidak melihat alasan mengapa dapat mematahkan pada alamat memori yang sewenang-wenang tidak memberi Anda kemampuan yang Anda cari ...


2
2018-05-27 21:13



Satu-satunya solusi yang saya temukan adalah untuk aplikasi dengan webview tetapi di simulator melalui Safari Remote Debugger. Ini diluar topik tetapi mungkin yang satu atau yang lain bisa mendapat manfaat.

http://hiediutley.com/2011/11/22/debugging-ios-apps-using-safari-web-inspector/

Atau gunakan netcat untuk IOs ... bukan solusi yang paling sempurna tapi setidaknya Anda melihat apa yang terjadi.


1
2018-05-28 16:53