mirror of
https://github.com/HyperDbg/HyperDbg.git
synced 2026-07-09 17:19:26 +00:00
116 lines
2.8 KiB
C
116 lines
2.8 KiB
C
/**
|
|
* @file Loader.c
|
|
* @author Sina Karvandi (sina@hyperdbg.org)
|
|
* @brief The functions used in loading the VMM and RM
|
|
* @version 0.2
|
|
* @date 2023-01-29
|
|
*
|
|
* @copyright This project is released under the GNU Public License v3.
|
|
*
|
|
*/
|
|
#include "pch.h"
|
|
|
|
/**
|
|
* @brief Initialize the VMM and Reversing Machine
|
|
*
|
|
* @return BOOLEAN
|
|
*/
|
|
BOOLEAN
|
|
LoaderInitVmmAndReversingMachine()
|
|
{
|
|
MESSAGE_TRACING_CALLBACKS MsgTracingCallbacks = {0};
|
|
VMM_CALLBACKS VmmCallbacks = {0};
|
|
|
|
//
|
|
// Allow to server IOCTL
|
|
//
|
|
g_VmmInitialized = TRUE;
|
|
|
|
//
|
|
// Fill the callbacks for the message tracer
|
|
//
|
|
MsgTracingCallbacks.VmxOperationCheck = VmFuncVmxGetCurrentExecutionMode;
|
|
// MsgTracingCallbacks.CheckImmediateMessageSending = KdCheckImmediateMessagingMechanism;
|
|
// MsgTracingCallbacks.SendImmediateMessage = KdLoggingResponsePacketToDebugger;
|
|
|
|
//
|
|
// Fill the callbacks for using hyperlog in VMM
|
|
//
|
|
VmmCallbacks.LogCallbackPrepareAndSendMessageToQueueWrapper = LogCallbackPrepareAndSendMessageToQueueWrapper;
|
|
VmmCallbacks.LogCallbackSendMessageToQueue = LogCallbackSendMessageToQueue;
|
|
VmmCallbacks.LogCallbackSendBuffer = LogCallbackSendBuffer;
|
|
VmmCallbacks.LogCallbackCheckIfBufferIsFull = LogCallbackCheckIfBufferIsFull;
|
|
|
|
//
|
|
// Fill the VMM callbacks
|
|
//
|
|
// VmmCallbacks.VmmCallbackTriggerEvents = DebuggerTriggerEvents;
|
|
|
|
//
|
|
// Initialize message tracer
|
|
//
|
|
if (LogInitialize(&MsgTracingCallbacks))
|
|
{
|
|
//
|
|
// Initialize Vmx
|
|
//
|
|
if (VmFuncInitVmm(&VmmCallbacks))
|
|
{
|
|
LogDebugInfo("HyperDbg's hypervisor loaded successfully");
|
|
|
|
//
|
|
// Initialize the debugger
|
|
//
|
|
if (CoreInitReversingMachine())
|
|
{
|
|
LogDebugInfo("HyperDbg's reversing machine loaded successfully");
|
|
|
|
//
|
|
// Set the variable so no one else can get a handle anymore
|
|
//
|
|
g_HandleInUse = TRUE;
|
|
|
|
return TRUE;
|
|
}
|
|
else
|
|
{
|
|
LogError("Err, HyperDbg's debugger was not loaded");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
LogError("Err, HyperDbg's hypervisor was not loaded");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
LogError("Err, HyperDbg's message tracing module was not loaded");
|
|
}
|
|
|
|
//
|
|
// Not loaded
|
|
//
|
|
g_VmmInitialized = FALSE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/**
|
|
* @brief Uninitialize the log tracer
|
|
*
|
|
* @return VOID
|
|
*/
|
|
VOID
|
|
LoaderUninitLogTracer()
|
|
{
|
|
LogDebugInfo("Unloading HyperDbg's debugger...\n");
|
|
|
|
#if !UseDbgPrintInsteadOfUsermodeMessageTracking
|
|
|
|
//
|
|
// Uinitialize log buffer
|
|
//
|
|
LogDebugInfo("Uninitializing logs\n");
|
|
LogUnInitialize();
|
|
#endif
|
|
}
|