2023-01-29 22:51:20 +09:00
|
|
|
/**
|
|
|
|
|
* @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"
|
|
|
|
|
|
|
|
|
|
/**
|
2023-02-02 19:41:32 +09:00
|
|
|
* @brief Initialize the VMM and Reversing Machine
|
2023-01-29 22:51:20 +09:00
|
|
|
*
|
|
|
|
|
* @return BOOLEAN
|
|
|
|
|
*/
|
|
|
|
|
BOOLEAN
|
2023-02-02 19:41:32 +09:00
|
|
|
LoaderInitVmmAndReversingMachine()
|
2023-01-29 22:51:20 +09:00
|
|
|
{
|
2023-03-22 17:45:52 +09:00
|
|
|
MESSAGE_TRACING_CALLBACKS MsgTracingCallbacks = {0};
|
|
|
|
|
VMM_CALLBACKS VmmCallbacks = {0};
|
2023-01-29 22:51:20 +09:00
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Allow to server IOCTL
|
|
|
|
|
//
|
2026-06-02 14:04:47 +02:00
|
|
|
g_VmmInitialized = TRUE;
|
2023-01-29 22:51:20 +09:00
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Fill the callbacks for the message tracer
|
|
|
|
|
//
|
2024-03-17 18:17:38 +09:00
|
|
|
MsgTracingCallbacks.VmxOperationCheck = VmFuncVmxGetCurrentExecutionMode;
|
2023-01-29 22:51:20 +09:00
|
|
|
// MsgTracingCallbacks.CheckImmediateMessageSending = KdCheckImmediateMessagingMechanism;
|
|
|
|
|
// MsgTracingCallbacks.SendImmediateMessage = KdLoggingResponsePacketToDebugger;
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Fill the callbacks for using hyperlog in VMM
|
|
|
|
|
//
|
|
|
|
|
VmmCallbacks.LogCallbackPrepareAndSendMessageToQueueWrapper = LogCallbackPrepareAndSendMessageToQueueWrapper;
|
2023-03-22 17:45:52 +09:00
|
|
|
VmmCallbacks.LogCallbackSendMessageToQueue = LogCallbackSendMessageToQueue;
|
|
|
|
|
VmmCallbacks.LogCallbackSendBuffer = LogCallbackSendBuffer;
|
2023-11-08 14:45:57 +09:00
|
|
|
VmmCallbacks.LogCallbackCheckIfBufferIsFull = LogCallbackCheckIfBufferIsFull;
|
2023-01-29 22:51:20 +09:00
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Fill the VMM callbacks
|
|
|
|
|
//
|
2023-02-02 19:41:32 +09:00
|
|
|
// VmmCallbacks.VmmCallbackTriggerEvents = DebuggerTriggerEvents;
|
2023-01-29 22:51:20 +09:00
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Initialize message tracer
|
|
|
|
|
//
|
2023-03-22 17:45:52 +09:00
|
|
|
if (LogInitialize(&MsgTracingCallbacks))
|
|
|
|
|
{
|
2023-01-29 22:51:20 +09:00
|
|
|
//
|
|
|
|
|
// Initialize Vmx
|
|
|
|
|
//
|
2023-03-22 17:45:52 +09:00
|
|
|
if (VmFuncInitVmm(&VmmCallbacks))
|
|
|
|
|
{
|
2023-01-29 22:51:20 +09:00
|
|
|
LogDebugInfo("HyperDbg's hypervisor loaded successfully");
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Initialize the debugger
|
|
|
|
|
//
|
2023-03-22 17:45:52 +09:00
|
|
|
if (CoreInitReversingMachine())
|
|
|
|
|
{
|
2023-02-02 19:41:32 +09:00
|
|
|
LogDebugInfo("HyperDbg's reversing machine loaded successfully");
|
2023-01-29 22:51:20 +09:00
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Set the variable so no one else can get a handle anymore
|
|
|
|
|
//
|
|
|
|
|
g_HandleInUse = TRUE;
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
2023-03-22 17:45:52 +09:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2023-01-29 22:51:20 +09:00
|
|
|
LogError("Err, HyperDbg's debugger was not loaded");
|
|
|
|
|
}
|
2023-03-22 17:45:52 +09:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2023-01-29 22:51:20 +09:00
|
|
|
LogError("Err, HyperDbg's hypervisor was not loaded");
|
|
|
|
|
}
|
2023-03-22 17:45:52 +09:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2023-01-29 22:51:20 +09:00
|
|
|
LogError("Err, HyperDbg's message tracing module was not loaded");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Not loaded
|
|
|
|
|
//
|
2026-06-02 14:04:47 +02:00
|
|
|
g_VmmInitialized = FALSE;
|
2023-01-29 22:51:20 +09:00
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Uninitialize the log tracer
|
|
|
|
|
*
|
|
|
|
|
* @return VOID
|
|
|
|
|
*/
|
2023-03-22 17:45:52 +09:00
|
|
|
VOID
|
2026-06-04 00:55:05 +02:00
|
|
|
LoaderUninitLogTracer()
|
2023-01-29 22:51:20 +09:00
|
|
|
{
|
|
|
|
|
LogDebugInfo("Unloading HyperDbg's debugger...\n");
|
|
|
|
|
|
|
|
|
|
#if !UseDbgPrintInsteadOfUsermodeMessageTracking
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
// Uinitialize log buffer
|
|
|
|
|
//
|
|
|
|
|
LogDebugInfo("Uninitializing logs\n");
|
|
|
|
|
LogUnInitialize();
|
|
|
|
|
#endif
|
|
|
|
|
}
|