KazuminEngine

プログラマーの日記

qemuの改造入門

久々にBlogを書きたくなったので、書いていきます。今回は、qemuを改造していきましょう。このBlogをこなすと簡単なqemuの改造ができるようになります。おそらく、低レイヤーを触ることになると思います。

改造と聞くと難しいことをするんじゃないかと思いますが、違います。難しいパッチを書くんじゃなくて、簡単なものです。terminalの簡単な操作ができて、簡単なc言語がわかるとできると思います。コードを書く時間はqemuのビルド時間より、はるかに短いものです。

CPU命令実行毎にとある情報をprintfさせる改造をします。

qemuのビルド方法(環境構築)

筆者は、VirtualBox6.0でUbuntu 18.04を使ってqemu4.1.50ビルドしています。

このサイトのwiki通りに環境設定していきましょう。

Hosts/Linux - QEMU

まずは、ライブラリなどをインストールするために、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に特殊命令を実装するのを次にやってみようと思っています。qemujitコンパイラなので、難しそうですが。あとは、アンチROPやアンチBoFを実装するのも面白そう。難しそうだけど。 改造において、qemuコードを読むことはとても重要ですが、読んでもわからなかったら、以下の資料などを読むといい。

rkx1209.hatenablog.com

rkx1209.hatenablog.com

KMC Staff Blog:QEMUメモ(1)

KMC Staff Blog:QEMUメモ(2)

KMC Staff Blog:QEMUメモ(3)

ではさらば、ハッピー低レイヤーライフを!!