HyperDbg/examples/kernel/hyperdbg_driver/code/driver/Loader.c

117 lines
2.8 KiB
C
Raw Permalink Normal View History

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
//
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;
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
//
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
}