3 #include "../../Include/Winheaders.h"
4 #include "../../Asm/AsmHelper.h"
5 #include "../Threads/Threads.h"
6 #include "../MemBlock.h"
10 #define INTRET_OFFSET 0x00
11 #define RET_OFFSET 0x08
12 #define ERR_OFFSET 0x10
13 #define EVENT_OFFSET 0x18
14 #define ARGS_OFFSET 0x20
25 typedef std::vector<AsmVariant> vecArgs;
29 BLACKBONE_API ~RemoteExec();
53 BLACKBONE_API NTSTATUS
ExecInNewThread( PVOID pCode,
size_t size, uint64_t& callResult );
62 BLACKBONE_API NTSTATUS
ExecInWorkerThread( PVOID pCode,
size_t size, uint64_t& callResult );
72 BLACKBONE_API NTSTATUS
ExecInAnyThread( PVOID pCode,
size_t size, uint64_t& callResult,
Thread& thread );
80 BLACKBONE_API DWORD
ExecDirect( ptr_t pCode, ptr_t arg );
91 eModType mt = mt_default,
92 eReturnType retType = rt_int32,
93 uint32_t retOffset = RET_OFFSET
102 return _userData.
Read<NTSTATUS>( ERR_OFFSET, STATUS_NOT_FOUND );
125 BLACKBONE_API
void reset();
133 DWORD CreateWorkerThread();
140 bool CreateAPCEvent( DWORD threadID );
148 NTSTATUS CopyCode( PVOID pCode,
size_t size );
159 BLACKBONE_API
bool PrepareCallAssembly(
AsmHelperBase& a,
const void* pfn,
160 std::vector<blackbone::AsmVariant>& args,
161 eCalligConvention cc, eReturnType retType );
163 #pragma warning(disable : 4127)
171 inline bool GetCallResult( T& result )
173 if (
sizeof(T) >
sizeof(uint64_t))
175 if (std::is_reference<T>::value)
176 return _userData.
Read( _userData.
Read<
size_t>( RET_OFFSET, 0 ),
sizeof(T), (PVOID)&result ) == STATUS_SUCCESS;
178 return _userData.
Read( ARGS_OFFSET,
sizeof(T), (PVOID)&result ) == STATUS_SUCCESS;
181 return _userData.
Read( RET_OFFSET,
sizeof(T), (PVOID)&result ) == STATUS_SUCCESS;
183 #pragma warning(default : 4127)
185 RemoteExec(
const RemoteExec& ) =
delete;
186 RemoteExec& operator =(
const RemoteExec&) =
delete;
190 class Process& _proc;
191 class ProcessModules& _mods;
192 class ProcessMemory& _memory;
193 class ProcessThreads& _threads;
197 MemBlock _workerCode;
BLACKBONE_API Thread * getWorker()
Get worker thread
Definition: RemoteExec.h:114
BLACKBONE_API NTSTATUS ExecInAnyThread(PVOID pCode, size_t size, uint64_t &callResult, Thread &thread)
Execute code in context of any existing thread
Definition: RemoteExec.cpp:154
Definition: RemoteExec.h:20
BLACKBONE_API void TerminateWorker()
Terminate existing worker thread
Definition: RemoteExec.cpp:572
BLACKBONE_API NTSTATUS ExecInWorkerThread(PVOID pCode, size_t size, uint64_t &callResult)
Execute code in context of our worker thread
Definition: RemoteExec.cpp:92
Definition: ProcessMemory.h:13
Base class for remote function pointer
Definition: RemoteFunction.hpp:16
BLACKBONE_API NTSTATUS CreateRPCEnvironment(bool bThread=true, bool bEvent=true)
Create environment for future remote procedure calls
Definition: RemoteExec.cpp:270
BLACKBONE_API NTSTATUS GetLastStatus()
Retrieve last NTSTATUS code
Definition: RemoteExec.h:100
BLACKBONE_API NTSTATUS Read(size_t offset, size_t size, PVOID pResult, bool handleHoles=false)
Read data
Definition: MemBlock.cpp:178
BLACKBONE_API void reset()
Reset instance
Definition: RemoteExec.cpp:594
BLACKBONE_API void AddReturnWithEvent(AsmHelperBase &a, eModType mt=mt_default, eReturnType retType=rt_int32, uint32_t retOffset=RET_OFFSET)
Generate return from function with event synchronization
Definition: RemoteExec.cpp:552
BLACKBONE_API class ProcessMemory & memory()
Ge memory routines
Definition: RemoteExec.h:120
BLACKBONE_API DWORD ExecDirect(ptr_t pCode, ptr_t arg)
Create new thread with specified entry point and argument
Definition: RemoteExec.cpp:249
Assembly generation helper
Definition: AsmHelperBase.h:48
Thread management
Definition: Thread.h:44
BLACKBONE_API NTSTATUS ExecInNewThread(PVOID pCode, size_t size, uint64_t &callResult)
Create new thread and execute code in it. Wait until execution ends
Definition: RemoteExec.cpp:34
Definition: AsmHelper32.cpp:6