コグノスケ


link 未来から過去へ表示  link 過去から未来へ表示(*)

link もっと前
2008年7月24日 >>> 2008年7月24日
link もっと後

2008年7月24日

ptraceのサンプルプログラム

まぶち氏からptraceのサンプルない?って言われたのでstraceを紹介しました。straceはptraceの難しいところをどうしているのか見るには良いですが、初めてptraceを使う人が見るもんじゃない気がします。

入門に使えると信じて、簡単なサンプルを作ってみたので公開。Linux専用です。link ソースコードはこちらからどうぞ。
(2008年7月25日追記)需要はなさそうなものの、一応ライセンスを明確にしました。修正BSDライセンスです。

うまくいけばトレース対象のシステムコール名がずらっと表示されるはずです。以下に私の環境での実行結果を示します。

簡易ptraceプログラムのコンパイル、実行結果
$ gcc -Wall 20080724_ptrace_simple.c

$ ls -l
合計28
-rw-r--r-- 1 katsuhiro katsuhiro  8679 2008-07-24 02:12 20080724_ptrace_simple.c
-rwxr-xr-x 1 katsuhiro katsuhiro 13367 2008-07-24 02:28 a.out

$ ./a.out ls -la
 1115: child started
 1115: sys out( 11): execve
 1115: sys  in(122): uname
 1115: sys out(122): uname
 1115: sys  in( 45): brk
 1115: sys out( 45): brk
 1115: sys  in( 33): access
 1115: sys out( 33): access
(略)
 1115: sys  in(  4): write
-rwxr-xr-x 1 katsuhiro katsuhiro 13367 2008-07-24 02:28 a.out
 1115: sys out(  4): write
 1115: sys  in(  6): close
 1115: sys out(  6): close
 1115: sys  in( 91): munmap
 1115: sys out( 91): munmap
 1115: sys  in(252): exit_group
 1115: exited, st:0

動作はDebian GNU/Linux 4.0(etch) で確認しました。さほど変なことはやっていないはずなので、最近のLinuxディストリビューションなら問題ないと思います。たぶん…。

簡単な説明

仕組みとしてはforkした後に親プロセスは監視役、子プロセスは監視対象、で役割分担します。

親プロセスの仕事はwait -> ptrace(PTRACE_SYSCALL, ...) を繰り返すことです。子プロセスに何か変化があるとwaitから戻ってくるので、その都度何が起きたか調べます。イベントには色々ありますが、サンプルで見ている種類をざくっと紹介します。

  • 子プロセスの終了 -> 監視を止めます。このとき終了ステータスが取得できます。
  • シグナルでkillされた -> 監視を止めます。このときどのシグナルでkillされたか取得できます。
  • シグナルを受け取った -> ptraceを使ってシグナルを子プロセスに渡します。

子プロセスにシグナルを渡さないと、子プロセスがシグナルを認識できません。逆に言うと監視役の親プロセスのさじ加減次第では、子プロセスに飛んで来たシグナルを消すこともできてしまいます。ただしSIGKILLとSIGSTOPは消せません。

受け取ったシグナルがSIGTRAPだったら、システムコールの入口/出口で止まったことを表しますので、システムコール番号の解析をします。

子の仕事はptrace(PTRACE_TRACEME, ...) を実行して「監視される準備」を整えるだけです。その後は余計なことをせずに監視対象にしたいプログラムをexecしてください。

編集者:すずき(2008/07/25 21:39)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2008年7月24日 >>> 2008年7月24日
link もっと後

管理用メニュー

link 記事を新規作成

<2008>
<<<07>>>
--12345
6789101112
13141516171819
20212223242526
2728293031--

最近のコメント5件

  • link 21年3月13日
    すずきさん (03/05 15:13)
    「あー、このプログラムがまずいんですね。ご...」
  • link 21年3月13日
    emkさん (03/05 12:44)
    「キャストでvolatileを外してアクセ...」
  • link 24年1月24日
    すずきさん (02/19 18:37)
    「簡単にできる方法はPowerShellの...」
  • link 24年1月24日
    KKKさん (02/19 02:30)
    「追伸です。\nネットで調べたらマイクロソ...」
  • link 24年1月24日
    KKKさん (02/19 02:25)
    「私もエラーで困ってます\n手動での回復パ...」

最近の記事3件

  • link 24年3月25日
    すずき (03/26 03:20)
    「[Might and Magic Book One TASのその後] 目次: Might and Magicファミコン版以前(...」
  • link 21年10月4日
    すずき (03/26 03:14)
    「[Might and Magicファミコン版 - まとめリンク] 目次: Might and Magicファミコン版TASに挑...」
  • link 24年3月19日
    すずき (03/20 02:52)
    「[モジュラージャックの規格] 古くは電話線で、今だとEthernetで良く見かけるモジュラージャックというコネクタとレセプタク...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 03/26 03:20