mirror of
https://codeberg.org/smukx/Rust-for-Malware-Development
synced 2026-06-06 20:22:59 +00:00
28e7fac1d3
Rust-for-Malware-Development is an collection of proof of concepts with techniques and advanced evasion methods
345 lines
13 KiB
Rust
345 lines
13 KiB
Rust
/*
|
|
Anti-Virtualization / Full-System Emulation
|
|
For More Malware POC: https://github.com/Whitecat18/Rust-for-Malware-Development.git
|
|
Resources Used: https://github.com/LordNoteworthy/al-khaser
|
|
By @5mukx
|
|
*/
|
|
|
|
|
|
/*
|
|
|
|
Note:
|
|
[Dev Machine] -> Installed VM's Softwares and some development tools for malware testing.
|
|
I have comment out some code due to testing purpose. If you execute this code on development machines[Dev Machine] , ofcouse its gonna result out
|
|
{Machine Running in Vitrualmachine}. So to avoid testing, i have commented out some codes with // sus // tag.
|
|
|
|
If you are executing this on normal machines such as schools and office computers, means you can uncomment codes that was tagged with -> // sus //
|
|
|
|
[+] This is an All in one resource gathered together and coded..
|
|
If you want to exec even more fast 1.1 to 0.2 secs.
|
|
Reduce the content of the program or artifacts and keep up the main one for
|
|
*/
|
|
|
|
|
|
use std::process::Command;
|
|
use std::fs;
|
|
use raw_cpuid::CpuId;
|
|
|
|
macro_rules! okey {
|
|
($msg:expr) => {
|
|
|
|
println!("\n----[+]\\ {} //[+]----\n",format!($msg));
|
|
}
|
|
}
|
|
|
|
macro_rules! error {
|
|
($msg:expr) => {
|
|
println!("\n----[-]\\ {} //[-]----\n\n", format!($msg));
|
|
}
|
|
}
|
|
|
|
fn main(){
|
|
let vm_detect = check_vm();
|
|
if vm_detect{
|
|
error!("VM Detected. Malware Running in sandbox"); // bruh... ;(
|
|
}else{
|
|
okey!("Malware Runnung on main Machine"); // Yayy .. ;)
|
|
}
|
|
}
|
|
|
|
fn check_vm() -> bool{
|
|
|
|
//##=> Registry key value artifacts
|
|
|
|
let registry_keys_value_artifacts = vec![
|
|
// (r#"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion"#, "",""), // Example test case to see if this reg key attri wokrs ! Dont uncomment this !
|
|
(r#"HKLM\HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0"#, "Identifier", "VMWARE"),
|
|
(r#"HKLM\SOFTWARE\VMware, Inc.\VMware Tools"#, "", ""),
|
|
(r#"HKLM\HARDWARE\Description\System\SystemBiosVersion"#, "", "VMWARE"),
|
|
(r#"HKLM\HARDWARE\Description\System\SystemBiosVersion"#, "", "VBOX"),
|
|
(r#"HKLM\SOFTWARE\Oracle\VirtualBox Guest Additions"#, "", ""),
|
|
(r#"HKLM\HARDWARE\ACPI\DSDT\VBOX__"#, "", ""),
|
|
(r#"HKLM\HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0"#, "Identifier", "VBOX"),
|
|
(r#"HKLM\HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0"#, "Identifier", "QEMU"),
|
|
(r#"HKLM\HARDWARE\Description\System\SystemBiosVersion"#, "", "VBOX"),
|
|
(r#"HKLM\HARDWARE\Description\System\SystemBiosVersion"#, "", "QEMU"),
|
|
(r#"HKLM\HARDWARE\Description\System\VideoBiosVersion"#, "", "VIRTUALBOX"),
|
|
(r#"HKLM\HARDWARE\Description\System\SystemBiosDate"#, "", "06/23/99"),
|
|
(r#"HKLM\HARDWARE\DEVICEMAP\Scsi\Scsi Port 0\Scsi Bus 0\Target Id 0\Logical Unit Id 0"#, "Identifier", "VMWARE"),
|
|
(r#"HKLM\HARDWARE\DEVICEMAP\Scsi\Scsi Port 1\Scsi Bus 0\Target Id 0\Logical Unit Id 0"#, "Identifier", "VMWARE"),
|
|
(r#"HKLM\HARDWARE\DEVICEMAP\Scsi\Scsi Port 2\Scsi Bus 0\Target Id 0\Logical Unit Id 0"#, "Identifier", "VMWARE"),
|
|
(r#"HKLM\SYSTEM\ControlSet001\Control\SystemInformation"#, "SystemManufacturer", "VMWARE"),
|
|
(r#"HKLM\SYSTEM\ControlSet001\Control\SystemInformation"#, "SystemProductName", "VMWARE"),
|
|
];
|
|
|
|
let registry_keys_value_artifacts_value = registry_keys_value_artifacts.iter().any(|&(key, value_name, expected_value)| {
|
|
let key_exists = registry_key_exists(key);
|
|
let value_matches = registry_value_matches(key, value_name, expected_value);
|
|
key_exists && value_matches
|
|
});
|
|
|
|
//##==> Registry Keys artifacts
|
|
|
|
let registry_keys_artifacts = vec![
|
|
r#"HKEY_LOCAL_MACHINE\HARDWARE\ACPI\DSDT\VBOX__"#,
|
|
r#"HKEY_LOCAL_MACHINE\HARDWARE\ACPI\FADT\VBOX__"#,
|
|
r#"HKEY_LOCAL_MACHINE\HARDWARE\ACPI\RSDT\VBOX__"#,
|
|
r#"HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\VirtualBox Guest Additions"#,
|
|
r#"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\VBoxGuest"#,
|
|
r#"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\VBoxMouse"#,
|
|
r#"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\VBoxService"#,
|
|
r#"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\VBoxSF"#,
|
|
r#"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\VBoxVideo"#,
|
|
r#"HKEY_LOCAL_MACHINE\SOFTWARE\VMware, Inc.\VMware Tools"#,
|
|
r#"HKEY_LOCAL_MACHINE\SOFTWARE\Wine"#,
|
|
r#"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Virtual Machine\Guest\Parameters"#,
|
|
|
|
// // Main machines contains this reg key. So uncomment this !
|
|
// If you are exec it on developer machine means ofcourse the reg contains in it ..
|
|
|
|
// r#"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum"#, // sus //
|
|
// r#"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IDE"#, // sus //
|
|
// r#"HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\SCSI"#, // sus //
|
|
];
|
|
|
|
let registry_keys_artifacts_value = registry_keys_artifacts.iter().any(|&key| registry_key_exists(key));
|
|
|
|
//##==> Checking File System artifacts !
|
|
|
|
let file_system_artifacts = vec![
|
|
r#"C:\Windows\system32\drivers\VBoxMouse.sys"#,
|
|
r#"C:\Windows\system32\drivers\VBoxGuest.sys"#,
|
|
r#"C:\Windows\system32\drivers\VBoxSF.sys"#,
|
|
r#"C:\Windows\system32\drivers\VBoxVideo.sys"#,
|
|
r#"C:\Windows\system32\vboxdisp.dll"#,
|
|
r#"C:\Windows\system32\vboxhook.dll"#,
|
|
r#"C:\Windows\system32\vboxmrxnp.dll"#,
|
|
r#"C:\Windows\system32\vboxogl.dll"#,
|
|
r#"C:\Windows\system32\vboxoglarrayspu.dll"#,
|
|
r#"C:\Windows\system32\vboxoglcrutil.dll"#,
|
|
r#"C:\Windows\system32\vboxoglerrorspu.dll"#,
|
|
r#"C:\Windows\system32\vboxoglfeedbackspu.dll"#,
|
|
r#"C:\Windows\system32\vboxoglpackspu.dll"#,
|
|
r#"C:\Windows\system32\vboxoglpassthroughspu.dll"#,
|
|
r#"C:\Windows\system32\vboxservice.exe"#,
|
|
r#"C:\Windows\system32\vboxtray.exe"#,
|
|
r#"C:\Windows\system32\VBoxControl.exe"#,
|
|
r#"C:\Windows\system32\drivers\vmmouse.sys"#,
|
|
r#"C:\Windows\system32\drivers\vmhgfs.sys"#,
|
|
r#"C:\Windows\system32\drivers\vm3dmp.sys"#,
|
|
r#"C:\Windows\system32\drivers\vmhgfs.sys"#,
|
|
r#"C:\Windows\system32\drivers\vmmemctl.sys"#,
|
|
r#"C:\Windows\system32\drivers\vmmouse.sys"#,
|
|
r#"C:\Windows\system32\drivers\vmrawdsk.sys"#,
|
|
r#"C:\Windows\system32\drivers\vmusbmouse.sys"#,
|
|
|
|
// wtf is this -> VMCI.sys is the driver for the VMware Virtual Machine Communication Interface (VMCI).
|
|
// It's responsible for communication between the host operating system and a virtual machine,
|
|
// or between two or more virtual machines on the same host
|
|
|
|
// So if you are testing with your development machine (vmware installed). This file artifact will contains in the main machine so i commented out it !
|
|
// IF you did not installed vm's on you dev machine, then you can uncomment this !
|
|
|
|
// r#"C:\Windows\system32\drivers\vmci.sys"#, // sus //
|
|
];
|
|
|
|
let file_system_artifacts_value = file_system_artifacts.iter().any(|&path| file_artifacts(path));
|
|
|
|
//##=> Check running process !
|
|
|
|
// Fastest Approach ever 0.3 secs
|
|
|
|
let all_processes = get_running_processes();
|
|
let target_processes = vec![
|
|
"vboxservice.exe",
|
|
"vboxtray.exe",
|
|
"vmtoolsd.exe",
|
|
"vmwaretray.exe",
|
|
"vmwareuser.exe",
|
|
"VGAuthService.exe",
|
|
"vmacthlp.exe",
|
|
"vmsrvc.exe",
|
|
"vmusrvc.exe",
|
|
"prl_cc.exe",
|
|
"prl_tools.exe",
|
|
"xenservice.exe",
|
|
"qemu-ga.exe",
|
|
];
|
|
|
|
let target_process_value = target_processes.iter()
|
|
.any(|target_process| process_exists(&all_processes, target_process));
|
|
|
|
|
|
|
|
//##==> Check Mac Address...!
|
|
|
|
// let mac_address = get_mac_address();
|
|
|
|
let mac_address = match get_mac_address(){
|
|
Some(mac) => mac,
|
|
None => return false,
|
|
};
|
|
|
|
let vm_mac_addresses = vec![
|
|
vec![0x08, 0x00, 0x27], // VBOX
|
|
vec![0x00, 0x05, 0x69], // VMWARE
|
|
vec![0x00, 0x0C, 0x29], // VMWARE
|
|
vec![0x00, 0x1C, 0x14], // VMWARE
|
|
vec![0x00, 0x50, 0x56], // VMWARE
|
|
vec![0x00, 0x1C, 0x42], // Parallels
|
|
vec![0x00, 0x16, 0x3E], // Xen
|
|
vec![0x0A, 0x00, 0x27], // Hybrid Analysis
|
|
];
|
|
|
|
let mac_address_value = match find_matching_pattern(&mac_address, &vm_mac_addresses) {
|
|
Some(_) => true,
|
|
None => false,
|
|
};
|
|
|
|
//##==> Check CPU Instructions
|
|
|
|
let cpuid = CpuId::new();
|
|
|
|
let vm_presence = cpuid.get_feature_info().map_or(false, |info| {
|
|
info.has_hypervisor()
|
|
});
|
|
|
|
|
|
let vm_vendor = cpuid.get_vendor_info().map_or(false, |info| {
|
|
info.as_str().contains("KVMKVMKVM") || // KVM
|
|
info.as_str().contains("Microsoft Hv") || // Microsoft Hyper-V or Windows Virtual PC
|
|
info.as_str().contains("VMwareVMware") || // VMware
|
|
info.as_str().contains("XenVMMXenVMM") || // Xen
|
|
info.as_str().contains("prl hyperv") || // Parallels
|
|
info.as_str().contains("VBoxVBoxVBox") // VirtualBox
|
|
});
|
|
|
|
let cpu_vendor_value = vm_presence || vm_vendor;
|
|
|
|
//##=> WMI Quaries !! Soon ...!
|
|
|
|
registry_keys_value_artifacts_value ||
|
|
registry_keys_artifacts_value ||
|
|
file_system_artifacts_value ||
|
|
target_process_value ||
|
|
mac_address_value ||
|
|
cpu_vendor_value
|
|
|
|
|
|
}
|
|
|
|
fn registry_key_exists(key: &str) -> bool {
|
|
let output = Command::new("reg")
|
|
.args(&["query", &key])
|
|
.output()
|
|
.expect("Failed to execute reg query cmd");
|
|
|
|
output.status.success()
|
|
}
|
|
|
|
// Program to check registry keys with artifacts ..!
|
|
fn registry_value_matches(key: &str, value_name: &str, expected_value: &str) -> bool {
|
|
let output = Command::new("reg")
|
|
.args(&["query", &key, "/v", value_name])
|
|
.output()
|
|
.expect("Failed to execute reg query cmd");
|
|
|
|
if output.status.success() {
|
|
let stdout = String::from_utf8_lossy(&output.stdout);
|
|
stdout.contains(expected_value)
|
|
} else {
|
|
false
|
|
}
|
|
}
|
|
|
|
// Progran to check if file exists !
|
|
fn file_artifacts(path: &str)-> bool{
|
|
fs::metadata(path).is_ok()
|
|
}
|
|
|
|
// Programs to check for current running process !
|
|
|
|
fn get_running_processes() -> Vec<String>{
|
|
let output = Command::new("wmic")
|
|
.args(&["process","get","name"])
|
|
.output()
|
|
.expect("Failed to execute wmic cmd");
|
|
|
|
let output_str = String::from_utf8_lossy(&output.stdout);
|
|
|
|
let processes: Vec<String> = output_str
|
|
.lines()
|
|
.skip(1)
|
|
.map(|line| line.trim().to_lowercase())
|
|
.collect();
|
|
|
|
processes
|
|
}
|
|
|
|
fn process_exists(processes: &[String], target: &str) -> bool {
|
|
processes.iter().any(|process| process.contains(target))
|
|
}
|
|
|
|
// Function to find mac addresses
|
|
|
|
fn get_mac_address() -> Option<Vec<u8>> {
|
|
let output = Command::new("ipconfig")
|
|
.args(&["/all"])
|
|
.output()
|
|
.expect("Failed to Exec ipconfing");
|
|
|
|
let output_str = String::from_utf8_lossy(&output.stdout);
|
|
|
|
for line in output_str.lines() {
|
|
if line.contains("Physical Address") {
|
|
let parts: Vec<&str> = line.split_whitespace().collect();
|
|
if parts.len() >= 3 {
|
|
let mac_address_str = parts[2].replace("-", ":");
|
|
let mac_bytes: Vec<u8> = mac_address_str.split(":")
|
|
.map(|s| u8::from_str_radix(s, 16).unwrap_or_default())
|
|
.collect();
|
|
return Some(mac_bytes);
|
|
}
|
|
}
|
|
}
|
|
None
|
|
}
|
|
|
|
fn find_matching_pattern<'a>(mac_address: &'a Vec<u8>, patterns: &'a Vec<Vec<u8>>) -> Option<&'a Vec<u8>> {
|
|
for pattern in patterns {
|
|
if mac_address.starts_with(pattern) {
|
|
return Some(pattern);
|
|
}
|
|
}
|
|
None
|
|
}
|
|
|
|
|
|
// Programs to find thr presence of Specific CPU Instructions !
|
|
// There is an create that will take care of it !!
|
|
// fn check_cpu_instruction(eax_value: u32) -> bool {
|
|
// let eax_value_str = format!("{:#x}", eax_value);
|
|
// let output = Command::new("cpuid")
|
|
// .args(&["-l", &eax_value_str])
|
|
// .output()
|
|
// .expect("Failed to execute cpuid cmd");
|
|
|
|
// let output_str = String::from_utf8_lossy(&output.stdout);
|
|
// output_str.contains(&eax_value_str)
|
|
// }
|
|
|
|
// fn detect_vendor_string(vendor_string: &str) -> bool {
|
|
// let output = Command::new("cpuid")
|
|
// .args(&["-s", "0"])
|
|
// .output()
|
|
// .expect("Failed to execute cpuid cmd");
|
|
|
|
// let output_str = String::from_utf8_lossy(&output.stdout);
|
|
// output_str.contains(vendor_string)
|
|
// }
|
|
|
|
// Program to use WMI Quaries to retrieve sys info !
|
|
|
|
// System Firmware tables
|
|
// Get Syetem frimwares => soon !
|