XBYAKは演算子オーバーロードなどを使ってC++のコード中にx86のニーモニックとほとんど同じものを直接記述し、動的に実行コードを生成できるようにするライブラリ。その辺もすごそうだけど、それとは別にどうやって動的にコードを実行できるようにしているのか見てみた。 protectという関数:
/** |
の中で、WindowsではVirtualProtect関数、Unix系ではmprotectを使って、メモリ領域の実行可能属性をセットしている。 この関数を使って、ヒープだかスタック領域だかに実行可能属性をつけると実行時に関数が作れる:
void* make_adder(int y) { |
もちろん、protect 関数を呼び出さないとヒープ領域のコードは実行できない…のかと思ったらそんなことはなくできてしまった…(WindowsXP)。Linuxでは試してない。
- これがちゃんと効いてれば、バッファオーバーランもそんなに怖くない気がする
- CPUのメモリマネージャって仕組みよく知らないんだけど、そんなに細かい単位でメモリの領域に対して実行可能属性とか設定できるのかな?
- __GNUC__の場合はページ単位で設定するようになってる
- x86のマシンコードを調べるのにてこずった…
- gccだけでリストファイルを出力するオプションがわからず
- 「gcc -S hoge.c」して「as -a hoge.s」
- XBYAKを使えば、Compilers: Backend to Frontend and Back to Front Againを動的にできるかなぁ、などと妄想