hook_tcp.so
What is hook_tcp.so
LD_PRELOADを利用して、プログラム中で実行される connect()の接続先をsyslogへ記録するプログラムです。
Linux環境で動作確認を行っています。
Compile
$ wget http://www.t-dori.net/forensics/hook_tcp.cpp $ g++ -Wall -fPIC -shared -o hook_tcp.so hook_tcp.cpp -ldl
How to use
通常のプログラムを実行する際に、環境変数でLD_PRELOAD=./hook_tcp.soを 指定しておきます。hook_tcp.soは通常のsocketを使用してTCP/IPで通信する プログラムであれば、どのようなプログラムでも使用することができます。
以下はhook_tcpを使ってwgetを起動する際の例です。
$ LD_PRELOAD=./hook_tcp.so wget http://www.google.com/
プログラム中でTCP/IPで接続した際に、次のようなログがsyslogへ記録されます。
Dec 25 10:35:15 hostname wget[10718]: connect() : host=66.249.89.99, port=80
Mechanism
LD_PRELOADでsoファイルを指定しておくと、プログラム中に含まれている 関数をsoファイルに含まれている関数に置き換えることができます。
ただし、そのまま置き換えただけでは、元の関数が呼び出されなくなってしまうので、
[関数呼び出し元] -> [置き換えた関数] -> [オリジナルの関数]
という感じで、soで置き換えた関数の中からオリジナルの関数を呼ぶようにして、 置き換えた関数の中でsyslogへ接続先のログを出力するようにしています。
hook_tcp.soはTCP/IPを利用する際に必要な、socket(),connect(),close()を フックして、connect()を実行した際の接続先をsyslogへ出力するように しています。
Keyword(s):
References:[FrontPage] [info-2005-12-25] [software]