PDA

Просмотр полной версии : определение виртуалок


16bit
13.02.2012, 04:02
предлагаю собрать тут различные методики для определения -
на какой системе ты находишься -виртуальная,реальная,впс, варя и тд.

snake
13.02.2012, 20:00
ls -la /boot
?
ps -ax |grep xen
ps -ax |grep vmwar

16bit
14.02.2012, 18:31
на что обратить внимание в /boot?
в процессах тоже ничего не видно (мне кажется,что и не должно быть)

C3 ~ RET
14.02.2012, 22:25
предлагаю собрать тут различные методики для определения -
на какой системе ты находишься -виртуальная,реальная,впс, варя и тд.

Консольки:
# Run Method for when run command is issued
def run
print_status("Gathering System info ....")
vm = nil
dmi_info = nil

if is_root?
dmi_info = cmd_exec("/usr/sbin/dmidecode")
end

# Check DMi Info
if dmi_info
case dmi_info
when /microsoft corporation/i
vm = "MS Hyper-V"
when /vmware/i
vm = "VMware"
when /virtualbox/i
vm = "VirtualBox"
when /qemu/i
vm = "Qemu/KVM"
when /domu/i
vm = "Xen"
end
end

# Check Modules
if not vm
loaded_modules = cmd_exec("/sbin/lsmod")
case loaded_modules.gsub("\n", " ")
when /vboxsf|vboxguest/i
vm = "VirtualBox"
when /vmw_ballon|vmxnet|vmw/i
vm = "VMware"
when /xen-vbd|xen-vnif/
vm = "Xen"
when /virtio_pci|virtio_net/
vm = "Qemu/KVM"
when /hv_vmbus|hv_blkvsc|hv_netvsc|hv_utils|hv_storvsc/
vm = "MS Hyper-V"
end
end

# Check SCSI Driver
if not vm
proc_scsi = read_file("/proc/scsi/scsi") rescue ""
case proc_scsi.gsub("\n", " ")
when /vmware/i
vm = "VMware"
when /vbox/
vm = "VirtualBox"
end
end

# Check IDE Devices
if not vm
case cmd_exec("cat /proc/ide/hd*/model")
when /vbox/i
vm = "VirtualBox"
when /vmware/i
vm = "VMware"
when /qemu/i
vm = "Qemu/KVM"
when /virtual (hd|cd)/i
vm = "Hyper-V/Virtual PC"
end
end

# Check using lspci
if not vm
case get_sysinfo[:distro]
when /oralce|centos|suse|redhat|mandrake|slackware|fedor a/
lspci_data = cmd_exec("/sbin/lspci")
when /debian|ubuntu/
lspci_data = cmd_exec("/usr/bin/lspci")
else
lspci_data = cmd_exec("lspci")
end

case lspci_data.gsub("\n", " ")
when /vmware/i
vm = "VMware"
when /virtualbox/i
vm = "VirtualBox"
end
end

# Xen bus check
if not vm
if cmd_exec("ls -1 /sys/bus").split("\n").include?("xen")
vm = "Xen"
end
end

# Check using lscpu
if not vm
case cmd_exec("lscpu")
when /Xen/
vm = "Xen"
when /KVM/
vm = "KVM"
when /Microsoft/
vm = "MS Hyper-V"
end
end

# Check dmesg Output
if not vm
dmesg = cmd_exec("dmesg")
case dmesg
when /vboxbios|vboxcput|vboxfacp|vboxxsdt|(vbox cd-rom)|(vbox harddisk)/i
vm = "VirtualBox"
when /(vmware virtual ide)|(vmware pvscsi)|(vmware virtual platform)/i
vm = "VMware"
when /(xen_mem)|(xen-vbd)/i
vm = "Xen"
when /(qemu virtual cpu version)/i
vm = "Qemu/KVM"
when %r{/dev/vmnet}
print_good("This appears to be a VMware %bldHost%clr")

Для себя наиболее полезной нашёл dmidecode, т.к. ничего не слышал о ней ранее.

Окошки:

# Method for detecting if it is a Hyper-V VM
def hypervchk(session)
begin
vm = false
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft', KEY_READ)
sfmsvals = key.enum_key
if sfmsvals.include?("Hyper-V")
vm = true
elsif sfmsvals.include?("VirtualMachine")
vm = true
end
key.close
rescue
end
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'SYSTEM\ControlSet001\Services', KEY_READ)
srvvals = key.enum_key
if srvvals.include?("vmicheartbeat")
vm = true
elsif srvvals.include?("vmicvss")
vm = true
elsif srvvals.include?("vmicshutdown")
vm = true
elsif srvvals.include?("vmicexchange")
vm = true
end
rescue
end
end
print_status("This is a Hyper-V Virtual Machine") if vm
return vm
end

# Method for checking if it is a VMware VM
def vmwarechk(session)
vm = false
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'SYSTEM\ControlSet001\Services', KEY_READ)
srvvals = key.enum_key
if srvvals.include?("vmdebug")
vm = true
elsif srvvals.include?("vmmouse")
vm = true
elsif srvvals.include?("VMTools")
vm = true
elsif srvvals.include?("VMMEMCTL")
vm = true
end
key.close
rescue
end
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0')
if key.query_value('Identifier').data.downcase =~ /vmware/
vm = true
end
rescue
end
key.close
end
if not vm
vmwareprocs = [
"vmwareuser.exe",
"vmwaretray.exe"
]
session.sys.process.get_processes().each do |x|
vmwareprocs.each do |p|
if p == (x['name'].downcase)
vm = true
end
end
end
end
print_status("This is a VMware Virtual Machine") if vm
return vm

end

# Method for checking if it is a Virtual PC VM
def checkvrtlpc(session)
vm = false
vpcprocs = [
"vmusrvc.exe",
"vmsrvc.exe"
]
session.sys.process.get_processes().each do |x|
vpcprocs.each do |p|
if p == (x['name'].downcase)
vm = true
end
end
end
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'SYSTEM\ControlSet001\Services', KEY_READ)
srvvals = key.enum_key

if srvvals.include?("vpc-s3")
vm = true
elsif srvvals.include?("vpcuhub")
vm = true
elsif srvvals.include?("msvmmouf")
vm = true
end
key.close
rescue
end
end
print_status("This is a VirtualPC Virtual Machine") if vm
return vm
end

# Method for checking if it is a VirtualBox VM
def vboxchk(session)
vm = false
vboxprocs = [
"vboxservice.exe",
"vboxtray.exe"
]
session.sys.process.get_processes().each do |x|
vboxprocs.each do |p|
if p == (x['name'].downcase)
vm = true
end
end
end
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'HARDWARE\ACPI\DSDT', KEY_READ)
srvvals = key.enum_key
if srvvals.include?("VBOX__")
vm = true
end
rescue
end
end
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'HARDWARE\ACPI\FADT', KEY_READ)
srvvals = key.enum_key
if srvvals.include?("VBOX__")
vm = true
end
rescue
end
end
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'HARDWARE\ACPI\RSDT', KEY_READ)
srvvals = key.enum_key
if srvvals.include?("VBOX__")
vm = true
end
rescue
end
end
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0')
if key.query_value('Identifier').data.downcase =~ /vbox/
vm = true
end
rescue
end
end
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'HARDWARE\DESCRIPTION\System')
if key.query_value('SystemBiosVersion').data.downcase =~ /vbox/
vm = true
end
rescue
end
end
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'SYSTEM\ControlSet001\Services', KEY_READ)
srvvals = key.enum_key
if srvvals.include?("VBoxMouse")
vm = true
elsif srvvals.include?("VBoxGuest")
vm = true
elsif srvvals.include?("VBoxService")
vm = true
elsif srvvals.include?("VBoxSF")
vm = true
end
key.close
rescue
end
end
print_status("This is a Sun VirtualBox Virtual Machine") if vm
return vm
end

# Method for checking if it is a Xen VM
def xenchk(session)
vm = false
xenprocs = [
"xenservice.exe"
]
session.sys.process.get_processes().each do |x|
xenprocs.each do |p|
if p == (x['name'].downcase)
vm = true
end
end
end
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'HARDWARE\ACPI\DSDT', KEY_READ)
srvvals = key.enum_key
if srvvals.include?("Xen")
vm = true
end
rescue
end
end
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'HARDWARE\ACPI\FADT', KEY_READ)
srvvals = key.enum_key
if srvvals.include?("Xen")
vm = true
end
rescue
end
end
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'HARDWARE\ACPI\RSDT', KEY_READ)
srvvals = key.enum_key
if srvvals.include?("Xen")
vm = true
end
rescue
end
end
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'SYSTEM\ControlSet001\Services', KEY_READ)
srvvals = key.enum_key
if srvvals.include?("xenevtchn")
vm = true
elsif srvvals.include?("xennet")
vm = true
elsif srvvals.include?("xennet6")
vm = true
elsif srvvals.include?("xensvc")
vm = true
elsif srvvals.include?("xenvdb")
vm = true
end
key.close
rescue
end
end
print_status("This is a Xen Virtual Machine") if vm
return vm
end

def qemuchk(session)
vm = false
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0')
if key.query_value('Identifier').data.downcase =~ /qemu/
print_status("This is a QEMU/KVM Virtual Machine")
vm = true
end
rescue
end
end
if not vm
begin
key = session.sys.registry.open_key(HKEY_LOCAL_MACHINE, 'HARDWARE\DESCRIPTION\System\CentralProcessor\0')
if key.query_value('ProcessorNameString').data.downca se =~ /qemu/
print_status("This is a QEMU/KVM Virtual Machine")
vm = true
end
rescue
end
end

return vm
end

# run Method
def run
print_status("Checking if #{sysinfo['Computer']} is a Virtual Machine .....")
found = hypervchk(session)
found = vmwarechk(session) if not found
found = checkvrtlpc(session) if not found
found = vboxchk(session) if not found
found = xenchk(session) if not found
found = qemuchk(session) if not found
print_status("It appears to be a physical host.") if not found
end
end


Всё труднее найти то, что ещё не придумано.

destiny
14.02.2012, 23:24
названия дисков (которые серийные номера) под виртуалками характерные, например. если хайдов нету (читай: если за виртуалкой сидит не реверсер, исследующий софт, который не хочет запускаться под виртуалкой), то есть вообще стандартные способы узнать. Например, под вмварькой можно что-то из какого-то порта прочитать.

16bit
14.02.2012, 23:27
варю я детектил так

dmesg |grep -i vmware
[ 3.324108] hda: VMware Virtual IDE CDROM Drive, ATAPI CD/DVD-ROM drive
[ 3.985253] scsi 0:0:0:0: Direct-Access VMware, VMware Virtual S 1.0 PQ: 0 ANSI: 2

yesday
15.02.2012, 01:00
MAC-адреса ещё характерные у Xen, KVM, OpenVZ.

Кроме того, названия дисков:
/dev/simfs -- OpenVZ, Virtuozzo
/dev/xvda* -- Xen

OpenVZ со 100% вероятностью можно сдетектить по наличию файла /proc/user_beancounters

yesday
15.02.2012, 01:20
MAC-адреса ещё характерные у Xen, KVM, OpenVZ.

Кроме того, названия дисков:
/dev/simfs -- OpenVZ, Virtuozzo
/dev/xvda* -- Xen

OpenVZ со 100% вероятностью можно сдетектить по наличию файла /proc/user_beancounters