qemuの改造入門
久々にBlogを書きたくなったので、書いていきます。今回は、qemuを改造していきましょう。このBlogをこなすと簡単なqemuの改造ができるようになります。おそらく、低レイヤーを触ることになると思います。
改造と聞くと難しいことをするんじゃないかと思いますが、違います。難しいパッチを書くんじゃなくて、簡単なものです。terminalの簡単な操作ができて、簡単なc言語がわかるとできると思います。コードを書く時間はqemuのビルド時間より、はるかに短いものです。
CPU命令実行毎にとある情報をprintfさせる改造をします。
qemuのビルド方法(環境構築)
筆者は、VirtualBox6.0でUbuntu 18.04を使ってqemu4.1.50ビルドしています。
このサイトのwiki通りに環境設定していきましょう。
まずは、ライブラリなどをインストールするために、terminalで以下を実行してください。注意として、zlib1g-devのgの前はlでなく1です。
# sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev
次に、qemuのインストールです。
# git clone https://github.com/qemu/qemu
さて、qemuのビルドをしましょう。qemuのソースとビルドされたバイナリなどの総量が約3GBかかるので注意が必要です。容量に余裕を持ってビルドしましょう。結構時間がかかるので、Twitterを見たりして、コーヒーブレイクなどを。
# Switch to the QEMU root directory. cd qemu # Prepare a native debug build. mkdir -p bin/debug/native cd bin/debug/native # Configure QEMU and start the build. ../../../configure --enable-debug make # Return to the QEMU root directory. cd ../../..
qemu改造
さて、次は改造です。実際にc言語を書いていきます。書くと言っても、たったの2行ですが。
cpu命令実行毎に命令のサイズを表示するように改造してやるのです。今回は筆者の都合でx86なアーキテクチャーを改造していきます。
改造の方針ですが、 コードを読むと、(詳しいコードの読み方は割愛しますが、あとて共有するサイトなどを見てみると良いかもしれません。) 命令実行毎にcpu_tb_execがループで呼び出されていて、tcg_qemu_tb_exec(env, tb_ptr);で命令を実行しているようなので、ここの前にprintfをはめ込んでやればいいことがわかります。
accel/tcg/cpu-exec.cに以下を足してください。
20行目あたりに
#include <stdio.h>
ret = tcg_qemu_tb_exec(env, tb_ptr); の上に
printf("%o¥n",itb->size);
これで改造は終了です。
次はビルドしてあげましょう。以下のように実行してください。
# pwd qemu/bin/debug/native # make
実行
改造が完了したので、早速、実行していきましょう。楽しみですね。
# pwd emu/bin/debug/native # x86_64-softmmu/qemu-system-x86_64 -L pc-bios VNC server running on 127.0.0.1:5900 5 13 4 6 11 省略
できてますね。
5とか13とかが命令のサイズのようです。byteなのかは筆者はそこまで調べていませんが。5と13を比べるとだいぶ差がありますね。
今後の道しるべ
あとは、自分の気の向くまま、コードを読んだり、改造したり、commitしたり、頑張ってください。 筆者は、qemuに特殊命令を実装するのを次にやってみようと思っています。qemuはjitコンパイラなので、難しそうですが。あとは、アンチROPやアンチBoFを実装するのも面白そう。難しそうだけど。 改造において、qemuコードを読むことはとても重要ですが、読んでもわからなかったら、以下の資料などを読むといい。
ではさらば、ハッピー低レイヤーライフを!!