私は現在syscallフックとログを使用してカーネルを保護するためのいくつかのプロジェクトを進めています...これで、読み取りとソケットのsyscall接続が完了しました。カーネルの操作を受けているのですか、それともdmesgを開いて何らかのエラーがあるのか確認できないので、何か間違っているのですか? ( dmesg も実行可能です.できないことがわかりました。 (私が間違っている場合は修正してください)。だから私がする必要があるのは、どのファイルが実行されたのかを確認し、カーネルモジュールを介してこれを行う必要があり、それを実行する方法、またはStub_execveなどをスキップする方法を知っている人がいることを確認することです。 .?助けてください。本当にありがとうございます。
答え1
調べてみましたkprobes
か?または具体的にjprobes
。
jprobeを使用すると、関数execve
(または他のカーネル関数)に接続でき、関数が実行される前にその引数を確認できます。仕組みは、呼び出し元が追跡したい関数と同じ署名を持つ関数を提供し、それを呼び出して登録することですjprobe_register
。私たちはこの関数をと呼びますmy_execve
。その後、実際の関数を実行する前に、カーネルは最初にすべてのコンテキスト(パラメータ、レジスタ値など)をスタックに保存し、コントロールをスタックに渡してそのコンテキストのコピーを渡しますmy_execve
。返されるとmy_execve
(jprobe_return
代わりに使用return
)、カーネルは元の関数によって保存されたコンテキストを復元し、execve
実行を再開します。これは、コンテキストへの変更が元の機能の実行に影響しないことを意味します。ここで例を見ることができます。https://github.com/bytefire/esct/blob/master/esct.c。
レジスタの値を変更するなど、コンテキストを操作したい場合は、使用するとkprobes
同様のパターンに従いますが、少し意味があります。