2011/07/22

VMware上での動作を検知

デバッグをしてるとたまに見かける"Privileged instruction"が気になったので調べてみたところ、VMware上での動作を検出するものでした。
VMwareのサイトの
Mechanisms to determine if software is running in a VMware virtual machine
にあり、他の検出方法についてもまとめてあったので参考にしました。

私が見つけたのは下の2つの例です。

 

この二つはどちらもこのサイトで言う"Hypervisor port"というタイプです。
"Privileged instruction"というメッセージと共に止まった場所は
IN EAX, DX
という命令です。
IN命令は、I/Oポートからデータの取得をするもので、ソースオペランドにはDXレジスタか即値でアクセスするI/Oポートを指定し、デスティネーションオペランドにその値が入れられます。

上の2つの場合ではどちらもDXレジスタには0x5658という値が入っています。これはVMwareのハイパーバイザで使用されるポート(VMware Backdoor I/O Port)で、このサイトに詳しく載っています。
それによればバックドアポートにアクセスする時にはEAXにはマジックナンバーとして0x564D5868を入れておき、CXレジスタで実行するコマンド番号を設定、コマンドによってはEBXレジスタに必要なパラメータを入れます。
上で挙げたやつの場合は、1つ目はCXに0x0Aが入っているので"Get VMware version"コマンド、2つ目は0x14なので"Get memory size (MB)"コマンドです。

コマンドの詳しい話は置いておいて、ではどのようにVMwareだと検知するかというとI/Oポートにアクセスしてみて、例外が発生し無かったら検知する、という仕組みです。
この、バックドアI/Oポートにアクセスと試す方法の他にCPUID命令を使う方法とBIOSのDMI機能を使う方法があるようです。実際にDMIで得られる情報を見てみると普通にVMwareの文字が見られます。

カーネルデバッグすることだとか簡単にスナップショットが取れることとかを考えると仮想マシンでの解析がすごく魅力的で、是非やりたいんですけど自分のマシンは非力なんで仮想マシンなんて動かしたら重くて重くて…
いつか仮想マシン上で解析するときにはここらへんの事を実機でやるよりも余計に考える必要があるようです。

0 件のコメント:

コメントを投稿