mengapa tidak strace menggunakan uji syscalls untuk mengetahui indeks mereka di tabel sistem panggilan?

1

aku mengerti itu strace perintah menggunakan ptrace(PTRACE_PEEKUSER, child, __builtin_offsetof(struct user, regs.orig_eax)) untuk menemukan indeks dari suatu sistem panggilan, anak terlacak terperangkap di. Kemudian untuk menerjemahkan indeks ke nama fungsi syscall, ia telah membangun tabel-tabel yang dibuat dari menerima header kode sumber linux yang ada dalam instalasi.

Metode ini harus tidak terdokumentasi dan rentan terhadap kegagalan karena lokasi dan sintaksis deklarasi kode sumber tidak didokumentasikan, harus ditemukan dengan grepping dan dapat berubah dengan cara yang tidak diketahui. Apakah saya benar mengatakan itu?

Jika begitu, lalu mengapa strace tidak menggunakan metode berikut, menurut saya, lebih sederhana, hanya bergantung pada dokumentasi dan karenanya sangat mudah.

Pada awal menjalankan pertama setelah reboot, strace mengirimkan tes syscall, satu untuk setiap fungsi syscall, menjebaknya, dan mengamati indeks syscall apa yang digunakan anak. Itu memberikan tabel kustom yang lengkap dan benar yang dapat disimpan dalam file yang dikenal untuk pemanggilan selanjutnya strace.

Saya yakin metode ini harus dipertimbangkan, karena tidak ada yang cerdik. Jadi pasti ada yang salah dengan itu. Apa yang salah??

user322908
sumber
Bagaimana ini membuat panggilan sistem pengujian ini kecuali dengan menggunakan konstanta dari header sistem / kernel?
R..
Juga "jalankan pertama setelah reboot" adalah konsep yang tidak masuk akal sama sekali. Bagaimana itu bisa tahu hal seperti itu?
R..
@R .. ?? open(foobar.txt, O_RDONLY) tidak diperlukan hal-hal yang tidak berdokumen
user322908
@R .. adapun "run pertama", saya hanya tidak ingin mengambil risiko situasi, bahwa seseorang mengubah beberapa header, mengkompilasi ulang kernel dan reboot dengan kernel baru (yang, omong-omong, dapat merusak arus strace Aku percaya). Jadi saya perlu memastikan apakah saya menyimpan meja, karena saya tidak ingin menghitungnya setiap waktu strace dipanggil, lalu dihapus saat reboot. Tentunya harus ada cara di Linux untuk mengetahui, apakah saya dipanggil pertama kali setelah reboot. Tentunya harus ada beberapa file yang disentuh / dibuat saat reboot, sehingga saya dapat membandingkan stempel waktu saya dengan itu?
user322908
1
Bagaimana Anda tahu open(foobar.txt, O_RDONLY) menghasilkan persis satu syscall dan itu SYS_open? Mungkin digunakan SYS_openat. Mungkin mengakibatkan panggilan sistem lain terjadi sebagai bagian dari ikatan malas pada penghubung dinamis, jika ini adalah panggilan pertama open. Atau mungkin melibatkan panggilan sistem lain secara internal untuk tujuan lain. Tidak ada pemetaan satu-ke-satu yang dapat Anda asumsikan antara panggilan perpustakaan dan panggilan sistem.
R..

Jawaban:

1

Karena tidak ada konsep nama panggilan pada tingkat rendah. Tidak ada jalan strace bisa mengatakan "Hei, ayo buat a fcntl() panggil dan lihat nomornya! ". Hanya dapat melakukan panggilan berdasarkan nomor syscall itu sendiri. Ini karena syscall dibuat ketika nomor syscall disimpan ke eax atau rax mendaftar, dan proses panggilan int 0x80 atau syscall.

forest
sumber