Может кому то понадобится метод получения NTSTATUS`a индирект сисколла из пула потоков (пул потоков служит для "очистки" стека). Сам долго думал над реализацией.
Пример работы с пулом потоков https://0xdarkvortex.dev/hiding-in-plainsight/
Пример работы с пулом потоков https://0xdarkvortex.dev/hiding-in-plainsight/
C:
PVOID pReturnAddress = NULL;
volatile LONG* pNtStatus = NULL;
HANDLE hEvent = NULL;
LONG CALLBACK VectorHandler(PEXCEPTION_POINTERS ExceptionInfo) {
static bool bpSet = false;
CONTEXT* ctx = ExceptionInfo->ContextRecord;
if (ExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_ILLEGAL_INSTRUCTION) {
if (!bpSet) {
ctx->Dr0 = (DWORD64)pReturnAddress;
ctx->Dr7 = 0x00000001;
ctx->Rip += 2;
bpSet = true;
}
return EXCEPTION_CONTINUE_EXECUTION;
} else if (ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP) {
*pNtStatus = (NTSTATUS)ctx->Rax;
ctx->Dr0 = 0;
ctx->Dr7 = 0;
SetEvent(hEvent);
return EXCEPTION_CONTINUE_EXECUTION;
}
return EXCEPTION_CONTINUE_SEARCH;
}
int wmain()
{
NTSTATUS NtStatus = 0;
pNtStatus = (volatile LONG*)VirtualAlloc(NULL, sizeof(LONG), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (pNtStatus == NULL) {
return 0;
}
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (hEvent == NULL) {
return 0;
}
pReturnAddress = GetSyscallAddress(0xdeadbeef);
AddVectoredExceptionHandler(1, VectorHandler);
//вызов syscall`a
...
NtStatus = *pNtStatus;
printf("NTSTATUS: 0x%X\n", NtStatus);
CloseHandle(hEvent);
VirtualFree((LPVOID)pNtStatus, 0, MEM_RELEASE);
return 0;
}
