1. ホーム
  2. virtualbox

アプリケーションから仮想化OSを検出する?

2023-09-20 10:57:51

質問

アプリケーションが仮想化された OS インスタンス内で実行されているかどうかを検出する必要があります。

私が見つけたのは 記事 を見つけました。同じ記事が複数の場所に出てくるので、元ネタがわからない。 VMware は自分自身に関する情報を返すために、特定の無効な x86 命令を実装しています。 仮想PC は IN 命令でマジックナンバーと I/O ポートを使用します。

これは実行可能ですが、両方のケースで文書化されていない動作のようです。VMWare または VirtualPC の将来のリリースでは、メカニズムが変更されるかもしれませんね。よりよい方法はありますか。どちらの製品でもサポートされているメカニズムはあるのでしょうか?

同様に Xen または VirtualBox ?

私は、プラットフォームが意図的に自身を隠そうとするケースについては懸念していません。たとえば、ハニーポットは仮想化を使用しますが、マルウェアがそれを検出するために使用するメカニズムを不明瞭にすることがあります。私のアプリがこれらのハニーポットで仮想化されていないと思われても気にせず、ただベスト エフォート ソリューションを探しています。

アプリケーションはほとんど Java ですが、この特定の機能ではネイティブ コードと JNI を使用することを期待しています。Windows XP/Vista のサポートが最も重要ですが、参照された記事で説明されているメカニズムは x86 の一般的な機能であり、特定の OS 機能には依存しません。

どのように解決するのですか?

をご存知ですか? 青いピル、赤いピル? . 仮想マシンの中で動いているかどうかを確認するために使われる手法です。この用語の由来は 映画「マトリックス ネオが青い薬と赤い薬 (マトリックス内にとどまるには青、「現実」の世界に入るには赤) を差し出される場面で使われます。

以下は、あなたが「マトリックス」の中を走っているかどうかを検出するコードです。

(コードは このサイト から拝借したもので、このトピックに関するいくつかの素晴らしい情報も含まれています)。

 int swallow_redpill () {
   unsigned char m[2+4], rpill[] = "\x0f\x01\x0d\x00\x00\x00\x00\xc3";
   *((unsigned*)&rpill[3]) = (unsigned)m;
   ((void(*)())&rpill)();
   return (m[5]>0xd0) ? 1 : 0;
 } 

この関数は、ウィルスマシン内で動作している場合は1を、そうでない場合は0を返します。