use std::path::Path;
use std::fs;
use regex::bytes::Regex;
use crate::error::{XcelerateResult, XcelerateError};
pub struct BinaryPatcher;
impl BinaryPatcher {
pub fn patch_binary(path: &Path) -> XcelerateResult<()> {
if !path.exists() {
return Err(XcelerateError::NotFound(format!("Binary not found for patching: {:?}", path)));
}
let mut content = fs::read(path).map_err(|e| XcelerateError::NotFound(format!("Failed to read binary: {}", e)))?;
let re = Regex::new(r"\{window\.cdc.*?;\}").map_err(|_| XcelerateError::InternalError)?;
let mut patched = false;
if let Some(m) = re.find(&content) {
let start = m.start();
let end = m.end();
let len = end - start;
let mut payload = b"{console.log(\"xcelerate stealth active!\")}".to_vec();
if payload.len() > len {
payload.truncate(len);
} else {
payload.extend(std::iter::repeat(b' ').take(len - payload.len()));
}
content[start..end].copy_from_slice(&payload);
patched = true;
}
if patched {
fs::write(path, content).map_err(|_e| XcelerateError::InternalError)?;
eprintln!("[PATCHER] Successfully patched binary: {:?}", path);
} else {
eprintln!("[PATCHER] No detection patterns found or already patched: {:?}", path);
}
Ok(())
}
}