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

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

日々

link permalink

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年 7月 25日 21:39]
link 編集する

コメント一覧

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



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

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 9/20 11:22

カレンダー

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

最近のコメント 5件

  • link 18年09月07日
    すずき 「ありがとう!\nこちらこそ、楽しみにして...」
    (更新:09/11 19:30)
  • link 18年09月07日
    よしだあ 「おつかれさまでした!\nまた仕事できるの...」
    (更新:09/11 19:17)
  • link 18年08月15日
    すずき 「うーん、なんか暴走したり、動かなかったり...」
    (更新:08/15 10:52)
  • link 18年08月15日
    すずき 「実行できた。あと実行ファイルパスについて...」
    (更新:08/15 10:42)
  • link 18年08月15日
    すずき 「さすがに x86_64 と arm のク...」
    (更新:08/15 10:35)

最近の記事 3件

link もっとみる
  • link 18年09月15日
    すずき 「[TigerVNC のエラーメッセージ] TigerVNC Jav...」
    (更新:09/20 11:22)
  • link 18年09月16日
    すずき 「[音が出なくなったよ Windows 10] 昨日まで元気に動作し...」
    (更新:09/20 11:10)
  • link 18年09月13日
    すずき 「[府民から都民へ] 家が決まりました。今月末から東京都民です。さよ...」
    (更新:09/17 20:03)

こんてんつ

open/close wiki
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 過去日記について

その他の情報

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