/** * @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 }