use memflex::{ida_pat, peid_pat};// Pattern creation and parsing happens at compile time.let ida = ida_pat!("13 ? D1");let peid = peid_pat!("13 ?? D1");#[cfg(windows)]{let first = memflex::internal::find_pattern_in_module(ida,"ntdll.dll").unwrap().next();let last = memflex::internal::find_pattern_in_module(peid,"ntdll.dll").unwrap().last();}
Module searching
let module = memflex::internal::find_module_by_name("ntdll.dll");// module.size, module.base
Read/Write external memory
#[cfg(windows)]ifletOk(p) = memflex::external::open_process_by_id(666,false, memflex::types::win::PROCESS_ALL_ACCESS){let value = p.read::<u32>(0x7FFF)?;
p.write(0x7FFF,100_u32)?;}Ok::<_, memflex::MfError>(())
Macros for emulating C++ behavior
#[repr(C)]pubstructConcreteType{vmt: memflex::VmtPtr};
memflex::interface! {pubtraitIPlayerimplforConcreteType{// Notice missing `&self`, this is intentional and macro will implicitly add it.// Functions without `&self` in interface doesn't make much sense.
extern "C"fn get_health() -> i32 = #0; // 0 - Index of the virtual function.// *Returns old health*
extern "C"fn set_health(new: i32) -> i32 = #1; // 1 - Index of the virtual function.}traitFoo{
extern fn foo() = #0;
}traitParentVmt{fn f1() -> i32 = #0;
fn f2() -> i32 = #1;
}traitChildVmt{fn f3(a: i32) = #0;
fn f4(a: i32) = #1;
}}// Automatically wraps all structures in `#[repr(C)]`// Virtual functions with inheritence is not tested(probably doesnt work).
memflex::makestruct! {// Attributes works as expected
#[derive(Default)]structParent{// on fields as well// #[serde(skip)]
first: f32}// `pub` means that `parent` field will be `pub`// but Deref<Target = Parent> implementation will be generated regardless.structChild : pubParent{
second: i32}// Implements `Foo` interface on `Nested`structNestedimplFoo : Child{
third: bool}structParentWithVmtimplParentVmt{
vmt: usize,
t1: f32,
t2: bool}// By using `dyn ParentWithVmt`, child offsets all of their vfunc indices by the number of functions in `ParentWithVmt`,// should work with nested inheritance but hasn't been tested!// This macro assumes msvc virtual parenting behavior when for each child a separate vmt is generated.structChildInheritsParentVmtimplChildVmt(dyn ParentWithVmt) : pubParentWithVmt{
t3: u64,
t4: i8}}
memflex::global! {// Uses default ldr resolver on windowspubstaticMY_GLOBAL: i32 = "ntdll.dll"#0x1000;
}
memflex::function! {// Function with offset from the modulefnADDER(i32, i32) -> i32 = "function.exe"#0x2790;
// Function with signaturefnMIXER(f32, f32, f32) -> u32 = "function.exe"%"48 81 EC B8 00 00 00 F3";
}
memflex::bitstruct! {structSomeStruct : u8{// Bits: 0, 1, 2
first: 0..=2,
// Bits: 3, 4, 5, 6, 7
next: 3..=7,
}}// Null terminated stringsuse memflex::types::TStr;let zero_terminated:TStr = memflex::tstr!("Hello, World!");