Inspired by: https://github.com/pseuxide/toy-arms

Example

```rust use ncheat::*; fn test() { unsafe { let process_name = "explorer.exe";

    // "explorer.exe" -> "Explorer.EXE"
    let module_name = "Explorer.EXE";

    let process_id = get_process_id_64(process_name).unwrap();

    println!("process_name: {process_name}");
    println!("process_id: {process_id}");
    let module_info = get_module_info_64(process_id, module_name).unwrap();

    println!("module_name: {module_name}");
    println!("module address: {:X}", module_info.modBaseAddr as isize,);
    println!("module size: {:X}", module_info.modBaseSize,);

    let test_data: [u8; 30] = [
        0x12, 0xAF, 0xBF, 0xC4, 0x51, 0x21, 0x98, 0x13, 0xFF, 0xBA, 0x12, 0xAF, 0xBF, 0xC4,
        0x51, 0x21, 0x98, 0x13, 0xFF, 0xBA, 0x12, 0xAF, 0xBF, 0xC4, 0x51, 0x21, 0x98, 0x13,
        0xFF, 0xBA,
    ];

    // ** or ??
    let test_offset = pattern_find("51 ?? ** 13 FF ??", &test_data).unwrap();

    println!("offset: {:#X}", test_offset);

    let offsets = pattern_scan("51 ** ?? 13 FF **", &test_data).unwrap();

    println!("offsets: {:?}", offsets);

    let explorer_pat = "48 89 5C 24 08 57 48 83 EC 30 B9 01";
    let process_handle = get_process_handle(process_id);
    let explorer_module_data = memory_read(
        process_handle,
        module_info.modBaseAddr as isize,
        module_info.modBaseSize as usize,
    )
    .unwrap();
    let explorer_offset = pattern_find(explorer_pat, &explorer_module_data).unwrap();
    println!("Explorer.EXE pat offset: {explorer_offset:X?}");
}

}

c processname: explorer.exe processid: 13844 module_name: Explorer.EXE module address: 7FF7C1810000 module size: 49D000 offset: 4 offsets: [4, 14, 24] Explorer.EXE pat offset: A0420 ```