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 コード

最終更新: 7/17 22:53

カレンダー

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

最近のコメント 5件

  • link 18年07月04日
    すずき 「NEON にも対応してみましたが、やはり...」
    (更新:07/11 21:26)
  • link 18年05月30日
    すずき 「情報ありがとうございます。PT2 2枚差...」
    (更新:06/02 17:27)
  • link 18年05月30日
    通りすがりですみませ... 「私のPC(Win10)ではB−CAS1枚...」
    (更新:06/02 16:42)
  • link 18年05月20日
    すずき 「数えたことはありませんが Windows...」
    (更新:05/22 22:26)
  • link 18年05月20日
    hdk 「Linux も、先日の Meltdown...」
    (更新:05/21 22:55)

最近の記事 3件

link もっとみる
  • link 18年07月17日
    すずき 「[エアコンが臭い] 「エアコンの嫌なニオイが完全に消えた」 "窓全...」
    (更新:07/17 22:53)
  • link 18年07月16日
    すずき 「[AArch64 向け Linux 開発環境の構築 その 2] そ...」
    (更新:07/17 22:46)
  • link 18年07月07日
    すずき 「[Android と MPEG2-TS その 3] その 1、その...」
    (更新:07/17 22:46)

こんてんつ

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 サイトの情報