アプリケーションが VMWare または Virtual PC (または Microsoft が現在呼び出しているもの) で実行されているかどうかを判断する公式の方法はありますか? 私が見たコードは通常、VMWare または Virtual PC の特定のバージョンで奇妙な振る舞いの副作用を利用したハックです。
理想的には Delphi コードですが、公式の説明にリンクできる場合は、変換できると確信しています。
アプリケーションが VMWare または Virtual PC (または Microsoft が現在呼び出しているもの) で実行されているかどうかを判断する公式の方法はありますか? 私が見たコードは通常、VMWare または Virtual PC の特定のバージョンで奇妙な振る舞いの副作用を利用したハックです。
理想的には Delphi コードですが、公式の説明にリンクできる場合は、変換できると確信しています。
私は昨年、これに関するソース コード付きの一連の記事を書きました。VMware と Wine の検出はこちらです。仮想PCはこちらです。ハイパーバイザーへのコールバックが文書化されているため (Wine の場合、標準 DLL の拡張機能)、これら 3 つすべてがかなり鉄壁の検出を行います。コメント セクションに未テストの VirtualBox 検出器 (テスト用にインストールしていません) を掲載しました。Parallels はコールバックを使用しても検出できる可能性がありますが、インストールしていません。ドキュメントへのリンク (エクスプロイトに焦点を当てたセキュリティ研究者からのものであるため、不十分です) が、インストール済みで興味がある場合は、ここにあります。PPTもありますSandbox、Bochs、および Xen の検出に関する情報が含まれています。そこには多くのコードはありませんが、それらを検出する必要がある場合の出発点になる可能性があります。
Code Project は、プログラムが仮想マシン内で実行されているかどうかを検出する方法を示しており、それを達成する方法について詳しく説明しています。
これに対する最善のアプローチは、ハードウェア プロファイルを確認することだと思います。通常、仮想化されたハードウェアは会社名の一部を使用します。Virtual PC でマザーボードの説明を確認すると、「Microsoft Corporation」製であることがわかります。同様に、VMWare では、イーサネット アダプタの前に VMNet が付きます。
SysInternals フォーラムのこのスレッドには、単一の IsVM 関数を含む、(もちろん Delphi で) いくつかの回答があります。VMWare の XP と Vista の両方でホストされている XP と Win2003 でテストしましたが、良好な結果が得られました。
マシンが物理マシンか VM かを判別するには
dmidecode | egrep -i 'manufacturer|product'
dmidecode コマンドが見つからない場合は、それぞれの rpm をインストールします。
これは、EXSI、VMWARE、および hyperv マシンでテストされています。
私はRedPillメソッド (Delphi に翻訳されていますが、コードを理解するのはそれほど難しくありません) を使用しましたが、これはかなりうまく機能しました。また、WMI 呼び出しを使用して、ネットワーク アダプターのベンダー名や著作権などを取得する追加のチェックもいくつか含めましたが、これは Virtual PC の特定のバージョンを検出するためのものでした。
RedPill メソッドについての私の理解では、それが機能し、その機能の性質に基づいてすべての仮想マシンを検出する必要があるということです。Windows 7 の新しい Windows 内の Windows 機能は、Windows 7 内で Windows XP のコピーで選択したプログラムをシームレスに実行するように構成できるため、誤検知が生成される可能性もあります。
ここに投稿された WMI の方法があります: http://blogs.msdn.com/virtual_pc_guy/archive/2005/10/27/484479.aspx
Virtual PC で実行されている XP イメージを再確認しましたが、テスト対象の値は同じです。ただし、ここで他の VM が何を返すかは保証しません...
私は実際に、数年前に作成した Delphi プログラムを持っています。これは、サード パーティ コンポーネントなどを必要とせずに、WMI を使用してデフォルト プリンタのリストを取得して変更するためのものです。Delphi からの WMI の操作に慣れていない場合は、コピーをお送りしますので、何か作業が必要です (必ずしも Unicode と互換性があるとは限りませんが、アップグレードするのは難しくありません)。必要なら)。
すべてのメーカーにブロックが与えられており、最初の 3 つの部分はメーカーに固有であるため、MAC アドレスを見るだけで幸運でした。
//look at the MAC address and determine if it's a Virtual Machine
$temp = preg_split("/\s+/",exec("/sbin/ifconfig -a eth0 2>&1 | /bin/grep HWaddr"), -1, PREG_SPLIT_NO_EMPTY);
//Virtual Box MACs all start with '08:00:27:xx:xx:xx'
if (strpos($temp[4], '08:00:27') !== false) $_SESSION['DEVELOPMENT'] = true;
あらゆるタイプの仮想化の存在を一般的に検出したい場合は、パフォーマンス特性を分析するのが最善です。仮想化で大幅に遅いもの (フォーク爆弾のような MMU の重いワークロードなど) を取り、通常の CPU バウンドのユーザー空間アプリに対して時間を計ります。比率から簡単にわかります。
特定の VMM のみに関心がある場合、労力の点で最も簡単なのは、それらのハードウェア、つまり VMware PCI デバイスを探すことです。
00:07.3 ブリッジ: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08) サブシステム: VMware Inc 仮想マシン チップセット
15ad:1976
ベンダー値は「15ad」です
また、さまざまなバージョンのさまざまな VMM で機能する特定のバックドア ポートもあります。SIDT のトリックも有効ですが、コードがチェックしているリストに VMM が含まれていない場合はどうなるでしょうか。
dmidecode -s system-product-name
VirtualBox でテストした結果:
Virtualbox