Создаём класс NativeMethods.cs Записываем в него следующий код: namespace AntiVM { using System; using System.Runtime.InteropServices; internal static class NativeMethods { [DllImport("kernel32.dll", BestFitMapping = false, CharSet = CharSet.Unicode)] internal static extern IntPtr GetModuleHandle(string lpModuleName); } } Код namespace AntiVM { using System; using System.Runtime.InteropServices; internal static class NativeMethods { [DllImport("kernel32.dll", BestFitMapping = false, CharSet = CharSet.Unicode)] internal static extern IntPtr GetModuleHandle(string lpModuleName); } } Теперь создаём класс CheckVirtual.cs который делает всю магию космоса namespace AntiVM { using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Management; using System.Windows.Forms; public static class CheckVirtual { /* Created r3xq1 */ /// <summary> /// <b>Метод для проверки на запуск в среде RDP</b> (Remote Desktop Protocol) /// </summary> public static bool IsRdpAvailable => SystemInformation.TerminalServerSession == true; /// <summary> /// <b>Метод для проверки запуска в песочнице.</b> /// <para>Если исполняемый файл будет запущен внутри Песочницы то возвращяем <b>true</b> иначе <b>false</b></para> /// </summary> /// <returns><b>true</b> или <b>false</b></returns> public static bool SandBoxies => Process.GetProcessesByName("SbieCtrl").Length > 0 && NativeMethods.GetModuleHandle("SbieDll.dll") != IntPtr.Zero; /// <summary> /// <b>Метод для проверки Vmware. Inc на машине пользователя.</b> /// <para>Проходится по списку <b>VirtualNames</b> и если находит совпадения то возвращает <b>true</b> иначе <b>false</b></para> /// </summary> /// <returns><b>true</b> или <b>false</b></returns> public static bool CheckWMI() { var VirtualNames = new List<string> { "virtual", "vmbox", "vmware", "virtualbox", "box", "thinapp", "VMXh", "innotek gmbh", "tpvcgateway", "tpautoconnsvc", "vbox", "kvm", "red hat" }; List<string> list = GetModelsAndManufactures(); foreach (string spisok in list) { return VirtualNames.Contains(spisok); // true } return false; } /// <summary> /// <b>Метод для получения информации о Производителе и Модели машины на системе пользователя.</b> /// </summary> /// <returns>Возвращает Модель и Производителя компьютера.</returns> private static List<string> GetModelsAndManufactures() { var ModMan = new List<string>(); try { using var searcher = new ManagementObjectSearcher(@"root\CIMV2", "SELECT * FROM Win32_ComputerSystem"); using var items = searcher.Get().OfType<ManagementObject>().Where(p => p != null).FirstOrDefault(); ModMan.Add(items["Manufacturer"]?.ToString().ToLower()); ModMan.Add(items["Model"]?.ToString().ToLower()); } catch { } return ModMan; } /// <summary> /// <b>Инициализатор проверки всех методов на наличие запуска в среде VMware</b> (Virtual Machine) /// </summary> /// <returns></returns> public static bool Inizialize() => SandBoxies || IsRdpAvailable || CheckWMI(); } } Код namespace AntiVM { using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Management; using System.Windows.Forms; public static class CheckVirtual { /* Created r3xq1 */ /// <summary> /// <b>Метод для проверки на запуск в среде RDP</b> (Remote Desktop Protocol) /// </summary> public static bool IsRdpAvailable => SystemInformation.TerminalServerSession == true; /// <summary> /// <b>Метод для проверки запуска в песочнице.</b> /// <para>Если исполняемый файл будет запущен внутри Песочницы то возвращяем <b>true</b> иначе <b>false</b></para> /// </summary> /// <returns><b>true</b> или <b>false</b></returns> public static bool SandBoxies => Process.GetProcessesByName("SbieCtrl").Length > 0 && NativeMethods.GetModuleHandle("SbieDll.dll") != IntPtr.Zero; /// <summary> /// <b>Метод для проверки Vmware. Inc на машине пользователя.</b> /// <para>Проходится по списку <b>VirtualNames</b> и если находит совпадения то возвращает <b>true</b> иначе <b>false</b></para> /// </summary> /// <returns><b>true</b> или <b>false</b></returns> public static bool CheckWMI() { var VirtualNames = new List<string> { "virtual", "vmbox", "vmware", "virtualbox", "box", "thinapp", "VMXh", "innotek gmbh", "tpvcgateway", "tpautoconnsvc", "vbox", "kvm", "red hat" }; List<string> list = GetModelsAndManufactures(); foreach (string spisok in list) { return VirtualNames.Contains(spisok); // true } return false; } /// <summary> /// <b>Метод для получения информации о Производителе и Модели машины на системе пользователя.</b> /// </summary> /// <returns>Возвращает Модель и Производителя компьютера.</returns> private static List<string> GetModelsAndManufactures() { var ModMan = new List<string>(); try { using var searcher = new ManagementObjectSearcher(@"root\CIMV2", "SELECT * FROM Win32_ComputerSystem"); using var items = searcher.Get().OfType<ManagementObject>().Where(p => p != null).FirstOrDefault(); ModMan.Add(items["Manufacturer"]?.ToString().ToLower()); ModMan.Add(items["Model"]?.ToString().ToLower()); } catch { } return ModMan; } /// <summary> /// <b>Инициализатор проверки всех методов на наличие запуска в среде VMware</b> (Virtual Machine) /// </summary> /// <returns></returns> public static bool Inizialize() => SandBoxies || IsRdpAvailable || CheckWMI(); } } Реализация проверки namespace AntiVM { using System; internal static class Program { [STAThread] public static void Main() { Console.Title = "Anti Virtual Machine - (VM)"; if (CheckVirtual.Inizialize()) { Console.WriteLine("Обнаружена виртуальная машина"); } else { Console.WriteLine("Вы работаете на рабочей машине."); } Console.Read(); } } } Код namespace AntiVM { using System; internal static class Program { [STAThread] public static void Main() { Console.Title = "Anti Virtual Machine - (VM)"; if (CheckVirtual.Inizialize()) { Console.WriteLine("Обнаружена виртуальная машина"); } else { Console.WriteLine("Вы работаете на рабочей машине."); } Console.Read(); } } } Проверялось на нескольких виртуалках, всё отработало как надо, тестируйте. Проект лежит на Гите.
r3xq1, ну и ладно, всего лишь дополнить проверку процессов, главное показать пример, как примерно определять VM (так сказать дать удочку, а не рыбу)