BlackBone
Windows memory hacking library
 All Classes Functions
RemoteExec.h
1 #pragma once
2 
3 #include "../../Include/Winheaders.h"
4 #include "../../Asm/AsmHelper.h"
5 #include "../Threads/Threads.h"
6 #include "../MemBlock.h"
7 
8 
9 // User data offsets
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
15 
16 
17 namespace blackbone
18 {
19 
21 {
22  template<typename Fn>
23  friend class RemoteFuncBase;
24 
25  typedef std::vector<AsmVariant> vecArgs;
26 
27 public:
28  BLACKBONE_API RemoteExec( class Process& proc );
29  BLACKBONE_API ~RemoteExec();
30 
44  BLACKBONE_API NTSTATUS CreateRPCEnvironment( bool bThread = true, bool bEvent = true );
45 
53  BLACKBONE_API NTSTATUS ExecInNewThread( PVOID pCode, size_t size, uint64_t& callResult );
54 
62  BLACKBONE_API NTSTATUS ExecInWorkerThread( PVOID pCode, size_t size, uint64_t& callResult );
63 
72  BLACKBONE_API NTSTATUS ExecInAnyThread( PVOID pCode, size_t size, uint64_t& callResult, Thread& thread );
73 
80  BLACKBONE_API DWORD ExecDirect( ptr_t pCode, ptr_t arg );
81 
89  BLACKBONE_API void AddReturnWithEvent(
90  AsmHelperBase& a,
91  eModType mt = mt_default,
92  eReturnType retType = rt_int32,
93  uint32_t retOffset = RET_OFFSET
94  );
95 
100  BLACKBONE_API inline NTSTATUS GetLastStatus()
101  {
102  return _userData.Read<NTSTATUS>( ERR_OFFSET, STATUS_NOT_FOUND );
103  }
104 
108  BLACKBONE_API void TerminateWorker();
109 
114  BLACKBONE_API inline Thread* getWorker() { return &_hWorkThd; }
115 
120  BLACKBONE_API inline class ProcessMemory& memory() { return _memory; }
121 
125  BLACKBONE_API void reset();
126 
127 private:
128 
133  DWORD CreateWorkerThread();
134 
140  bool CreateAPCEvent( DWORD threadID );
141 
148  NTSTATUS CopyCode( PVOID pCode, size_t size );
149 
159  BLACKBONE_API bool PrepareCallAssembly( AsmHelperBase& a, const void* pfn,
160  std::vector<blackbone::AsmVariant>& args,
161  eCalligConvention cc, eReturnType retType );
162 
163 #pragma warning(disable : 4127)
164 
170  template<typename T>
171  inline bool GetCallResult( T& result )
172  {
173  if (sizeof(T) > sizeof(uint64_t))
174  {
175  if (std::is_reference<T>::value)
176  return _userData.Read( _userData.Read<size_t>( RET_OFFSET, 0 ), sizeof(T), (PVOID)&result ) == STATUS_SUCCESS;
177  else
178  return _userData.Read( ARGS_OFFSET, sizeof(T), (PVOID)&result ) == STATUS_SUCCESS;
179  }
180  else
181  return _userData.Read( RET_OFFSET, sizeof(T), (PVOID)&result ) == STATUS_SUCCESS;
182  }
183 #pragma warning(default : 4127)
184 
185  RemoteExec( const RemoteExec& ) = delete;
186  RemoteExec& operator =(const RemoteExec&) = delete;
187 
188 private:
189  // Process routines
190  class Process& _proc;
191  class ProcessModules& _mods;
192  class ProcessMemory& _memory;
193  class ProcessThreads& _threads;
194 
195  Thread _hWorkThd; // Worker thread handle
196  HANDLE _hWaitEvent; // APC sync event handle
197  MemBlock _workerCode; // Worker thread address space
198  MemBlock _userCode; // Codecave for code execution
199  MemBlock _userData; // Region to store copied structures and strings
200  bool _apcPatched; // KiUserApcDispatcher was patched
201 };
202 
203 
204 }
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
Definition: Process.h:43
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