This project provides the underlying support for bypass av of offensive activities.
The available Shellcode loaders include:
- asm
- create_fiber
- create_process
- create_remote_thread
- create_remote_thread_native
- create_thread
- create_thread_native
- early_bird
- etwp_create_etw_thread
- memmap2_transmute
- module_stomping
- nt_queue_apc_thread_ex_local
- rtl_create_user_thread
This is a rust project, you need install rust first.
Then, you can build with follow command:
cargo build --releaseBinarys in target/release
This project is just a basic demo, you need to choose the right loading method, encrypt the SHELLCODE, download the SHELLCODE from the internet, or use it with ETW patch, unhooking, etc.
SHELLCODE execute locally.
- link SHELLCODE to .text section
- inline asm using asm! macro
- call SHELLCODE
SHELLCODE execute locally.
- convert current thread to fiber using
ConvertThreadToFiber - alloc memory using
VirtualAlloc - copy SHELLCODE to allocated memory using
std::ptr::copy - create a fiber using
CreateFiber - jump SHELLCODE using
SwitchToFiber - jump back
SHELLCODE execute locally.
- create a process in
CREATE_SUSPENDEDstate usingCreateProcessA - alloc remote memory using
VirtualAllocEx - copy SHELLCODE to allocated memory using
WriteProcessMemory - change memory permission to executable using
VirtualProtectEx - get
PROCESS_BASIC_INFORMATIONusingNtQueryInformationProcess - get
PEBusingReadProcessMemory - get
IMAGE_DOS_HEADERusingReadProcessMemory - get
IMAGE_FILE_HEADERusingReadProcessMemory - determine
IMAGE_FILE_HEADER.Machineis x86 or x64 - get
[IMAGE_OPTIONAL_HEADER32|IMAGE_OPTIONAL_HEADER64]usingReadProcessMemory - let
entrypoint=ImageBaseAddress+[IMAGE_OPTIONAL_HEADER32|IMAGE_OPTIONAL_HEADER64].AddressOfEntryPoint - write a piece of assembly code to the
entrypointto jump to the SHELLCODE usingWriteProcessMemory - resume process's thread using
ResumeThread - close opened handle using
CloseHandle
SHELLCODE execute remotely.
inject explorer.exe by default.
- get pid by process name using crate
sysinfo - get handle using
OpenProcess - alloc remote memory using
VirtualAllocEx - copy SHELLCODE to allocated memory using
WriteProcessMemory - change memory permission to executable using
VirtualProtectEx - execute SHELLCODE using
CreateRemoteThread - close opened handle using
CloseHandle
SHELLCODE execute remotely.
inject explorer.exe by default.
this is same with create_remote_thread, but without crate windows-sys
using crate libloading get functions from dlls.
SHELLCODE execute locally.
- alloc remote memory using
VirtualAlloc - copy SHELLCODE to allocated memory using
std::ptr::copy - change memory permission to executable using
VirtualProtect - execute SHELLCODE using
CreateThread - waiting thread exit using
WaitForSingleObject
SHELLCODE execute locally.
this is same with create_thread, but without crate windows-sys
using crate libloading get functions from dlls.
SHELLCODE execute remotely.
create and inject svchost.exe by default.
- create a process using
CreateProcessA - alloc remote memory using
VirtualAllocEx - copy SHELLCODE to allocated memory using
WriteProcessMemory - change memory permission to executable using
VirtualProtectEx - execute process using
QueueUserAPC - resume process's thread using
ResumeThread - close opened handle using
CloseHandle
SHELLCODE execute locally.
- get
EtwpCreateEtwThreadfuntion fromntdllusingLoadLibraryAandGetProcAddress - alloc remote memory using
VirtualAlloc - copy SHELLCODE to allocated memory using
std::ptr::copy - change memory permission to executable using
VirtualProtect - execute SHELLCODE using
EtwpCreateEtwThread - waiting thread exit using
WaitForSingleObject
SHELLCODE execute locally.
- alloc memory using crate
memmap2 - copy SHELLCODE using
copy_from_slicefunction fromMmapMutstruct - change memory permission to executable using
make_execfuntion fromMmapMutstruct - convert memory pointer to fn type using
transmute - execute fn
SHELLCODE execute remotely.
inject notepad.exe by default.
- get pid by process name using crate
sysinfo - get handle using
OpenProcess - alloc remote memory using
VirtualAllocEx - copy dll path to allocated memory using
WriteProcessMemory - get
LoadLibraryAaddr usingGetProcAddresswithGetModuleHandleA - load dll using
CreateRemoteThread - wait created remote thread using
WaitForSingleObject - get modules using
EnumProcessModules - get module name using
GetModuleBaseNameA - alloc memory using
HeapAlloc - get entry_point using
ReadProcessMemory - copy SHELLCODE to dll entry_point using
WriteProcessMemory - execute SHELLCODE using
CreateRemoteThread - close opened handle using
CloseHandle
SHELLCODE execute locally.
- get
NtQueueApcThreadExfunction fromntdllusingLoadLibraryAandGetProcAddress - alloc remote memory using
VirtualAlloc - copy SHELLCODE to allocated memory using
std::ptr::copy - change memory permission to executable using
VirtualProtect - get current thread handle using
GetCurrentThread - execute SHELLCODE using
NtQueueApcThreadEx
SHELLCODE execute remotely.
inject explorer.exe by default.
- get
RtlCreateUserThreadfuntion fromntdllusingLoadLibraryAandGetProcAddress - get pid by process name using crate
sysinfo - get handle using
OpenProcess - alloc remote memory using
VirtualAllocEx - copy SHELLCODE to allocated memory using
WriteProcessMemory - change memory permission to executable using
VirtualProtectEx - execute SHELLCODE using
RtlCreateUserThread - close opened handle using
CloseHandle