thirtyfour-stealth 0.1.3

A stealthy, undetected implementation of thirtyfour for web automation
Documentation
use std::error::Error;

use rand::Rng;

pub fn patch_chromedriver(
    chromedriver_executable: &str,
) -> Result<(), Box<dyn Error + Send + Sync>> {
    tracing::info!("Starting ChromeDriver executable patch...");
    let file_name = if cfg!(windows) {
        "chromedriver.exe"
    } else {
        "chromedriver"
    };
    let f = std::fs::read(file_name)?;
    let mut new_chromedriver_bytes = f.clone();
    let mut total_cdc = String::from("");
    let mut cdc_pos_list = Vec::new();
    let mut is_cdc_present = false;
    let mut patch_ct = 0;
    for i in 0..f.len() - 3 {
        if "cdc_"
            == format!(
                "{}{}{}{}",
                f[i] as char,
                f[i + 1] as char,
                f[i + 2] as char,
                f[i + 3] as char
            )
            .as_str()
        {
            for &byte in &f[i + 4..i + 22] {
                total_cdc.push(byte as char);
            }
            is_cdc_present = true;
            cdc_pos_list.push(i);
            total_cdc = String::from("");
        }
    }
    if is_cdc_present {
        tracing::info!("Found cdcs");
    } else {
        tracing::warn!("No cdcs were found!");
    }
    let get_random_char = || -> char {
        "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
            .chars()
            .collect::<Vec<char>>()[rand::rng().random_range(0..48)]
    };

    for &i in &cdc_pos_list {
        for byte in &mut new_chromedriver_bytes[i + 4..i + 22] {
            *byte = get_random_char() as u8;
        }
        patch_ct += 1;
    }
    tracing::info!("Patched {} cdcs!", patch_ct);

    tracing::info!("Starting to write to binary file...");
    let _file = std::fs::File::create(chromedriver_executable)?;
    match std::fs::write(chromedriver_executable, new_chromedriver_bytes) {
        Ok(_res) => {
            tracing::info!("Successfully wrote patched executable to 'chromedriver_PATCHED'!",)
        }
        Err(err) => tracing::error!("Error when writing patch to file! Error: {}", err),
    };
    Ok(())
}