4#ifndef RTL_CLONE_PROCESS_FLAGS_CREATE_SUSPENDED
5#define RTL_CLONE_PROCESS_FLAGS_CREATE_SUSPENDED 0x00000001
8#ifndef RTL_CLONE_PROCESS_FLAGS_INHERIT_HANDLES
9#define RTL_CLONE_PROCESS_FLAGS_INHERIT_HANDLES 0x00000002
12#ifndef RTL_CLONE_PROCESS_FLAGS_NO_SYNCHRONIZE
13#define RTL_CLONE_PROCESS_FLAGS_NO_SYNCHRONIZE 0x00000004
40 NTSTATUS (NTAPI *_RtlCreateProcessReflection) (
89 DWORD (__stdcall *_PssCaptureSnapshot)(
96 DWORD (__stdcall *_PssFreeSnapshot)(
101 DWORD (__stdcall *_PssQuerySnapshot)(
110 if (_PssCaptureSnapshot == NULL || _PssFreeSnapshot == NULL || _PssQuerySnapshot == NULL) {
111 HMODULE
lib = LoadLibraryA(
"kernel32.dll");
112 if (!
lib)
return false;
114 FARPROC proc1 = GetProcAddress(
lib,
"PssCaptureSnapshot");
115 if (!proc1)
return false;
117 FARPROC proc2 = GetProcAddress(
lib,
"PssFreeSnapshot");
118 if (!proc2)
return false;
120 FARPROC proc3 = GetProcAddress(
lib,
"PssQuerySnapshot");
121 if (!proc3)
return false;
123 _PssCaptureSnapshot = (
DWORD(__stdcall *)(
130 _PssFreeSnapshot = (
DWORD(__stdcall *)(
135 _PssQuerySnapshot = (
DWORD(__stdcall *)(
142 if (_PssCaptureSnapshot == NULL || _PssFreeSnapshot == NULL || _PssQuerySnapshot == NULL) {
150 if (_RtlCreateProcessReflection == NULL) {
151 HMODULE
lib = LoadLibraryA(
"ntdll.dll");
152 if (!
lib)
return false;
154 FARPROC proc = GetProcAddress(
lib,
"RtlCreateProcessReflection");
155 if (!proc)
return false;
157 _RtlCreateProcessReflection = (
NTSTATUS(NTAPI *) (
167 if (_RtlCreateProcessReflection == NULL)
return false;
191 args->
returned_pid =
static_cast<DWORD>(
reinterpret_cast<uintptr_t
>(
info.ReflectionClientId.UniqueProcess));
198 const DWORD max_wait = 1000;
206 HANDLE hThead = CreateThread(
214 const DWORD wait_result = WaitForSingleObject(hThead, max_wait);
215 if (wait_result == WAIT_TIMEOUT) {
217 std::cerr <<
"[!] [" << GetProcessId(orig_hndl) <<
"] Cannot create reflection: timeout passed!\n";
219 TerminateThread(hThead, 0);
229 std::cout <<
"Created reflection, PID = " << std::dec << args.
returned_pid <<
"\n";
242 const auto capture_flags =
250 HPSS snapShot = { 0 };
251 DWORD ret = _PssCaptureSnapshot(orig_hndl, capture_flags, 0, &snapShot);
252 if (ret != ERROR_SUCCESS) {
254 std::cout <<
"PssCaptureSnapshot failed: " << std::hex <<
" ret: " << ret <<
" err: " << ret <<
"\n";
263 if (!snapshot)
return false;
264 DWORD ret = _PssFreeSnapshot(GetCurrentProcess(), snapshot);
265 const BOOL is_ok = (ret == ERROR_SUCCESS) ?
true :
false;
267 std::cout <<
"Released process snapshot, res: " << std::hex << ret <<
"\n";
276 if (ret != ERROR_SUCCESS) {
279 HANDLE clone =
info.VaCloneHandle;
281 DWORD clone_pid = GetProcessId(clone);
282 std::cout <<
"Clone PID = " << std::dec << clone_pid <<
"\n";
292#ifdef USE_PROCESS_SNAPSHOT
297#ifdef USE_RTL_PROCESS_REFLECTION
311#ifdef USE_PROCESS_SNAPSHOT
322#ifdef USE_RTL_PROCESS_REFLECTION
352 std::cout <<
"Releasing Clone, PID = " << std::dec << clone_pid <<
"\n";
359 std::cout <<
"Released process reflection\n";
361 return is_ok ? true :
false;
ProcessRefl * make_process_reflection(HANDLE orig_hndl)
PSS_CAPTURE_FLAGS DWORD ThreadContextFlags
PSS_CAPTURE_FLAGS CaptureFlags
NTSTATUS(NTAPI *_RtlCreateProcessReflection)(HANDLE ProcessHandle
PSS_QUERY_INFORMATION_CLASS InformationClass
HANDLE make_process_reflection1(HANDLE orig_hndl)
ULONG PVOID PVOID HANDLE T_RTLP_PROCESS_REFLECTION_REFLECTION_INFORMATION * ReflectionInformation
DWORD WINAPI refl_creator(LPVOID lpParam)
HPSS make_process_snapshot(HANDLE orig_hndl)
ULONG PVOID PVOID HANDLE EventHandle
bool release_process_snapshot(HPSS snapshot)
bool can_make_process_reflection()
@ PSS_CAPTURE_HANDLE_NAME_INFORMATION
@ PSS_CREATE_USE_VM_ALLOCATIONS
@ PSS_CAPTURE_VA_SPACE_SECTION_INFORMATION
@ PSS_CAPTURE_THREAD_CONTEXT_EXTENDED
@ PSS_CAPTURE_RESERVED_00000400
@ PSS_CREATE_RELEASE_SECTION
@ PSS_CREATE_MEASURE_PERFORMANCE
@ PSS_CREATE_FORCE_BREAKAWAY
@ PSS_CREATE_BREAKAWAY_OPTIONAL
@ PSS_CAPTURE_HANDLE_TRACE
@ PSS_CAPTURE_THREAD_CONTEXT
@ PSS_CAPTURE_HANDLE_BASIC_INFORMATION
@ PSS_CAPTURE_RESERVED_00000002
@ PSS_CAPTURE_HANDLE_TYPE_SPECIFIC_INFORMATION
PSS_CAPTURE_FLAGS DWORD HPSS * SnapshotHandle
ULONG PVOID PVOID StartContext
PSS_QUERY_INFORMATION_CLASS void DWORD BufferLength
BOOL(CALLBACK *_MiniDumpWriteDump)(HANDLE hProcess
bool load_RtlCreateProcessReflection()
DWORD(__stdcall *_PssCaptureSnapshot)(HANDLE ProcessHandle
PSS_QUERY_INFORMATION_CLASS
@ PSS_QUERY_HANDLE_TRACE_INFORMATION
@ PSS_QUERY_PERFORMANCE_COUNTERS
@ PSS_QUERY_VA_SPACE_INFORMATION
@ PSS_QUERY_AUXILIARY_PAGES_INFORMATION
@ PSS_QUERY_PROCESS_INFORMATION
@ PSS_QUERY_THREAD_INFORMATION
@ PSS_QUERY_VA_CLONE_INFORMATION
@ PSS_QUERY_HANDLE_INFORMATION
PSS_QUERY_INFORMATION_CLASS void * Buffer
bool load_PssCaptureFreeSnapshot()
HANDLE make_process_reflection2(HPSS snapshot)
std::string info()
The string with the basic information about the scanner.
#define RTL_CLONE_PROCESS_FLAGS_INHERIT_HANDLES
bool releaseReflectedHndl()
T_CLIENT_ID ReflectionClientId
HANDLE ReflectionProcessHandle
HANDLE ReflectionThreadHandle