use std::error::Error;
use pelite::pattern::Atom;
use pelite::pe64::Pe;
use crate::program::Program;
const CODE_RESTORATION_PATTERN: &[Atom] =
pelite::pattern!("B9 ? ? ? ? E8 ? ? ? ? F3 0F 11 05 ? ? ? ? [0-128] ' 72 ? 48 8D ? ? ? ? ?");
pub fn get_arxan_code_restoration_rvas(program: &Program) -> Vec<u32> {
let mut result = Vec::new();
let mut matches = program.scanner().matches_code(CODE_RESTORATION_PATTERN);
let mut captures: [u32; 2] = [0; 2];
while matches.next(&mut captures) {
result.push(captures[1]);
}
result
}
pub unsafe fn disable_code_restoration_at(
program: &Program,
rva: u32,
) -> Result<(), Box<dyn Error>> {
let jb_ptr = program.rva_to_va(rva)? as *mut u8;
unsafe {
std::ptr::write(jb_ptr, 0xEB);
}
Ok(())
}
pub unsafe fn disable_code_restoration(program: &Program) -> Result<(), Box<dyn Error>> {
let rvas = get_arxan_code_restoration_rvas(program);
for rva in rvas {
unsafe {
disable_code_restoration_at(program, rva)?;
}
}
Ok(())
}