すべてのプロセスのすべてのコマンドとメモリの変更を記録する方法

すべてのプロセスのすべてのコマンドとメモリの変更を記録する方法

私は読んだこここれ:

Falcoはカーネルモジュールに依存しています。マシンでシステムコールフローを入力します。これらのシステムコールをユーザースペースに転送します。

(強調)。

これは、任意のプロセスで任意のコマンド呼び出しを記録する可能性を暗示します(正確ではありませんが)。これがどのように行われるかを知りたいです。

誰かが私にptrace/strace/dtrace/gdb(私はMacを使用しています)をお勧めしましたが、そのカーネルモジュールを書くと、どのような低レベル(おそらくカーネルレベル)機能が記録されるのか気になります。どのプロセスはすでにマイコンピュータのバックグラウンドで実行されています。ps実行中のプロセスを一覧表示し、更新されたプロセスパネルといくつかの統計を維持するのと同じ方法で、基本的にtopプロセスを完全に制御したいと思います。つまり、指定された場合は、pid 123プログラムの1つのステップを実行、一時停止、またはpause 123実行してから、step 123コンピュータinspect 123の全体的なメモリレイアウトを調べて、メモリに何らかの変化が発生したことを確認します。これはすべてptrace/dtrace/strace/gdbなしで行われます。

これはおそらく広範なトピックです。しかし、私はより多くの情報を見つけるための正しい領域を指摘したかったのです。具体的にはその可能性が高い。カーネルモジュール、これはカーネルAPIによって公開されているいくつかの機能にアクセスします。これが技術的に可能かどうかはわかりません(プロセスを観察してください)。外から、いつでも評価を制御します)またはどのいくつかは可能です。まず、これらのどの部分が可能/不可能かを知りたいのですが、詳細はどこで見つけることができるのか知りたいです。

私が見たいくつかのチュートリアルでは、私のようにgdbプログラム/スクリプトを直接実行/呼び出したいと思いました。これがステップ/一時停止などにアクセスする方法の鍵です。プログラム行動。しかし、私はさらに一歩進みたいです。プログラムを呼び出すためにプログラム(gdbなど)を要求する代わりにgdbgdb myscriptまっすぐ、代わりに次のように動作しますプログラムに添付すでに実行中バックグラウンドで。その後、プログラムに追加します。外から、一時停止/ステップ/確認/などを許可します。これが可能かどうかはわかりません。ただし、この方法では、コンピュータが実行しているデーモンやその他の作業を最初から確認できます。

答え1

gdbはあなたが説明するものと正確に一致します。次のコマンドを使用して、実行中のプロセス123に接続できます。

$ gdb -p 123

または、実行可能ファイルのパスを渡します。

$ gdb /path/to/program 123

あなたはそれを使用することができます添付gdbプロンプトのコマンドは同じ効果を持ちます。

gdbはすでに接続されているプロセスのメモリを一時停止し、段階的にチェックしてチェックできるため、説明しているすべてのタスクを実行しているようです(メモリ内容の変更などの追加のタスクも実行できます)。

gdbで使用される低レベルのカーネル機能は次のとおりです。トラック(2)(参考にドラゴンもあります!) したがって、gdbに似ていますが、ある点では他のものが必要な場合は、これを達成するためにptraceを使用することを検討できます。

新しいカーネルインタフェースを開発することは確かに可能ですが、これが何を提供するのかはわかりません。 ptraceに似たものを生成するためにカーネルソースツリーをパッチします(簡単にロード可能なカーネルモジュールでは実行される可能性が低い)。

簡単に言えば、gdbとptraceは説明されているように行われます。このツールとシステムコール用の代替ツールを開発することはできますが、それを行う理由はわかりません。

関連情報