2016-09-27 2 views
0

LD_PRELOADを使用してLinuxカーネル関数の1つを上書きすることはできますか?カーネルレベル関数でLD_PRELOADを使用する

たとえば、私のプログラムfooserverのリッスンソケットのcookie_hash機能をLinux/net/ipv4/syncookie.cに変更したいとします。私はLD_PRELOADを使用してそれを行うことはできますか、またはそのためにカーネルを再コンパイルする必要がありますか?

その他のオプションはありますか?

おかげで、

+1

LD_PRELOADトリックがうまくいきます動的にリンクされたライブラリのみあなたが話しているeコードは、静的にリンクされている可能性が最も高いです。あなたが運が良ければ、ロード可能なモジュールに座ってください。この場合、モジュールを交換することができます。 –

+0

@EugeneSh .:ユーザーが簡単にカーネル機能を置き換えることができれば、重大なセキュリティ上の問題はありませんか? – Olaf

+0

マルウェアを除いて:なぜあなたはこれをしたいですか? – Olaf

答えて

2

いいえ、カーネルの機能を置き換えるためにLD_PRELOADを使用することはできません。

カーネルを再コンパイルする必要があります。

機能がカーネルモジュール内にある場合は、カーネルを再起動する必要なく、モジュールをアンロードし、再コンパイルして再ロードすることができます。

これが頻繁に行われる場合は、2台目のコンピュータまたは仮想マシンを使用して、プログラミング中のコンピュータを再起動する必要はありません。

0

カーネル機能を無効にするには、kprobesまたはsystemtapを使用する必要があります。再コンパイルする必要はありません。

0

Linuxカーネルでも同様のことができます。 これは簡単な操作ではありませんが、次に行うべきことは次のとおりです。

  1. 置き換えたい機能のアドレスを探します。アドレスを達成するにはいくつかの方法があります。最も簡単なのは 'cat/proc/kallsyms |あなたのモジュールからcookie_hash」。
  2. grepを、あなたはアドレスの内容を保存します。これは、オリジナルの 『cookie_hash』関数である。このアドレスに
  3. 、あなたの関数 『my_cookie_hash』のアドレスを置く。
  4. であなたの関数「my_cookie_hash」の端部には、あなたは。多くの隠された罠と潜在的なクラッシュががあります。 を

を元関数「cookie_hash」を呼び出す。しかし、一般的に、このアプローチは動作します。