#include "pch.h" #include "kDbgUtil.h" #include "detours.h" extern POBJECT_TYPE* DbgkDebugObjectType; extern PFAST_MUTEX g_pDbgkpProcessDebugPortMutex; extern PULONG g_pDbgkpMaxModuleMsgs; PEX_RUNDOWN_REF kDbgUtil::GetProcessRundownProtect(PEPROCESS Process) { return reinterpret_cast((char*)Process + _eprocessOffsets.RundownProtect); } PULONG kDbgUtil::GetProcessCrossThreadFlags(PEPROCESS Process) { return reinterpret_cast((char*)Process + _eprocessOffsets.CrossThreadFlags); } PPEB kDbgUtil::GetProcessPeb(PEPROCESS Process) { return *reinterpret_cast((char*)Process + _eprocessOffsets.Peb); } PDEBUG_OBJECT* kDbgUtil::GetProcessDebugPort(PEPROCESS Process) { return reinterpret_cast((char*)Process + _eprocessOffsets.DebugPort); } PVOID kDbgUtil::GetProcessWow64Process(PEPROCESS Process) { return reinterpret_cast((char*)Process + _eprocessOffsets.Wow64Process); } PULONG kDbgUtil::GetProcessFlags(PEPROCESS Process) { return reinterpret_cast((char*)Process + _eprocessOffsets.Flags); } VOID* kDbgUtil::GetProcessSectionBaseAddress(PEPROCESS Process) { return *reinterpret_cast((char*)Process + _eprocessOffsets.SectionBaseAddress); } VOID* kDbgUtil::GetProcessSectionObject(PEPROCESS Process) { return *reinterpret_cast((char*)Process + _eprocessOffsets.SectionObject); } VOID* kDbgUtil::GetProcessUniqueProcessId(PEPROCESS Process) { return *reinterpret_cast((char*)Process + _eprocessOffsets.UniqueProcessId); } PULONG kDbgUtil::GetThreadCrossThreadFlags(PETHREAD Ethread) { return reinterpret_cast((char*)Ethread + _ethreadOffsets.CrossThreadFlags); } PEX_RUNDOWN_REF kDbgUtil::GetThreadRundownProtect(PETHREAD Thread) { return reinterpret_cast((char*)Thread + _ethreadOffsets.RundownProtect); } PPEB_LDR_DATA kDbgUtil::GetPEBLdr(PPEB Peb) { return *reinterpret_cast((char*)Peb + _pebOffsets.Ldr); } bool kDbgUtil::HookDbgSys() { if (g_pNtCreateDebugObject) { NTSTATUS status = DetourAttach((PVOID*)&g_pNtCreateDebugObject, NtCreateDebugObject); if (!NT_SUCCESS(status)) return false; status = DetourTransactionCommit(); if (!NT_SUCCESS(status)) return false; } if (g_pNtDebugActiveProcess) { NTSTATUS status = DetourAttach((PVOID*)&g_pNtDebugActiveProcess, NtDebugActiveProcess); if (!NT_SUCCESS(status)) return false; status = DetourTransactionCommit(); if (!NT_SUCCESS(status)) return false; } return true; } bool kDbgUtil::UnhookDbgSys() { NTSTATUS status = DetourDetach((PVOID*)&g_pNtCreateDebugObject, NtCreateDebugObject); if (!NT_SUCCESS(status)) return false; status = DetourTransactionCommit(); if (!NT_SUCCESS(status)) return false; status = DetourDetach((PVOID*)&g_pNtDebugActiveProcess, NtDebugActiveProcess); if (!NT_SUCCESS(status)) return false; status = DetourTransactionCommit(); if (!NT_SUCCESS(status)) return false; return true; } bool kDbgUtil::InitDbgSys(DbgSysCoreInfo* info) { if (_first) { g_pNtCreateDebugObject = (PNtCreateDebugObject)info->NtCreateDebugObjectAddress; g_pZwProtectVirtualMemory = (PZwProtectVirtualMemory)info->ZwProtectVirtualMemory; DbgkDebugObjectType = (POBJECT_TYPE*)info->DbgkDebugObjectTypeAddress; g_pNtDebugActiveProcess = (PNtDebugActiveProcess)info->NtDebugActiveProcess; g_pDbgkpPostFakeProcessCreateMessages = (PDbgkpPostFakeProcessCreateMessages)info->DbgkpPostFakeProcessCreateMessages; g_pDbgkpSetProcessDebugObject = (PDbgkpSetProcessDebugObject)info->DbgkpSetProcessDebugObject; _eprocessOffsets.RundownProtect = info->EprocessOffsets.RundownProtect; g_pDbgkpPostFakeThreadMessages = (PDbgkpPostFakeThreadMessages)info->DbgkpPostFakeThreadMessages; g_pDbgkpPostModuleMessages = (PDbgkpPostModuleMessages)info->DbgkpPostModuleMessages; _ethreadOffsets.CrossThreadFlags = info->EthreadOffsets.CrossThreadFlags; _ethreadOffsets.RundownProtect = info->EthreadOffsets.RundownProtect; g_pPsGetNextProcessThread = (PPsGetNextProcessThread)info->PsGetNextProcessThread; _eprocessOffsets.DebugPort = info->EprocessOffsets.DebugPort; g_pDbgkpProcessDebugPortMutex = (PFAST_MUTEX)info->DbgkpProcessDebugPortMutex; g_pDbgkpMarkProcessPeb = (PDbgkpMarkProcessPeb)info->DbgkpMarkProcessPeb; g_pDbgkpWakeTarget = (PDbgkpWakeTarget)info->DbgkpWakeTarget; g_pDbgkpMaxModuleMsgs = (PULONG)info->DbgkpMaxModuleMsgs; _pebOffsets.Ldr = info->PebOffsets.Ldr; g_pMmGetFileNameForAddress = (PMmGetFileNameForAddress)info->MmGetFileNameForAddress; g_pDbgkpQueueMessage = (PDbgkpQueueMessage)info->DbgkpQueueMessage; g_pDbgkpSendApiMessage = (PDbgkpSendApiMessage)info->DbgkpSendApiMessage; #ifdef _WIN64 _eprocessOffsets.Wow64Process = info->EprocessOffsets.Wow64Process; #endif // _WIN64 _eprocessOffsets.Peb = info->EprocessOffsets.Peb; _first = false; } return HookDbgSys(); } bool kDbgUtil::ExitDbgSys() { return UnhookDbgSys(); }