Skip to content

Commit 07697d3

Browse files
authored
Merge pull request #407 from NotRequiem/dev
QEMU GPU passthrough detection
2 parents 1de2343 + 3b2548a commit 07697d3

4 files changed

Lines changed: 134 additions & 71 deletions

File tree

β€Žauxiliary/updater.pyβ€Ž

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141

4242

4343
def update_sections(filename):
44-
with open(filename, 'r') as vmaware_read:
44+
with open(filename, 'r', encoding='utf-8', errors='ignore') as vmaware_read:
4545
header_content = vmaware_read.readlines()
4646

4747
enum = "enum enum_flags"
@@ -112,7 +112,7 @@ def update_sections(filename):
112112
for i, new_line in enumerate(banner):
113113
header_content[section_line + i] = new_line + '\n'
114114

115-
with open(filename, 'w') as file:
115+
with open(filename, 'w', encoding='utf-8', errors='ignore') as file:
116116
file.writelines(header_content)
117117

118118

@@ -126,7 +126,7 @@ def update_date(filename):
126126
date_arg = arg
127127
break
128128

129-
with open(filename, 'r') as file:
129+
with open(filename, 'r', encoding='utf-8', errors='ignore') as file:
130130
header_content = file.readlines()
131131

132132
banner_line = " * β•šβ•β•β•β• β•šβ•β• β•šβ•β•β•šβ•β• β•šβ•β• β•šβ•β•β•β•šβ•β•β• β•šβ•β• β•šβ•β•β•šβ•β• β•šβ•β•β•šβ•β•β•β•β•β•β• "
@@ -143,7 +143,6 @@ def find_pattern(base_str):
143143
print(f"Version number not found for {red}{bold}{base_str}{ansi_exit}, aborting")
144144
sys.exit(1)
145145

146-
147146
header_version = find_pattern(header_content[index])
148147
arg_version = find_pattern(date_arg) if date_arg else header_version
149148
new_date = datetime.now().strftime("%B %Y")
@@ -157,13 +156,11 @@ def find_pattern(base_str):
157156

158157
header_content[index] = new_content + '\n'
159158

160-
with open(filename, 'w') as file:
159+
with open(filename, 'w', encoding='utf-8', errors='ignore') as file:
161160
file.writelines(header_content)
162161

163162

164-
165-
166-
with open(vmaware_file, 'r') as file:
163+
with open(vmaware_file, 'r', encoding='utf-8', errors='ignore') as file:
167164
file_content = file.readlines()
168165

169166

@@ -207,6 +204,7 @@ def __init__(self, enum_name="", line=0, platform_emojis="", score=0, descriptio
207204
self.notes = notes
208205
self.code_link = code_link
209206

207+
210208
class array_dict(dict):
211209
def __getitem__(self, key):
212210
return self.get(key)
@@ -218,6 +216,7 @@ def init_as_list(self, key):
218216

219217
technique = array_dict()
220218

219+
221220
def fetch_lib_info(enum_list):
222221
for enum in enum_list:
223222
technique.init_as_list(enum)
@@ -231,13 +230,11 @@ def fetch_lib_info(enum_list):
231230
technique[enum].line = i + 1
232231
break
233232

234-
235233
# generate the code implementation link
236234
link = "[link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L"
237235
for enum in enum_list:
238236
technique[enum].code_link = link + str(technique[enum].line) + ")"
239237

240-
241238
# fetch scores
242239
start = "// START OF TECHNIQUE TABLE"
243240
end = "// END OF TECHNIQUE TABLE"
@@ -253,7 +250,6 @@ def fetch_lib_info(enum_list):
253250
end_ptr = index
254251
break # Stop after first end marker
255252

256-
257253
if start_ptr == -1 or end_ptr == -1:
258254
print("Error: Start or end marker not found")
259255
else:
@@ -265,7 +261,6 @@ def fetch_lib_info(enum_list):
265261
if match:
266262
technique[enum].score = int(match.group(1))
267263

268-
269264
# fetch more stuff
270265
for enum in enum_list:
271266
start_line = end_line = technique[enum].line
@@ -322,7 +317,6 @@ def fetch_lib_info(enum_list):
322317
technique[enum].notes = line.split("@note", 1)[-1]
323318

324319

325-
326320
def update_docs(enum_list):
327321
technique_array = []
328322

@@ -340,7 +334,7 @@ def update_docs(enum_list):
340334

341335
technique_array.append("| " + " | ".join(str(item).strip() for item in order) + " |")
342336

343-
with open(vmaware_docs, 'r') as file:
337+
with open(vmaware_docs, 'r', encoding='utf-8', errors='ignore') as file:
344338
docs_content = file.readlines()
345339

346340
docs_start = "<!-- START OF TECHNIQUE DOCUMENTATION -->"
@@ -367,7 +361,7 @@ def update_docs(enum_list):
367361

368362
docs_content[start_ptr:end_ptr - 1] = [line + '\n' for line in technique_array]
369363

370-
with open(vmaware_docs, 'w', newline='\n') as f:
364+
with open(vmaware_docs, 'w', encoding='utf-8', errors='ignore', newline='\n') as f:
371365
f.writelines(docs_content)
372366

373367

β€Ždocs/documentation.mdβ€Ž

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -458,14 +458,14 @@ VMAware provides a convenient way to not only check for VMs, but also have the f
458458
| `VM::DMIDECODE` | Check if dmidecode output matches a VM brand | 🐧 | 55% | Admin | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L4423) |
459459
| `VM::DMESG` | Check if dmesg output matches a VM brand | 🐧 | 65% | Admin | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L4557) |
460460
| `VM::HWMON` | Check if /sys/class/hwmon/ directory is present. If not, likely a VM | 🐧 | 35% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L4594) |
461-
| `VM::DLL` | Check for VM-specific DLLs | πŸͺŸ | 25% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L6563) |
461+
| `VM::DLL` | Check for VM-specific DLLs | πŸͺŸ | 50% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L6563) |
462462
| `VM::REGISTRY_KEYS` | Check for VM-specific registry values | πŸͺŸ | 50% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L6594) |
463463
| `VM::HWMODEL` | Check if the sysctl for the hwmodel does not contain the "Mac" string | 🍏 | 100% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L6341) |
464464
| `VM::DISK_SIZE` | Check if disk size is under or equal to 50GB | 🐧πŸͺŸ | 60% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L5335) |
465465
| `VM::VBOX_DEFAULT` | Check for default RAM and DISK sizes set by VirtualBox | 🐧πŸͺŸ | 25% | Admin | | Admin only needed for Linux | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L5351) |
466466
| `VM::VBOX_NETWORK` | Check for VirtualBox network provider string | πŸͺŸ | 100% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L6704) |
467467
| `VM::WINE` | Check if the function "wine_get_unix_file_name" is present and if the OS booted from a VHD container | πŸͺŸ | 100% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L6734) |
468-
| `VM::POWER_CAPABILITIES` | Check what power states are enabled | πŸͺŸ | 50% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L6774) |
468+
| `VM::POWER_CAPABILITIES` | Check what power states are enabled | πŸͺŸ | 90% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L6774) |
469469
| `VM::PROCESSES` | Check for any VM processes that are active | 🐧 | 40% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L5310) |
470470
| `VM::LINUX_USER_HOST` | Check for default VM username and hostname for linux | 🐧 | 10% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L4604) |
471471
| `VM::GAMARUE` | Check for Gamarue ransomware technique which compares VM-specific Window product IDs | πŸͺŸ | 10% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L6815) |
@@ -476,10 +476,10 @@ VMAware provides a convenient way to not only check for VMs, but also have the f
476476
| `VM::MAC_SIP` | Check if System Integrity Protection is disabled (likely a VM if it is) | 🍏 | 40% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L6546) |
477477
| `VM::REGISTRY_VALUES` | Check HKLM registries for specific VM strings | πŸͺŸ | 50% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L6868) |
478478
| `VM::VPC_INVALID` | Check for official VPC method | πŸͺŸ | 75% | | 32-bit | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L6969) |
479-
| `VM::SIDT` | Check for uncommon IDT virtual addresses | 🐧πŸͺŸ | 45% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L5445) |
480-
| `VM::SGDT` | Check for sgdt instruction method | πŸͺŸ | 45% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L7025) |
481-
| `VM::SLDT` | Check for sldt instruction method | πŸͺŸ | 45% | | 32-bit | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L7088) |
482-
| `VM::SMSW` | Check for SMSW assembly instruction technique | πŸͺŸ | 45% | | 32-bit | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L7144) |
479+
| `VM::SIDT` | Check for uncommon IDT virtual addresses | 🐧πŸͺŸ | 50% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L5445) |
480+
| `VM::SGDT` | Check for sgdt instruction method | πŸͺŸ | 50% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L7025) |
481+
| `VM::SLDT` | Check for sldt instruction method | πŸͺŸ | 50% | | 32-bit | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L7088) |
482+
| `VM::SMSW` | Check for SMSW assembly instruction technique | πŸͺŸ | 50% | | 32-bit | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L7144) |
483483
| `VM::VMWARE_IOMEM` | Check for VMware string in /proc/iomem | 🐧 | 65% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L4633) |
484484
| `VM::VMWARE_IOPORTS` | Check for VMware string in /proc/ioports | 🐧 | 70% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L5143) |
485485
| `VM::VMWARE_SCSI` | Check for VMware string in /proc/scsi/scsi | 🐧 | 40% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L4942) |
@@ -495,7 +495,7 @@ VMAware provides a convenient way to not only check for VMs, but also have the f
495495
| `VM::CUCKOO_PIPE` | Check for Cuckoo specific piping mechanism | πŸͺŸ | 30% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L7324) |
496496
| `VM::HYPERV_HOSTNAME` | Check for default Azure hostname format (Azure uses Hyper-V as their base VM brand) | 🐧πŸͺŸ | 30% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L5544) |
497497
| `VM::GENERAL_HOSTNAME` | Check for commonly set hostnames by certain VM brands | 🐧πŸͺŸ | 10% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L5584) |
498-
| `VM::DISPLAY` | Check for display configurations related to VMs | πŸͺŸ | 20% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L7351) |
498+
| `VM::DISPLAY` | Check for display configurations related to VMs | πŸͺŸ | 35% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L7351) |
499499
| `VM::DEVICE_STRING` | Check if bogus device string would be accepted | πŸͺŸ | 25% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L7399) |
500500
| `VM::BLUESTACKS_FOLDERS` | Check for the presence of BlueStacks-specific folders | 🐧 | 5% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L4649) |
501501
| `VM::CPUID_SIGNATURE` | Check for signatures in leaf 0x40000001 in CPUID | 🐧πŸͺŸπŸ | 95% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L4132) |
@@ -527,10 +527,10 @@ VMAware provides a convenient way to not only check for VMs, but also have the f
527527
| `VM::FILE_ACCESS_HISTORY` | Check if the number of accessed files are too low for a human-managed environment | 🐧 | 15% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L5218) |
528528
| `VM::AUDIO` | Check if no waveform-audio output devices are present in the system | πŸͺŸ | 25% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L8039) |
529529
| `VM::NSJAIL_PID` | Check if process status matches with nsjail patterns with PID anomalies | 🐧 | 75% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L5245) |
530-
| `VM::TPM` | Check if the system has a physical TPM by matching the TPM manufacturer against known physical TPM chip vendors | πŸͺŸ | 50% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L8081) |
531-
| `VM::PCI_DEVICES` | Check for PCI vendor and device IDs that are VM-specific | 🐧πŸͺŸ | 95% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L5985) |
530+
| `VM::TPM` | Check if the system has a physical TPM by matching the TPM manufacturer against known physical TPM chip vendors | πŸͺŸ | 100% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L8081) |
531+
| `VM::PCI_DEVICES` | Check for PCI vendor and device IDs that are VM-specific | 🐧πŸͺŸ | 50% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L5985) |
532532
| `VM::QEMU_PASSTHROUGH` | Check for QEMU's hot-plug signature | πŸͺŸ | 90% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L8164) |
533-
| `VM::TRAP` | Check for two traps being raised at the same RIP, a hypervisor interferes with the instruction pointer delivery | πŸͺŸ | 50% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L8269) |
533+
| `VM::TRAP` | Check for two traps being raised at the same RIP, a hypervisor interferes with the instruction pointer delivery | πŸͺŸ | 100% | | | | [link](https://github.com/kernelwernel/VMAware/tree/main/src/vmaware.hpp#L8338) |
534534

535535
<!-- END OF TECHNIQUE DOCUMENTATION -->
536536

β€Žsrc/cli.cppβ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,7 @@ void general() {
796796
checker(VM::TPM, "TPM manufacturer");
797797
checker(VM::PCI_DEVICES, "PCI vendor/device ID");
798798
checker(VM::QEMU_PASSTHROUGH, "QEMU passthrough");
799-
checker(VM::TRAP, "trap behavior");
799+
checker(VM::TRAP, "hypervisor interception");
800800

801801
// ADD NEW TECHNIQUE CHECKER HERE
802802

0 commit comments

Comments
Β (0)