raw_write.h

よく、 libc の関数呼べるかどうかはあやしい部分を printf デバッグしたいことがあると思います。あるんですよ!

そういう時にシステムコールってどう呼ぶんだっけ…みたいなことを調べたり、ええと数字を出力したい…とかいうのは結構かったるいので、 #include するだけで使えるライブラリを書いてみました。 for linux

https://github.com/shinh/test/blob/master/raw_write.h

使いかたはテストの方を見てください。要は RAW_PRINT_STR, RAW_PRINT_INT, RAW_PRINT_PTR とかが print で、 RAW_PUTS_STR, RAW_PUTS_INT, RAW_PUTS_PTR とかが改行つきです。

https://github.com/shinh/test/blob/master/raw_write_test.c

ついでに nop を埋める RAW_NOP() と、逆アセした時に注目したいコードをマーキングする用途で、 4242 とかで検索したら見つかるようにしてある RAW_UNIQ_NOP() 、 breakpoint を埋める RAW_BREAK() をおまけとしてつけてあります。

そういえば x86-64 の inline assembly てやつは、どうも RAX とかに入れますよーっていう constraint がたぶん無いんだと思う(EAXとかはもちろんあるけど)。しょうがないから、

http://gcc.gnu.org/bugzilla/attachment.cgi?id=17274

とかに書いてある通り、 register unsigned long rsi asm("rsi") みたいなのを定義して、 constraint を +r にしてやることでなんとかした。あとの引数はまあ 64bit いらんし、 constraint でいいんじゃないかな…

でもなんか雰囲気的には constraint でレジスタ指定するのは筋が悪いってのが GCC の気持ちなんですかね。このへん見ると。

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=16331

あともうひとつ、 GCC の inline assembly は input register を clobber register として指定できないのもよくわからんなーとか思う。 =r とかにするには変数定義せにゃならんし、マクロの中とかだと特にめんどくさいんだよな…

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