2009-04-22 11 views
33

アプリケーションがVMWareまたはVirtual PC(またはMicrosoftが現在呼び出しているもの)で動作しているかどうかを判断する方法はありますか?私が見てきたコードは、通常、特定のバージョンのVMWareやVirtual PCで奇妙な動作上の副作用を利用するハックです。仮想マシンで実行するタイミングを決定する

理想的にはデルファイのコードですが、公式の説明にリンクできれば、私はそれを変換できると確信しています。

+1

興味があるだけあなたがVM上にある知るためのユースケースは何ですか?私はいつもあなたが物理的なハードウェア上にいるかどうかを知る必要はありません(理想的には)VMの主な利点の1つを考えました。 –

+0

本当に好奇心。同僚が尋ねられましたが、私はそれについての読書を思い出していましたが、最善の方法は不明でした。セキュリティ上の理由からアプリケーションをVMで実行しないように制限したいと思うかもしれませんが、それは本当にユーザーには分かりません。私はVirtual PCがあなたをVMWareで走らせることはできないことを知っています。 –

答えて

34

昨年、この記事をソースコードで書きました。 VMwareとワインの検出はhereです。仮想PCはhereです。ハイパーバイザーへのコールバック(標準DLLの拡張であるWineの場合)が文書化されているため、これらの3つはすべて鉄被覆検出機能を備えています。私は、テストされていないVirtualBox検出器(テストするためにインストールされていない)をコメントセクションに配置します。 Parallelsはコールバックを使用して検出可能かもしれませんが、私はそれをインストールしていません。あなたがそれをインストールして興味を持っているならば、hereが置かれているドキュメンテーション(これは悪用者が悪用に焦点を当てているのでセキュリティ研究者のものです)へのリンク。 Sandbox、Bochs、およびXenの検出に関する情報があるPPT hereもあります。その中にたくさんのコードはありませんが、それらを検出する必要がある場合は、出発点になるかもしれません。

+0

これは私がそれについて読むことを思い出した記事でした。ありがとう!コードはDelphiでもあります。 –

+2

VirtualPCの存在を検出するために正式に文書化されたスキームを使用していないことに注意してください。 VPCが外部との通信に使用する、実際のハードウェア上で無効にする必要がある命令を使用しています。将来、これらの命令が変更できない、またはIntelがCPUをリリースしてその「未使用」命令を使用できなかったとは言えません。 –

5

コードプロジェクトは、よく理解を与えるために、それを達成するためにどのように多くの詳細に行くDetect if your program is running inside a Virtual Machineへの道を示して

+1

私は前にそのリンクを見ていましたが、それは4歳であり、実際にはソースを配置していなかったので、まだ有効かどうかわかりませんでした。それ以来、仮想化ソフトウェアは大きく変化しました。 –

+0

これはかなり変更されていますが、その例では、ハイパーバイザーがインターアプトに使用するレジスタをチェックして、ハイパーバイザーに関する情報を知っている人で、その部分はまだ変更されていません。 – TStamper

+0

OK、これらを最新の仮想マシンでテストします。ありがとう! –

1

WMIの方法がここにあり掲載されています http://blogs.msdn.com/virtual_pc_guy/archive/2005/10/27/484479.aspx

私は、二重にチェックしましたVirtual PC上で実行されるXPイメージ、およびそれらがテストしている価値は同じです。しかし、他のVMがここに戻ってくるものは保証しません...

私は実際にWMIを使用してWMIを使用してリストを取得して変更するために数年前に書いたDelphiプログラムを持っていますパーティーのコンポーネントやそのようなもの。 DelphiのWMIでの作業に慣れていない場合は、コピーを送って作業することができます(ただし、必ずしもUnicode互換ではありませんが、アップグレードするのは難しいことではありません)必要なら)。

+0

他にもvirtualboxとVMWareがあります。 –

+0

正解です。正解をチェックしたい場合は、すべてがちょっと面倒です。これらの他のVMが提供するハードウェア情報を見て、そこで探すことができる特別な値を調べる必要があります。しかし、この質問はVPCを要求し、そのコードがそれを処理します。 WMIは、VMに関係なく、必要な情報を取得するための統一された方法のベスト・ベットだと主張します。変更する必要があるのは、確認するクエリとフィールド名だけです。 –

2

私はこれに最善のアプローチは、ハードウェアプロファイルを確認することだと思います。仮想化されたハードウェアは、通常、企業名の一部を使用します。 Virtual PCでマザーボードの説明を確認すると、「Microsoft Corporation」によって作成されたことがわかります。同様に、VMWareでは、イーサネットアダプタの先頭にVMNetが付きます。

2

This thread SysInternalsフォーラムには、IsVMの機能を含め、いくつかの回答があります(デルファイではもちろん)。私は、XPとWin2003でVMWareのXPとVistaの両方でホストされていることをテストしました。

1

私はRedPillメソッド(Delphiに翻訳されていますが、コードはそれほど難しくありません)を使用しましたが、これはかなりうまく機能しました。また、ネットワークアダプタのベンダ名や著作権を取得するためにWMI呼び出しを使用していくつかのチェックを追加しましたが、Virtual PCの特定のバージョンを検出するためのものでした。

RedPillメソッドを理解することは、すべての仮想マシンがどのように動作するかという性質に基づいて動作し、検出する必要があるということです。 Windows 7の新しいWindows機能は、Windows 7の中でWindows XPのコピーで選択したプログラムを実行するように構成できるため、誤検知も発生する可能性があります。

+1

RedPillの問題と同様に、最初のscoopy_dooのような同様の手法では、マルチコアシステム上で実行すると誤検出が発生するという問題があります。その他の詳細については、Googleの「NoPill」を参照してください。 –

+0

また、他の手法は時代遅れであり、誤検出もあります。http://charette.no-ip.com:81/programming/2009-12-30_Virtualization/index.html – tobsen

+0

@skamradt:これは見たことがありますか? - > http://blog.assarbad.net/20061105/redpill-getting-colorless/ – 0xC0000022L

0

一般に、あらゆる種類の仮想化が存在するため、パフォーマンスの特性を最もよく分析できます。仮想化(フォークボンベのようなMMUの重い作業負荷など)でかなり遅いものを取り出し、通常のCPUに拘束されたユーザースペースアプリに対してそれを実行します。比率から簡単に分かります。あなたが唯一の特定のVMMを心配している場合の労力の面で

最も簡単には、そのハードウェアつまり、VMwareのPCIデバイスを探すことです:

00:07.3ブリッジ:インテルコーポレーション82371AB/EB/MB PIIX4 ACPI(REV 08) サブシステム:VMwareの仮想マシン社のチップセット

15ad:1976

ベンダー値が「15ad」

で様々なバージョンでは、さまざまなVMMの間で動作し、特定のバックドアポートもあります。 s。 SIDTのトリックも良いですが、VMMが自分のコードがチェックしているリストにない場合はどうなりますか?

0

私はすべてのメーカーがブロックを与えられ、最初の3つの部分がそれらにユニークであるので、ちょうどMACアドレスを見て幸運を持っていました。 dmidecodeのコマンドは、それぞれのRPMをインストール見つからない場合は、マシンを決定するために

//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; 
+0

ほとんどの仮想化ソフトウェアでは、MACアドレスを任意のものに変更できるようになります。したがって、この手法は信頼性がありません。 –

1

dmidecode | egrep -i 'manufacturer|product' 

物理的またはVMです。

これは、EXSI、VMWARE、およびhypervマシンでテストされています。 VirtualBoxの上でテストさ

+0

'dmidecode'はroot権限が必要です。 – Raedwald

0
dmidecode -s system-product-name 

、結果:

Virtualbox 
関連する問題