5

Berkeley Packet Filter (BPF) を使用してカーネルで関数の引数をフィルタリングする方法は? 関数は、システム コールだけではなく、インライン以外の関数である必要があります。また、検証のために関数の引数内のポインターを逆参照できるようにすることをお勧めします。

インターネットで検索しましたが、使用例が見つかりません。ほとんどの資料は、seccomp / seccomp-BPF の使用方法のみを説明しています。

フックを実装するために eBPF と kprobe/jprobe が統合されているようです。しかし、ウェブ上で良い例を見つけることができません。

4

1 に答える 1

3

eBPFはおそらくあなたが望むものです。まだ見つからない場合は、bcc ( BPF Compiler Collection ) ツールで提供されている例を参照してください。

特に、サンプル ツールargdistは実際に kprobes に依存しており、興味深いものになる可能性があります。

argdist は、指定した関数をプローブし、パラメーター値をヒストグラムまたは頻度カウントに収集します。これを使用して、特定のパラメーターが取る値の分布を理解したり、デバッガーを接続せずに興味深いパラメーターをフィルター処理して出力したり、さまざまな関数の一般的な実行統計を取得したりできます。

たとえば、アプリケーションで一般的な割り当てサイズを見つけたいとします。

# ./argdist -p 2420 -C 'p:c:malloc(size_t size):size_t:size'
[01:42:29]
p:c:malloc(size_t size):size_t:size
       COUNT      EVENT
[01:42:30]
p:c:malloc(size_t size):size_t:size
COUNT EVENT

[…]

( argdist の例からの抜粋は、 を使用しています)。

記録として、これまでに eBPF で見つけたほとんどの例は、これらの場所のいずれかにありました。

  • Linuxlinux/samples/bpfカーネル ソース内。
  • bcc/toolsbccのディレクトリにあります。
  • (ネットワークの例については、iproute2 パッケージ ソースのディレクトリのtc下にあります。)iproute2/examples/tc
于 2016-08-27T16:41:30.950 に答える