/// The Module for the x86_64 CPU Information /// Contains Registers, Dead-Code Instructions and Co use rand; use std::cmp::PartialEq; // Register Struct #[derive(Clone)] pub struct Reg<'a>{ pub register: Register, pub full: &'a str, pub extended: &'a str, pub word: &'a str, pub byte: &'a str } // All X64 Registers that are needed #[derive(Debug, PartialEq, Clone)] pub enum Register { RAX, RBX, RCX, RDX, RBP, RSP, RSI, RDI, R8, R9, R10, R11, R12, R13, R14, R15 } /// Full Map of all registers const REGISTERS: [Reg; 16] = [ Reg{ register: Register::RAX, full: "RAX", extended: "EAX", word: "AX", byte: "AL" }, Reg{ register: Register::RBX, full: "RBX", extended: "EBX", word: "BX", byte: "BL" }, Reg{ register: Register::RCX, full: "RCX", extended: "ECX", word: "CX", byte: "CL" }, Reg{ register: Register::RDX, full: "RDX", extended: "EDX", word: "DX", byte: "DL" }, Reg{ register: Register::RBP, full: "RBP", extended: "EBP", word: "BP", byte: "BPL" }, Reg{ register: Register::RSP, full: "RSP", extended: "ESP", word: "SP", byte: "SPL" }, Reg{ register: Register::RSI, full: "RSI", extended: "ESI", word: "SI", byte: "SIL" }, Reg{ register: Register::RDI, full: "RDI", extended: "EDI", word: "DI", byte: "DIL" }, Reg{ register: Register::R8, full: "R8", extended: "R8D", word: "R8W", byte: "R8B" }, Reg{ register: Register::R9, full: "R9", extended: "R9D", word: "R9W", byte: "R9B" }, Reg{ register: Register::R10, full: "R10", extended: "R10D", word: "R10W", byte: "R10B" }, Reg{ register: Register::R11, full: "R11", extended: "R11D", word: "R11W", byte: "R11B" }, Reg{ register: Register::R12, full: "R12", extended: "R12D", word: "R12W", byte: "R12B" }, Reg{ register: Register::R13, full: "R13", extended: "R13D", word: "R13W", byte: "R13B" }, Reg{ register: Register::R14, full: "R14", extended: "R14D", word: "R14W", byte: "R14B" }, Reg{ register: Register::R15, full: "R15", extended: "R15D", word: "R15W", byte: "R15B" } ]; /// Trade a Register Enum to Reg() -> Used to get more info pub fn get_register(register: Register) -> Reg<'static> { let out_register = REGISTERS[0].clone(); for reg in REGISTERS.iter() { if register == reg.register { return reg.clone(); } } return out_register; } /// Simply returns a random x64 register /// If the generated register is in the blacklist, /// return anotherone pub fn get_random_reg(blacklist: &Vec) -> Reg<'static> { // generate registers until the register is not in the blacklist loop { // Generate a random number as index let rnd_index = rand::random::() % REGISTERS.len(); let register: Register = REGISTERS[rnd_index].register.clone(); if !blacklist.contains(®ister) { return get_register(register); } } } const DEAD_CODE_INSTRUCTIONS: [&str; 6] = [ "NOP", "CLD", "XOR {R}, 0", "MOV {R}, {R}", "XCHG {R}, {R}", "FNOP" ]; /// Generate an String of dead code pub fn generate_dead_code() -> String { let blacklist = vec![Register::RSP, Register::RBP]; // Output String let mut dead_code = String::new(); let mut num_instructios = rand::random::() % 40; num_instructios += 3; for _ in 3..num_instructios { let rnd = rand::random::() % DEAD_CODE_INSTRUCTIONS.len(); let tmp_dead_code = DEAD_CODE_INSTRUCTIONS[rnd]; let random_reg = get_random_reg(&blacklist); let tmp_dead_code = tmp_dead_code.replace("{R}", &random_reg.full); dead_code.push_str(&tmp_dead_code); dead_code.push('\n'); } return dead_code; }