Frage

Gibt es eine Möglichkeit, innerhalb einer VM zu erkennen, dass Ihr Code in einer VM ausgeführt wird?

Ich denke, es gibt mehr oder weniger einfache Möglichkeiten, bestimmte VM-Systeme zu identifizieren, insbesondere wenn auf der VM die Erweiterungen des Anbieters installiert sind (z. B. für VirtualBox oder VMWare).Aber gibt es eine allgemeine Möglichkeit, festzustellen, dass Sie nicht direkt auf der CPU laufen?

War es hilfreich?

Lösung

Ein Großteil der diesbezüglichen Forschung widmet sich der Erkennung sogenannter „Blue-Pill“-Angriffe, also eines bösartigen Hypervisors, der aktiv versucht, der Erkennung zu entgehen.

Der klassische Trick zum Erkennen einer VM besteht darin, den ITLB zu füllen und eine Anweisung auszuführen muss virtualisiert werden (wodurch dieser Prozessorstatus zwangsläufig gelöscht wird, wenn er die Kontrolle an den Hypervisor übergibt), führen Sie dann weiteren Code aus, um festzustellen, ob der ITLB noch gefüllt ist.Das erste Papier darauf befindet sich Hier, und eine ziemlich farbenfrohe Erklärung von a Blog des Forschers und alternativ Wayback Machine-Link zum Blog-Artikel (Bilder defekt).

Das Fazit der Diskussionen zu diesem Thema ist, dass es immer eine Möglichkeit gibt, einen bösartigen Hypervisor zu erkennen, und dass es viel einfacher ist, einen zu erkennen, der sich nicht zu verstecken versucht.

Andere Tipps

Red Hat verfügt über ein Programm, das erkennt, unter welchem ​​Virtualisierungsprodukt es ausgeführt wird (falls vorhanden): virt-what.

Die Verwendung eines von einem Drittanbieter verwalteten Tools ist auf lange Sicht eine bessere Strategie als der Versuch, eine eigene Erkennungslogik zu entwickeln:mehr Augen (Testen mit mehr Virtualisierungsprodukten) usw.

Ein eher empirischer Ansatz besteht darin, nach bekannten VM-Gerätetreibern zu suchen.Sie könnten WMI-Abfragen schreiben, um beispielsweise den VMware-Anzeigeadapter, das Festplattenlaufwerk, den Netzwerkadapter usw. zu finden.Dies wäre geeignet, wenn Sie wüssten, dass Sie sich nur um bekannte VM-Hosttypen in Ihrer Umgebung kümmern müssen.Hier ist ein Beispiel dafür in Perl, das in die Sprache Ihrer Wahl portiert werden kann.

Es kommt darauf an, was Sie suchen:

  • Wenn sich die VM nicht absichtlich vor Ihnen versteckt, können Sie einen bekannten Hook verwenden.Suchen Sie beispielsweise nach VmWare-Treibern oder nach bestimmten Zeichenfolgen im Speicher oder nach bestimmten anderen verräterischen Anzeichen.

  • Wenn die VM wirklich möchte, dass Sie spezielle Dinge für sie tun, verfügt sie über einen offensichtlichen Haken, z. B. das Ändern der ID des Prozessors oder das Hinzufügen einiger spezieller Register, auf die Sie zugreifen können, um ihn zu erkennen.Oder es handelt sich um ein spezielles Gerät an einem bekannten Ort im Speicher (vorausgesetzt, Sie können direkten Zugriff auf den physischen Speicherbereich Ihrer Welt erhalten).Beachten Sie, dass moderne Maschinendesigns wie IBM Power6 und Sun UltraSparc T1/T2 darauf ausgelegt sind, IMMER einen Hypervisor und niemals direkt auf reiner Hardware auszuführen.Die Schnittstelle zur „Hardware“, die ein Betriebssystem verwendet, ist tatsächlich die Schnittstelle einer Hypervisor-Softwareschicht, an der es keinen Weg gibt, sie zu umgehen.In diesem Fall ist die Erkennung trivial, da es sich um ein konstantes „Ja“ handelt.Dies ist wahrscheinlich die zukünftige Richtung für alle Computersysteme, die sich diesen Overhead leisten können. Schauen Sie sich die Unterstützung neuerer Designs wie zum Beispiel des Freescale QorIQ P4080-Chips an (www.freescale.com/qoriq).

  • Wenn die VM absichtlich versucht, sich zu verstecken, und Sie ihrer Anwesenheit nachjagen, handelt es sich um ein Katz-und-Maus-Spiel, bei dem die Timing-Störung und das unterschiedliche Leistungsprofil einer VM sie fast immer verraten.Dies hängt natürlich davon ab, wie die VM implementiert ist und wie viel Hardwareunterstützung in der Architektur vorhanden ist (ich denke, ein zSeries-Mainframe kann das Vorhandensein einer VM oder eines Stapels von VMs unter Ihrem bestimmten Betriebssystem viel besser verbergen als ein normaler x86). Maschine ist zum Beispiel).Sehen http://jakob.engbloms.se/archives/97 für eine Diskussion zu diesem Thema.Es ist möglich, sich als VM zu verstecken, aber die Erkennung wird höchstwahrscheinlich immer gewinnen, wenn man sich genug Mühe gibt.

Ich bin einmal auf ein Assembler-Code-Snippet gestoßen, das Ihnen sagt, ob Sie sich in einer VM befinden ... Ich habe gegoogelt, konnte aber den Originalartikel nicht finden.

Das habe ich allerdings gefunden: Erkennen Sie, ob Ihr Programm in einer virtuellen Maschine ausgeführt wird.

Ich hoffe es hilft.

In den meisten Fällen sollten Sie es nicht versuchen.Es sollte Ihnen egal sein, ob jemand Ihren Code in einer VM ausführt, außer in einigen bestimmten Fällen.

Wenn nötig, ist unter Linux die häufigste Methode das Anschauen /sys/devices/virtual/dmi/id/product_name, das auf den meisten realen Systemen den Namen des Laptops/Mainboards und auf den meisten virtuellen Systemen den Namen des Hypervisors auflistet. dmidecode | grep Product ist eine weitere gängige Methode, aber ich denke, dafür ist Root-Zugriff erforderlich.

Hier ist ein (Java + Windows)-Lösung, um festzustellen, ob die zugrunde liegende Maschine physisch oder virtuell ist.

Beispiele für virtuelle Maschinen:

Hersteller

  • Xen
  • Microsoft Corporation
  • innotek GmbH
  • roter Hut
  • VMware, Inc.

Modell

  • HVM domU
  • Virtuelle Maschine
  • VirtualBox
  • KVM
  • Virtuelle VMware-Plattform

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.List;
    
    public abstract class OSUtil {
    
    public static final List<String> readCmdOutput(String command) {
        List<String> result = new ArrayList<>();
    
        try {
            Process p=Runtime.getRuntime().exec("cmd /c " + command);
            p.waitFor();
            BufferedReader reader=new BufferedReader(
                    new InputStreamReader(p.getInputStream())
                    );
            String line;
            while((line = reader.readLine()) != null) {
                if(line != null && !line.trim().isEmpty()) {
                    result.add(line);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    
        return result;
    }
    
    public static final String readCmdOutput(String command, int lineNumber) {
        List<String> result = readCmdOutput(command);
        if(result.size() < lineNumber) {
            return null;
        }
    
        return result.get(lineNumber - 1);
    }
    
    public static final String getBiosSerial() {
        return readCmdOutput("WMIC BIOS GET SERIALNUMBER", 2);
    }
    
    public static final String getHardwareModel() {
        return readCmdOutput("WMIC COMPUTERSYSTEM GET MODEL", 2);
    }
    
    public static final String getHardwareManufacturer() {
        return readCmdOutput("WMIC COMPUTERSYSTEM GET MANUFACTURER", 2);
    }
    
    public static void main(String[] args) {
        System.out.println("BIOS Serial: " + getBiosSerial());
        System.out.println("Hardware Model: " + getHardwareModel());
        System.out.println("Hardware Manufacturer: " + getHardwareManufacturer());
    }
    }
    

Anhand der Ausgabe können Sie entscheiden, ob es sich um eine VM oder eine physische Maschine handelt:

Physische Maschinenausgabe:

BIOS-Seriennummer:2HC3J12
Hardwaremodell:Inspiron 7570
Hardware-Hersteller:Dell Inc.

Ausgabe der virtuellen Maschine:

BIOS-Seriennummer:0
Hardwaremodell:Innotec GmbH
Hardware-Hersteller:Virtuelle Box

Ein gutes Beispiel ist die scheinbare Durchführung einer WMI-Abfrage für den Motherboard-Hersteller, und wenn diese „Microsoft“ zurückgibt, befinden Sie sich in einer VM.Ich dachte, das ist nur für VMWare.Es gibt wahrscheinlich unterschiedliche Möglichkeiten, dies für jede VM-Hostsoftware festzustellen.

Dieser Artikel hier http://blogs.technet.com/jhoward/archive/2005/07/26/407958.aspx hat einige gute Vorschläge und Links zu verschiedenen Möglichkeiten, um zu erkennen, ob Sie sich in einer VM befinden (zumindest VMWare und VirtualPC).

Möglicherweise können Sie anhand der MAC-Adresse Ihrer Netzwerkverbindung erkennen, ob Sie sich in einer virtuellen Maschine befinden.Xen empfiehlt beispielsweise normalerweise die Verwendung eines bestimmten Adressbereichs 00:16:3e:xx:xx:xx.

Dies kann nicht garantiert werden, da es Sache des Systemadministrators ist, anzugeben, welche MAC-Adresse er möchte.

In Linux-Systemen können Sie versuchen, unter /proc nach gemeinsamen Dateien zu suchen.

Beispiel: Die Existenz von /proc/vz/ sagt Ihnen, dass es sich um eine OpenVZ handelt.

Hier finden Sie eine vollständige Anleitung zum Erkennen der VM-Umgebung unter Linux ohne „Pillen trinken“ zu müssen :)

TrapKIT stellt ScoopyNG zur Verfügung, ein Tool zur VMware-Identifizierung – Es wird versucht, Umgehungstechniken zu umgehen, zielt aber nicht unbedingt auf andere Virtualisierungssoftware als VMware ab.Sowohl Quell- als auch Binärdateien sind verfügbar.

Wenn die VM ihre Aufgabe gut erfüllt, sollte für den Client nicht erkennbar sein, dass sie virtualisiert wird.Allerdings kann man sich auch andere Hinweise ansehen.

Ich könnte mir vorstellen, dass die Suche nach bekannten Treibern oder spezieller Software für die VM-Umgebung der beste Weg wäre.

Auf einem VMWare-Client unter Windows wäre beispielsweise vmxnet.sys der Netzwerktreiber, der als VMware-beschleunigter AMD PCNet-Adapter angezeigt wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top