Ich muss feststellen, ob meine Anwendung in einer virtualisierten Betriebssysteminstanz ausgeführt wird oder nicht.
Ich habe einen Artikel mit nützlichen Informationen zum Thema gefunden. Der gleiche Artikel erscheint an mehreren Stellen, ich bin mir der Originalquelle nicht sicher. VMware implementiert einen bestimmten ungültigen x86-Befehl, um Informationen über sich selbst zurückzugeben, während VirtualPC eine magische Nummer und einen E / A-Port mit einem IN-Befehl verwendet.
Dies ist praktikabel, scheint jedoch in beiden Fällen ein undokumentiertes Verhalten zu sein. Ich nehme an, eine zukünftige Version von VMWare oder VirtualPC könnte den Mechanismus ändern. Gibt es einen besseren Weg? Gibt es für beide Produkte einen unterstützten Mechanismus?
Gibt es eine Möglichkeit, Xen oder VirtualBox zu erkennen ?
Ich mache mir keine Sorgen über Fälle, in denen die Plattform absichtlich versucht, sich zu verstecken. Beispielsweise verwenden Honeypots Virtualisierung, verschleiern jedoch manchmal die Mechanismen, mit denen Malware sie erkennt. Es ist mir egal, dass meine App denkt, dass sie in diesen Honeypots nicht virtualisiert ist. Ich suche nur nach einer "Best Effort" -Lösung.
Die Anwendung ist hauptsächlich Java, obwohl ich erwarte, für diese spezielle Funktion nativen Code plus JNI zu verwenden. Die Unterstützung von Windows XP / Vista ist am wichtigsten, obwohl die im Artikel beschriebenen Mechanismen allgemeine Funktionen von x86 sind und nicht auf einer bestimmten Betriebssystemfunktion beruhen.
quelle
Antworten:
Hast du von blauer Pille, roter Pille gehört? . Mit dieser Technik können Sie feststellen, ob Sie in einer virtuellen Maschine ausgeführt werden oder nicht. Der Ursprung des Begriffs stammt aus dem Matrixfilm, in dem Neo eine blaue oder eine rote Pille angeboten wird (um in der Matrix zu bleiben = blau oder um in die 'reale' Welt = rot einzutreten).
Das Folgende ist ein Code, der erkennt, ob Sie in der Matrix ausgeführt werden oder nicht:
(Code, der von dieser Site ausgeliehen wurde und auch einige nützliche Informationen zum jeweiligen Thema enthält):
Die Funktion gibt 1 zurück, wenn Sie in einem virutalen Computer ausgeführt werden, andernfalls 0.
quelle
Unter Linux habe ich den Befehl verwendet: dmidecode (ich habe ihn sowohl unter CentOS als auch unter Ubuntu)
vom Mann:
Also habe ich die Ausgabe durchsucht und herausgefunden, dass es sich wahrscheinlich um Microsoft Hyper-V handelt
Eine andere Möglichkeit besteht darin, zu suchen, mit welchem Hersteller die MAC-Adresse von eth0 zusammenhängt: http://www.coffer.com/mac_find/
Wenn Microsoft, VMware usw. zurückgegeben werden, handelt es sich wahrscheinlich um einen virtuellen Server.
quelle
/dev/mem
.VMware verfügt über einen Mechanismus zum Bestimmen, ob Software in einem Knowledge Base-Artikel der virtuellen VMware-Maschine ausgeführt wird, der Quellcode enthält.
Microsoft hat auch eine Seite zum Thema "Feststellen, ob Hypervisor installiert ist" . MS beschreibt diese Anforderung eines Hypervisors im Abschnitt " IsVM-TEST" des Dokuments "Validierungstest für die Servervirtualisierung "
Die VMware- und MS-Dokumente erwähnen beide die Verwendung des CPUID-Befehls zum Überprüfen des Hypervisor-Present-Bits (Bit 31 des Registers ECX).
Der RHEL-Bugtracker hat einen für "sollte das ISVM-Bit (ECX: 31) für das CPUID-Blatt 0x00000001 setzen" , um das Bit 31 des Registers ECX unter dem Xen-Kernel zu setzen.
Ohne auf die Herstellerangaben einzugehen, können Sie mithilfe der CPUID-Prüfung feststellen, ob Sie virtuell arbeiten oder nicht.
quelle
Nein. Dies ist nicht vollständig zu erkennen. Einige Virtualisierungssysteme wie QEMU emulieren eine gesamte Maschine bis in die Hardwareregister. Lassen Sie uns das umdrehen: Was versuchen Sie zu tun? Vielleicht können wir dabei helfen.
quelle
Ich denke, dass es in Zukunft nicht wirklich hilfreich sein wird, sich auf Tricks wie die kaputte SIDT-Virtualisierung zu verlassen, da die Hardware alle Lücken schließt, die die seltsame und unordentliche x86-Architektur hinterlassen hat. Am besten setzen Sie sich bei den VM-Anbietern für eine Standardmethode ein, um festzustellen, ob Sie sich auf einer VM befinden - zumindest für den Fall, dass der Benutzer dies ausdrücklich zugelassen hat. Wenn wir jedoch davon ausgehen, dass wir die Erkennung der VM explizit zulassen, können wir dort genauso gut sichtbare Markierungen platzieren, oder? Ich würde vorschlagen, nur die Festplatte auf Ihren VMs mit einer Datei zu aktualisieren, die Ihnen mitteilt, dass Sie sich auf einer VM befinden - beispielsweise einer kleinen Textdatei im Stammverzeichnis des Dateisystems. Oder überprüfen Sie den MAC von ETH0 und setzen Sie diesen auf einen bestimmten bekannten String.
quelle
Unter virtualbox können Sie diesen Befehl verwenden, vorausgesetzt, Sie haben die Kontrolle über den VM-Gast und Sie haben dmidecode:
und es wird zurückkehren
quelle
Ich möchte ein Dokument empfehlen, das unter Usenix HotOS '07 veröffentlicht wurde: " Komprimierbarkeit ist nicht Transparenz: Mythen und Realitäten der VMM-Erkennung" , in dem verschiedene Techniken zum Feststellen der Anwendung der Anwendung in einer virtualisierten Umgebung abgeschlossen werden.
Verwenden Sie beispielsweise die sidt-Anweisung wie redpill (diese Anweisung kann jedoch auch durch dynamische Übersetzung transparent gemacht werden), oder vergleichen Sie die Laufzeit von cpuid mit anderen nicht virtualisierten Anweisungen.
quelle
Diese C-Funktion erkennt das VM-Gastbetriebssystem:
(Getestet unter Windows, kompiliert mit Visual Studio)
quelle
Unter Linux können Sie über / proc / cpuinfo berichten. Wenn es sich um VMware handelt, wird es normalerweise anders angezeigt als wenn es auf Bare-Metal-Basis ausgeführt wird, jedoch nicht immer. Virtuozzo zeigt einen Durchgang zur zugrunde liegenden Hardware.
quelle
Lesen Sie die SMBIOS- Strukturen, insbesondere die Strukturen mit den BIOS- Informationen.
Unter Linux können Sie das Dienstprogramm dmidecode verwenden, um die Informationen zu durchsuchen.
quelle
dmidecode
Zum Ausführen ist eine Superuser-Berechtigung (Root) erforderlich, daher ist dies in einer Anwendung nicht so nützlich.Während der Installation der neuen Ubuntu entdeckte ich das Paket namens imvirt. Schauen Sie sich das unter http://micky.ibh.net/~liske/imvirt.html an
quelle
Überprüfen Sie das Werkzeug virt-what . Es verwendet den zuvor erwähnten dmidecode, um festzustellen, ob Sie sich auf einem virtualisierten Host befinden und welchen Typ.
quelle
Ich verwende diese
C#
Klasse, um festzustellen, ob das Gastbetriebssystem in einer virtuellen Umgebung ausgeführt wird ( nur Windows ):sysInfo.cs
Verwendung:
quelle
Unter Linux bietet systemd einen Befehl zum Erkennen, ob das System als virtuelle Maschine ausgeführt wird oder nicht.
Befehl:
$ systemd-detect-virt
Wenn das System virtualisiert ist, gibt es den Namen der Virtuslization-Software / -Technologie aus. Wenn nicht, wird ausgegeben
none
Wenn auf dem System beispielsweise KVM ausgeführt wird, gilt Folgendes:
Sie müssen es nicht als sudo ausführen.
quelle
Ich habe einen anderen von meinem Freund vorgeschlagenen Ansatz ausprobiert. Virtuelle Maschinen, die auf VMWARE ausgeführt werden, haben keine CPU-TEMPERATUR-Eigenschaft. dh sie zeigen nicht die Temperatur der CPU. Ich verwende die CPU-Thermometer-Anwendung zum Überprüfen der CPU-Temperatur.
(Windows läuft in VMWARE)
(Windows läuft auf einer echten CPU)
Also codiere ich ein kleines C-Programm, um den Temperatursensor zu erkennen
Ausgabe auf einem VMware-Computer
Ausgabe auf einer echten CPU
quelle