-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdetect_vm.go
More file actions
132 lines (116 loc) · 3.16 KB
/
detect_vm.go
File metadata and controls
132 lines (116 loc) · 3.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package main
import (
"log"
"os"
"strings"
)
func DetectVM() (bool, string) {
if IsKVM() {
return true, "kvm"
}
if IsXen() {
return true, "xen"
}
if IsHyperV() {
return true, "hyperv"
}
if IsVMware() {
return true, "vmware"
}
return false, ""
}
func IsKVM() bool {
dmiPaths := []string{
"/sys/class/dmi/id/product_name",
"/sys/class/dmi/id/sys_vendor",
"/sys/class/dmi/id/bios_vendor",
}
for _, path := range dmiPaths {
if data, err := os.ReadFile(path); err == nil {
content := strings.ToLower(string(data))
if strings.Contains(content, "qemu") || strings.Contains(content, "kvm") || strings.Contains(content, "bochs") {
log.Println("[VM][QEMU/KVM] DMI contains qemu/kvm/bochs")
return true
}
}
}
if data, err := os.ReadFile("/proc/cpuinfo"); err == nil {
content := strings.ToLower(string(data))
if strings.Contains(content, "hypervisor") && strings.Contains(content, "qemu") {
log.Println("[VM][QEMU/KVM] cpuinfo contains qemu")
return true
}
}
return false
}
func IsXen() bool {
if _, err := os.Stat("/proc/xen"); err == nil {
log.Println("[VM][Xen] /proc/xen exists")
return true
}
if data, err := os.ReadFile("/sys/hypervisor/type"); err == nil {
if strings.Contains(string(data), "xen") {
log.Println("[VM][Xen] /sys/hypervisor/type contains xen")
return true
}
}
// Check for Xen devices - must have at least one device
if entries, err := os.ReadDir("/sys/bus/xen/devices"); err == nil {
if len(entries) > 0 {
log.Println("[VM][Xen] /sys/bus/xen/devices not empty")
return true
}
}
return false
}
func IsHyperV() bool {
dmiPaths := []string{
"/sys/class/dmi/id/product_name",
"/sys/class/dmi/id/sys_vendor",
"/sys/class/dmi/id/board_vendor",
}
for _, path := range dmiPaths {
if data, err := os.ReadFile(path); err == nil {
content := strings.ToLower(string(data))
if strings.Contains(content, "microsoft corporation") || strings.Contains(content, "virtual machine") {
if strings.Contains(content, "microsoft") {
log.Println("[VM][Hyper-V] DMI contains Microsoft")
return true
}
}
}
}
if data, err := os.ReadFile("/proc/modules"); err == nil {
content := strings.ToLower(string(data))
if strings.Contains(content, "hv_vmbus") || strings.Contains(content, "hv_storvsc") || strings.Contains(content, "hyperv") {
log.Println("[VM][Hyper-V] /proc/modules contains Hyper-V modules")
return true
}
}
return false
}
func IsVMware() bool {
dmiPaths := []string{
"/sys/class/dmi/id/product_name",
"/sys/class/dmi/id/sys_vendor",
"/sys/class/dmi/id/bios_vendor",
"/sys/class/dmi/id/board_vendor",
}
for _, path := range dmiPaths {
if data, err := os.ReadFile(path); err == nil {
content := strings.ToLower(string(data))
if strings.Contains(content, "vmware") || strings.Contains(content, "vmw") {
log.Println("[VM][VMware] DMI contains vmware")
return true
}
}
}
if data, err := os.ReadFile("/proc/modules"); err == nil {
content := strings.ToLower(string(data))
if strings.Contains(content, "vmw_") || strings.Contains(content, "vmxnet") {
log.Println("[VM][VMware] VMware modules found")
return true
}
}
return false
}