アプリケーションがVMWareまたはVirtualPC(またはMicrosoftが現在呼び出しているもの)で実行されているかどうかを判断するための公式方法はありますか?私が見たコードは通常、VMWareまたはVirtualPCの特定のバージョンでの奇妙な動作の副作用を利用したハッキングです。
理想的にはDelphiコードですが、公式の説明にリンクできれば、変換できると確信しています。
私は昨年、これに関する一連の記事をソースコードとともに書きました。 VMwareとWineの検出は ここ です。 Virtual PCは ここ です。ハイパーバイザー(Wineの場合、標準DLLの拡張)へのコールバックが文書化されているため、これら3つすべてにかなりの鉄壁の検出があります。コメントセクションに、テストされていないVirtualBox検出器(テスト用にインストールされていない)を配置しました。 Parallelsはコールバックを使用しても検出できる可能性がありますが、インストールしていません。ドキュメントへのリンク(エクスプロイトに焦点を当てているセキュリティ研究者からのものであるため貧弱です)が、インストールしていて興味がある場合は ここ にあります。 PPT here には、Sandbox、Bochs、およびXenの検出に関する情報が含まれています。コードはそれほど多くありませんが、次の場合に開始点となる可能性があります。それらを検出する必要があります。
Code Projectは、 プログラムが仮想マシン内で実行されているかどうかを検出する それを達成する方法を詳細に説明して理解を深める方法を示しています。
このスレッド SysInternalsフォーラムには、単一のIsVM関数を含むいくつかの回答があります(もちろんDelphiで)。 XPと、VMWareのXPとVistaの両方でホストされているWin2003でテストしたところ、良好な結果が得られました。
これに対する最善のアプローチは、ハードウェアプロファイルを確認することだと思います。仮想化ハードウェアは通常、会社名の一部を使用します。 Virtual PCでマザーボードの説明を確認すると、「MicrosoftCorporation」製であることがわかります。同様に、VMWareでは、イーサネットアダプタのプレフィックスとしてVMNetが付けられます。
マシンが物理またはVMであるかどうかを判別するには
dmidecode | egrep -i 'manufacturer|product'
Dmidecodeコマンドが見つからない場合は、それぞれのrpmをインストールします。
これは、EXSI、VMWARE、およびHypervマシンでテストされています。
すべてのメーカーにブロックが与えられ、最初の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;
RedPill メソッド(Delphiに変換されますが、コードを理解するのはそれほど難しくありません)を使用しました。これはかなりうまく機能しました。また、ネットワークアダプターのベンダー名や著作権などを取得するためにWMI呼び出しを使用したいくつかの追加チェックを含めましたが、これはVirtualPCの特定のバージョンを検出するためのものでした。
RedPillメソッドについての私の理解は、RedPillメソッドが機能し、その機能の性質に基づいてすべての仮想マシンを検出する必要があるということです。 Windows 7のWindows内の新しいWindows機能は、Windowsのコピーで選択したプログラムを実行するように構成できるため、誤検知が生成される可能性がありますXP Windows7内でシームレスに。
ここに投稿されたWMIの方法があります: http://blogs.msdn.com/virtual_pc_guy/archive/2005/10/27/484479.aspx
VirtualPCで実行されているXPイメージをダブルチェックインしましたが、テストしている値は同じです。ただし、他のVMがここに何を返すかは保証しません。 。
サードパーティのコンポーネントなどを必要とせずに、WMIを使用してデフォルトのプリンタのリストを取得し、変更するために、数年前に作成したDelphiプログラムを実際に入手しました。 DelphiのWMIを使用することに慣れていない場合は、コピーを送信して、問題を解決することができます(ただし、Unicode互換である必要はありませんが、アップグレードするのはそれほど難しくありません。必要なら)。
dmidecode -s system-product-name
VirtualBoxでテスト、結果:
Virtualbox
一般に、あらゆるタイプの仮想化の存在を検出する場合は、パフォーマンス特性を分析するのが最適です。仮想化が大幅に遅いもの(MMUフォーク爆弾のような重いワークロードなど))を取得し、通常のCPUバウンドユーザースペースアプリに対して時間を計ります。比率から簡単にわかります。
特定のVMMのみを気にする場合、作業の面で最も簡単なのは、ハードウェア、つまりVMwarePCIデバイスを探すことです。
00:07.3ブリッジ:Intel Corporation 82371AB/EB/MB PIIX4 ACPI(rev 08)サブシステム:VMwareInc仮想マシンチップセット
15ad:1976
ベンダーの値は「15ad」です
さまざまなバージョンのさまざまなVMM間で機能する特定のバックドアポートもあります。 SIDTトリックも優れていますが、VMMが彼のコードがチェックしているリストにない場合はどうなりますか?