r3xq1
Проверенный
Проверенный
r3xq1
Проверенный
Проверенный
- Сообщения
- 53
- Реакции
- 29
Создаём класс NativeMethods.cs
Записываем в него следующий код:
Теперь создаём класс CheckVirtual.cs который делает всю магию космоса
Реализация проверки
Проверялось на нескольких виртуалках, всё отработало как надо, тестируйте.
Записываем в него следующий код:
C#:
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);
}
}
C#:
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();
}
}
C#:
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();
}
}
}