swapwm

gdb hacks - ターゲットプロセス内の関数を呼び出す (http://www.keshi.org/blog/2006/02/gdb_hacks.html)」の exec 呼ぶ(どうでもいいけど execlp は (3) な気が)例は、面白いものの利用方法皆無だと思っていたのですが、既に動いてるウィンドウマネージャの切り替えに使えることに気付きました。

というわけでなんか作ってみた。要 Linux & x86

http://shinh.skr.jp/binary/swapwm.c

えーと gdb でもぐり込んで exec する方法だと、たぶん gdb は exec の戻りを待っちゃうので新しいウィンドウマネージャが Detach されないなー、ということで C で書いた、という。原理は livepatch とかと似たようなっていうか適当にコード参照しつつ適当に dirty hack したとかそんな。

使い方は、

$ gcc swapwm.c
$ ./a.out 13056 /usr/bin/twm

とかそんな感じ。 13056 ってのは今動いてるウィンドウマネージャのプロセスID 。最後の引数は交換した後の WM のフルパス。

さっきまで sleep だったプロセスが急に ls に変わるとかもなかなか良いのですが、やはりウィンドウマネージャがパチパチ変わるのは結構びびって楽しかったです。

いや、普通はウィンドウマネージャ色々試したい時とかは、

$ X :1&
$ DISPLAY=:1 xterm

などとして X と xterm だけを動かして、それから xterm の中で色々 wm 動かしてみるんでしょうけどね…

もうちょいなんか書くか

原理。

まず ptrace で止める。 ptrace でレジスタ取ってくる。 EIP の値を ESP の値にする。 EIP の先に int 0x80 (Linuxシステムコール呼び出す時の割り込み) を ptrace 使って埋める。スタックの適当な位置に argv ぽいものを ptrace で埋める。スタックの適当な位置に environ ぽいのものを ptrace で埋める。その際 /proc//environ を読む。 EAX を SYS_execve にして EBX を argv[0] にして ECX を argv にして EDX を environ にしてから、 ptrace でレジスタを書き戻す。んで ptrace で detach して後は野となれ山となれ。

ウィンドウマネージャいじろうと思ってたんだけど、ふと思いついたので先にやっちゃったという。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h