HyperDbg/examples/kernel/hyperdbg_driver/code/driver/Loader.c
2026-06-04 00:55:05 +02:00

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
}