pub const FILE_HEADERS: &[&str] = &[
"4D 5A", "7F 45 4C 46", "50 4B 03 04", "FF D8 FF", "89 50 4E 47", ];
pub const ENCRYPTION_APIS: &[&str] = &[
"CryptoAPI",
"OpenSSL",
"BCrypt",
"AES_encrypt",
"RC4_encrypt",
];
pub const RANSOMWARE_EXTENSIONS: &[&str] =
&[".encrypted", ".locked", ".crypted", ".crypt", ".WNCRY"];
pub const C2_PATTERNS: &[&str] = &[
"cmd.exe",
"powershell.exe",
"nc.exe",
"netcat",
"reverse_tcp",
];
pub const OBFUSCATION_PATTERNS: &[&str] = &[
"eval(",
"base64_decode(",
"chr(",
"fromCharCode",
"unescape(",
];
pub const PROCESS_INJECTION: &[&str] = &[
"VirtualAllocEx",
"WriteProcessMemory",
"CreateRemoteThread",
"NtCreateThreadEx",
"RtlCreateUserThread",
];
pub const PERSISTENCE_REGISTRY_KEYS: &[&str] = &[
"Software\\Microsoft\\Windows\\CurrentVersion\\Run",
"Software\\Microsoft\\Windows\\CurrentVersion\\RunOnce",
"Software\\Microsoft\\Windows\\CurrentVersion\\RunServices",
"Software\\Microsoft\\Windows\\CurrentVersion\\RunServicesOnce",
];
pub const SANDBOX_EVASION: &[&str] = &[
"GetTickCount",
"QueryPerformanceCounter",
"GetSystemTime",
"GetComputerNameA",
"GetProcessHeap",
];
pub fn generate_hex_pattern(pattern: &[u8], mask: &[bool]) -> String {
assert_eq!(
pattern.len(),
mask.len(),
"Pattern and mask must have the same length"
);
pattern
.iter()
.zip(mask.iter())
.map(|(byte, &is_fixed)| {
if is_fixed {
format!("{:02X}", byte)
} else {
"??".to_string()
}
})
.collect::<Vec<_>>()
.join(" ")
}
pub fn generate_base64_pattern(data: &[u8]) -> String {
use base64::{engine::general_purpose::STANDARD, Engine as _};
STANDARD.encode(data)
}
pub fn generate_sha256_pattern(data: &[u8]) -> String {
use sha2::{Digest, Sha256};
let mut hasher = Sha256::new();
hasher.update(data);
let result = hasher.finalize();
format!("{:x}", result)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_hex_pattern() {
let pattern = &[0x48, 0x45, 0x4C, 0x4C, 0x4F];
let mask = &[true, true, false, true, true];
let result = generate_hex_pattern(pattern, mask);
assert_eq!(result, "48 45 ?? 4C 4F");
}
#[test]
fn test_base64_pattern() {
let data = b"Hello World!";
let result = generate_base64_pattern(data);
assert_eq!(result, "SGVsbG8gV29ybGQh");
}
#[test]
fn test_sha256_pattern() {
let data = b"test data";
let result = generate_sha256_pattern(data);
assert_eq!(
result,
"916f0027a575074ce72a331777c3478d6513f786a591bd892da1a577bf2335f9"
);
}
}