Anda boleh cuba menggunakan penyelesaian berikut untuk memintas fungsi kernel Linux:
Gunakan API Keselamatan Linux
Dari perspektif amalan terbaik, kami merasakan bahawa menggunakan fungsi cangkuk API keselamatan Linux adalah pilihan terbaik, kerana soket ini direka untuk tujuan ini. Perkara utama dalam kod kernel termasuk panggilan fungsi keselamatan, yang mungkin menyebabkan pemasangan modul keselamatan meningkat. Modul ini boleh mengkaji konteks operasi tertentu dan memutuskan sama ada untuk membenarkan atau melarangnya. Malangnya, LinuxSecurityAPI mempunyai dua batasan utama:
Malah, pembangun kernel mempunyai idea yang berbeza tentang sama ada sistem boleh mengandungi berbilang modul keselamatan, dan adalah fakta tertentu bahawa modul tidak boleh dimuatkan secara dinamik. Untuk memastikan sistem kekal selamat dari awal, modul keselamatan mesti menjadi sebahagian daripada kernel. Atas sebab ini, untuk menggunakan API keselamatan Linux, kita perlu mencipta kernel Linux tersuai.
Tukar jadual panggilan sistem
Memandangkan ia digunakan terutamanya untuk operasi yang dilakukan oleh aplikasi pengguna, kami boleh melaksanakannya di peringkat panggilan sistem. Semua pengendali panggilan sistem Linux disimpan dalam jadual sys_call_table. Mengubah suai nilai dalam jadual ini menghasilkan tingkah laku sistem yang diubah suai. Kita boleh melakukan ini dengan mengaitkan panggilan sistem dengan menyimpan nilai pengendali lama dan menambah pengendali kita sendiri pada jadual. Kaedah ini juga mempunyai beberapa kelebihan dan kekurangan.
Kelebihan utama adalah seperti berikut:
Namun, kaedah ini juga mempunyai beberapa kelemahan:
Pelaksanaan teknikal lebih kompleks. Sebenarnya, tidak sukar untuk menggantikan nilai dalam jadual Panggil fungsi kernel linux , tetapi terdapat beberapa tugas tambahan yang memerlukan syarat individu dan beberapa penyelesaian yang tidak jelas:
Hanya panggilan sistem cangkuk. Oleh kerana pendekatan ini membolehkan anda menggantikan pengendali panggilan sistem, ia sangat mengehadkan titik masuk. Semua pengesanan tambahan boleh dilakukan sebelum atau sejurus selepas panggilan sistem, kami hanya mempunyai parameter panggilan sistem dan nilai pulangannya. Oleh itu, kadangkala kita mungkin perlu menyemak dengan teliti kebenaran akses proses dan kesahihan parameter panggilan sistem. Dilaporkan bahawa dalam beberapa kes, keperluan untuk menyalin memori proses pengguna dua kali akan menyebabkan perbelanjaan tambahan. Sebagai contoh, apabila parameter disalurkan melalui jarum jam tangan, terdapat dua salinan: satu dibuat oleh kami sendiri dan satu dibuat oleh pengendali asal.
Guna Kprobes
Kprobes — API yang direka untuk pengesanan dan penyahpepijatan kernel Linux. Kprobes membenarkan pemasangan pra dan pasca pemproses untuk sebarang arahan kernel serta pengendali kemasukan fungsi dan pemulangan fungsi. Pengendali mempunyai akses kepada daftar dan boleh mengubah suainya. Dengan cara ini, kami mempunyai peluang untuk memantau aliran pelaksanaan fail dan mengubahnya.
Kegunaan utama menggunakan Kprobes untuk menjejaki fungsi kernel Linux adalah seperti berikut:
Kprobes juga ada kelemahan:
Splicing
Cara klasik untuk mengkonfigurasi pengait fungsi kernel: gantikan arahan pada permulaan fungsi dengan lompatan tanpa syarat kepada pengendali tersuai. Arahan asal disambungkan ke lokasi yang berbeza dan dilaksanakan sebelum melompat kembali ke fungsi yang dipintas. Atas sebab ini, dengan dua lompatan, kod boleh disambungkan ke dalam fungsi. Ini berfungsi dengan cara yang sama seperti pengoptimuman lompat kprobes. Dengan penyambungan, anda boleh mencapai hasil yang sama seperti menggunakan kprobes, tetapi dengan kurang overhed dan kawalan penuh ke atas proses.
Kelebihan menggunakan splicing sangat ketara:
Walau bagaimanapun, kaedah ini mempunyai satu kelemahan utama - kerumitan teknikal. Mengganti kod mesin dalam fungsi bukanlah mudah. Untuk menggunakan splicing untuk memanggil fungsi kernel linux , operasi berikut perlu diselesaikan:
Secara relatifnya, penyambungan mungkin merupakan cara yang sangat berguna untuk mengaitkan fungsi kernel Linux. Tetapi pelaksanaan kaedah ini terlalu rumit. Kerana mengambil kira keupayaan kami sendiri dan beberapa insentif lain, kami tidak bersedia untuk menggunakan kaedah ini buat masa ini, jadi kami menggunakannya sebagai calon.
Atas ialah kandungan terperinci Anda boleh cuba menggunakan penyelesaian berikut untuk memintas fungsi kernel Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!