x64.rs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /// The Module for the x86_64 CPU Information
  2. /// Contains Registers, Dead-Code Instructions and Co
  3. use rand;
  4. use std::cmp::PartialEq;
  5. // Register Struct
  6. #[derive(Clone)]
  7. pub struct Reg<'a>{
  8. pub register: Register,
  9. pub full: &'a str,
  10. pub extended: &'a str,
  11. pub word: &'a str,
  12. pub byte: &'a str
  13. }
  14. // All X64 Registers that are needed
  15. #[derive(Debug, PartialEq, Clone)]
  16. pub enum Register {
  17. RAX, RBX, RCX, RDX, RBP, RSP, RSI, RDI, R8, R9, R10, R11, R12, R13, R14, R15
  18. }
  19. /// Full Map of all registers
  20. const REGISTERS: [Reg; 16] = [
  21. Reg{ register: Register::RAX, full: "RAX", extended: "EAX", word: "AX", byte: "AL" },
  22. Reg{ register: Register::RBX, full: "RBX", extended: "EBX", word: "BX", byte: "BL" },
  23. Reg{ register: Register::RCX, full: "RCX", extended: "ECX", word: "CX", byte: "CL" },
  24. Reg{ register: Register::RDX, full: "RDX", extended: "EDX", word: "DX", byte: "DL" },
  25. Reg{ register: Register::RBP, full: "RBP", extended: "EBP", word: "BP", byte: "BPL" },
  26. Reg{ register: Register::RSP, full: "RSP", extended: "ESP", word: "SP", byte: "SPL" },
  27. Reg{ register: Register::RSI, full: "RSI", extended: "ESI", word: "SI", byte: "SIL" },
  28. Reg{ register: Register::RDI, full: "RDI", extended: "EDI", word: "DI", byte: "DIL" },
  29. Reg{ register: Register::R8, full: "R8", extended: "R8D", word: "R8W", byte: "R8B" },
  30. Reg{ register: Register::R9, full: "R9", extended: "R9D", word: "R9W", byte: "R9B" },
  31. Reg{ register: Register::R10, full: "R10", extended: "R10D", word: "R10W", byte: "R10B" },
  32. Reg{ register: Register::R11, full: "R11", extended: "R11D", word: "R11W", byte: "R11B" },
  33. Reg{ register: Register::R12, full: "R12", extended: "R12D", word: "R12W", byte: "R12B" },
  34. Reg{ register: Register::R13, full: "R13", extended: "R13D", word: "R13W", byte: "R13B" },
  35. Reg{ register: Register::R14, full: "R14", extended: "R14D", word: "R14W", byte: "R14B" },
  36. Reg{ register: Register::R15, full: "R15", extended: "R15D", word: "R15W", byte: "R15B" }
  37. ];
  38. /// Trade a Register Enum to Reg() -> Used to get more info
  39. pub fn get_register(register: Register) -> Reg<'static> {
  40. let out_register = REGISTERS[0].clone();
  41. for reg in REGISTERS.iter() {
  42. if register == reg.register {
  43. return reg.clone();
  44. }
  45. }
  46. return out_register;
  47. }
  48. /// Simply returns a random x64 register
  49. /// If the generated register is in the blacklist,
  50. /// return anotherone
  51. pub fn get_random_reg(blacklist: &Vec<Register>) -> Reg<'static> {
  52. // generate registers until the register is not in the blacklist
  53. loop {
  54. // Generate a random number as index
  55. let rnd_index = rand::random::<usize>() % REGISTERS.len();
  56. let register: Register = REGISTERS[rnd_index].register.clone();
  57. if !blacklist.contains(&register) {
  58. return get_register(register);
  59. }
  60. }
  61. }
  62. const DEAD_CODE_INSTRUCTIONS: [&str; 6] = [
  63. "NOP",
  64. "CLD",
  65. "XOR {R}, 0",
  66. "MOV {R}, {R}",
  67. "XCHG {R}, {R}",
  68. "FNOP"
  69. ];
  70. /// Generate an String of dead code
  71. pub fn generate_dead_code() -> String {
  72. let blacklist = vec![Register::RSP, Register::RBP];
  73. // Output String
  74. let mut dead_code = String::new();
  75. let mut num_instructios = rand::random::<usize>() % 40;
  76. num_instructios += 3;
  77. for _ in 3..num_instructios {
  78. let rnd = rand::random::<usize>() % DEAD_CODE_INSTRUCTIONS.len();
  79. let tmp_dead_code = DEAD_CODE_INSTRUCTIONS[rnd];
  80. let random_reg = get_random_reg(&blacklist);
  81. let tmp_dead_code = tmp_dead_code.replace("{R}", &random_reg.full);
  82. dead_code.push_str(&tmp_dead_code);
  83. dead_code.push('\n');
  84. }
  85. return dead_code;
  86. }