2005年7月24日 (日曜日)

05:37:53 # Life openシステムコールを解析するのに利用するのは, ptraceを使おうか,LD_PRELOADを使おうか,検討をしてみる. Linux kernelの中で,ptraceについて参考になるソースは,おそらく arch/um/kernel/ptrace.c, arch/um/kernel/process.c あたり. ptrace(2) マニュアルページも参考になる. 子プロセスをforkで作成して,ptrace可能である,と宣言してから,execする. 子プロセスがシグナルをうけると停止し, 親プロセスはwait()の際に通知される.

雰囲気から察すると,ptraceでシステムコールの分析をする際には, システムコールを実行するまえの瞬間にトラップをしかけることができ, その際にレジスタの各値を取得できるというインタフェースになっているらしい. つまり,システムコールの値と,レジスタの意味という情報が必要になる. この情報は各OS,CPUアーキテクチャ毎に違い, ptraceというインタフェースが一般的に存在しているといっても 汎用的ではない.

システムコール経由で解析しようとするより, LD_PRELOADでlibcのopen関数をオーバライドするほうがより現実的のように思える. ppcだったら pt_regs.gpr の何番目に何が入っているのか, というのを全て洗い出してデバッグするのは手間がかかる. x86だったら,eaxにシステムコール番号があり, ebxに一つ目のパラメータがあり,というような話し.

LD_PRELOAD ptrace
openが呼ばれた状態の追跡 可能 可能
openシステムコールをアプリケーションコードが直接呼んだ場合 不可 可能
suidアプリケーションの追跡(例:gpg) 不可 不可?
static linkアプリケーションの追跡 不可 可能
アプリケーション側からのトレースからの回避方法 LD_PRELOAD環境変数のリセットなど(lddなど) ?
forkされた場合の処理 継続 attachしなおす必要あり(空白の時間が発生?)
過去の事例 fakeroot, fakechroot, auto-apt gdb, user-mode-linux

17:16:46 # Life 帰りのエールフランスでのできごと. 画面でWindows CE Boot Loader, v2.7の起動画面がくりかえし表示される. 映画はどこにいった?

Junichi Uekawa

$Id: dancer-diary.el,v 1.89 2005/05/12 11:19:14 dancer Exp $