shellcode_loader/obf/
mod.rs

1use std::fs;
2
3mod ipv4;
4mod ipv6;
5mod mac;
6mod uuid;
7mod words;
8
9use ipv4::{obfuscate_ipv4, deobfuscate_ipv4};
10use ipv6::{obfuscate_ipv6, deobfuscate_ipv6};
11use mac::{obfuscate_mac, deobfuscate_mac};
12use uuid::{obfuscate_uuid, deobfuscate_uuid};
13use words::{obfuscate_words, deobfuscate_words};
14
15/// 读取二进制文件并进行混淆,返回混淆后的数据
16pub fn obfuscate_file(file_path: &str, technique: &str) -> Result<Vec<String>, Box<dyn std::error::Error>> {
17    // 获取当前可执行文件所在目录
18    let current_dir = std::env::current_dir()?;
19    let full_path = current_dir.join(file_path);
20    println!("Looking for file at: {:?}", full_path);
21    
22    let buffer = fs::read(&full_path)?;
23    println!("Successfully read file, size: {} bytes", buffer.len());
24    
25    let mut buffer_vec = buffer.to_vec();
26    
27    match technique {
28        "ipv4" => Ok(obfuscate_ipv4(&mut buffer_vec)),
29        "ipv6" => Ok(obfuscate_ipv6(&mut buffer_vec)),
30        "mac" => Ok(obfuscate_mac(&mut buffer_vec)),
31        "uuid" => Ok(obfuscate_uuid(&mut buffer_vec)),
32        "words" => Ok(obfuscate_words(&mut buffer_vec)),
33        _ => Err("Unsupported technique".into()),
34    }
35}
36
37/// 解混淆数据,返回字节数组
38pub fn deobfuscate_data(data: &[String], technique: &str) -> Result<Vec<u8>, Box<dyn std::error::Error>> {
39    let str_data: Vec<&str> = data.iter().map(|s| s.as_str()).collect();
40    
41    match technique {
42        "ipv4" => deobfuscate_ipv4(str_data),
43        "ipv6" => deobfuscate_ipv6(str_data),
44        "mac" => deobfuscate_mac(str_data),
45        "uuid" => deobfuscate_uuid(str_data),
46        "words" => deobfuscate_words(str_data),
47        _ => Err("Unsupported technique".into()),
48    }
49}