Terralyp/UnrealDbg-VT-engine
GitHub: Terralyp/UnrealDbg-VT-engine
基于Intel VT虚拟化技术的内核级调试系统,用于绕过游戏驱动反调试机制并实现底层驱动调试。
Stars: 4 | Forks: 1
# UnrealDbg 项目详细介绍
该项目是一个基于 VT (Intel Virtualization Technology) 构建的调试系统,旨在绕过游戏驱动的反调试机制。其用户界面采用 Delphi 开发,提供直观便捷的操作体验;而核心代码则使用 C++ 编写,利用 VT 的强大能力实现对游戏驱动的调试。
在游戏外挂开发过程中,游戏驱动内部的反调试机制往往给调试工作带来巨大挑战。传统调试工具常常无法绕过这些机制,导致调试困难。本项目通过利用 VT 技术,建立了一个独立的调试框架,能够规避游戏驱动的反调试机制,为开发者和安全测试人员提供了一种有效的调试解决方案。
打破反调试机制:利用 VT 技术绕过游戏驱动的反调试机制,从而能够调试游戏驱动。
自建调试系统:构建了一套不依赖传统调试工具的独立调试系统,增强了调试的灵活性和可靠性。
直观的用户界面:使用 Delphi 开发的用户界面提供了直观便捷的操作体验,方便用户进行调试操作。
C++ 核心代码:采用 C++ 编写的核心代码充分利用了 VT 技术的强大功能,提供高效稳定的调试功能。
## 一、项目概述
UnrealDbg 是一个自建的调试系统项目,旨在绕过游戏驱动的反调试机制。该项目采用 Delphi 和 C++ 混合编程开发,支持 Windows 10 和 Windows 11 操作系统。利用 VT (Intel Virtualization Technology),本项目构建了一套完整的调试解决方案,包含密钥注册、加密、调试、加载和 Hook 等多个功能模块。
## 二、项目结构与各模块详细分析
(1) UnrealDbg 主项目
该文件夹是项目的核心目录,包含与基于 VT 技术的自建调试系统相关的主要代码和资源。它是使用 Delphi 开发的。以下是对各模块的详细分析。
- **项目文件**:
- `UnrealDbg.dpr`:Delphi 项目的主程序文件,作为应用程序的入口点。
- `UnrealDbg.dproj`:Delphi 项目的配置文件,包含编译选项、依赖项等信息。
- `UnrealDbg.dproj.local`:本地项目配置文件,存储开发者特定的设置。
- `UnrealDbg.res`:Delphi 资源文件,包含图标、菜单和其他资源信息。
使用 Delphi 开发。各模块详细分析如下。
- **子文件夹**:
- **Forms**:存储 Delphi 窗体文件,定义用户界面布局和交互逻辑。例如,`Main.dfm` 和 `Main.pas` 可能定义了调试工具的主界面。
- **Globals**:包含定义全局变量的文件,例如 `GlobalVar.pas`,用于在整个项目中共享数据。
- **Network**:包含与网络操作相关的功能。例如,`KeyVerification.pas` 可能通过网络安全地处理卡密验证。
- **ExternalCall**:存放用于与外部 DLL 交互的代码。例如 `D_encryptionDll.pas` 和 `UnrealDbgDll.pas`,它们调用加密 DLL 和调试核心 DLL 中的函数。
- **LogSystem**:负责日志记录,例如 `Log.pas` 可能实现日志写入和管理功能。
- **Handler**:可能包含各种事件处理程序,用于处理用户操作和系统事件。
- **Common**:包含项目中多个子项目共享的代码、头文件、工具类等。
- **KernelApi**:涉及内核级 API 调用,用于与操作系统内核交互。
- **Threads**:包含多线程相关代码,以实现并发操作,提高程序性能和响应速度。
- **res**:存储资源文件,如图标和图像。
(2) CardRegistration 模块
实现卡密注册功能,提供用于输入和验证卡密的用户界面。
- **核心文件**:
- `卡密注册.dpr`:Delphi 项目主可执行文件,包含程序入口点。
- `卡密注册.dproj`:Delphi 项目配置文件,包含编译选项、依赖项等信息。
- `CardKeyRegistration.dproj.local`:本地项目配置文件,包含开发者特定的设置。
- `CardKeyRegistration.res`:Delphi 资源文件,包含图标、菜单和其他资源信息。
- **功能实现**:与服务器交互以验证用户输入的卡密,确保只有授权用户才能使用该调试工具。
### (3) D - 加密模块
与加密功能相关,用于对数据进行加密以确保其安全性。
- **核心文件**:
- `D_encryption.dpr`:Delphi 项目主程序文件,包含程序入口点。
- `D_encryption.dproj`:Delphi 项目配置文件,包含编译选项、依赖项等信息。
- `D_encryption.dproj.local`:本地项目配置文件,包含开发者特定的设置。
- `D_encryption.res`:Delphi 资源文件,包含图标、菜单和其他资源信息。
- **加密算法**:可能利用 Blowfish 等加密算法对敏感数据(例如卡密、调试信息)进行加密。
### (4) DbgkSysWin10 和 DbgkSysWin11 模块
这些调试相关模块专为 Windows 10 和 Windows 11 系统设计,提供了一套用于调试操作的接口和功能实现。它们有助于绕过游戏驱动的反调试机制。
- **核心文件**:
- `DbgkApi.h` 和 `DbgkApi.cpp`:定义并实现调试相关的 API 函数,例如 `NtCreateDebugObject` 和 `NtDebugActiveProcess`,用于创建调试对象和激活调试进程。
- `Driver.h` 和 `Driver.cpp`:核心驱动文件。`DriverEntry` 负责处理驱动初始化,而 `Unload` 负责管理资源清理。
- `Globals.h` 和 `Globals.cpp`:定义和管理全局变量。
- `Memory` 文件夹:包含内存读写代码,用于读取游戏进程内存数据等操作。
- `Asm` 文件夹:存放汇编代码文件,用于高性能或底层操作,例如修改 CPU 寄存器值。
- `Hooks` 文件夹:具体是 `EptHook` 子文件夹,用于实现 Hook 功能,以拦截系统或目标进程中的特定操作,例如函数调用或系统调用。
- `Init` 文件夹:包含初始化相关代码,例如符号解析和初始化,确保调试工具能正确识别和处理系统符号。
- `Encrypt` 文件夹:特别是 `Blowfish` 子文件夹,可能用于实现加密功能,以安全传输调试数据。
- `Log` 文件夹:包含日志相关代码,用于记录调试过程中的信息,帮助开发人员进行故障排查。
- `List` 文件夹:包含链表实现代码,用于管理调试对象、进程信息及类似数据结构。
- `Hvm` 文件夹:存放虚拟机相关代码,用于与虚拟机交互。它利用 VT 技术创建虚拟环境,以绕过游戏驱动的反调试机制。
(5) Loader 模块
推测用于加载其他模块、驱动程序或程序——例如加载游戏驱动、调试模块或其他必要组件——以启用调试功能。它可能通过调用 Windows API 函数(如 `LoadLibrary`)来加载 DLL 文件。
(6) Hook 模块
实现 Hook 技术以拦截系统或目标进程中的特定操作,例如函数调用或系统调用。在这些操作之前和之后插入自定义代码,以绕过游戏驱动的反调试机制。潜在的实现方法包括 EPT Hook 和函数 Hook。
- **核心文件**:
- `dllmain.h`:定义 Hook 相关的函数和变量,例如用于设置 Hook 的 `SetupHook` 和用于卸载 Hook 的 `UnHook`。
- `detours.h`:包含 Detours 库的定义,这是一个用于函数拦截和替换的库,用于实现 Hook 功能。
(7) VT_Driver 模块
VT_Driver 项目概述
VT_Driver 是一个基于 Intel VT (Virtualization Technology) 的驱动项目,旨在利用虚拟化技术创建虚拟机环境。这使其能够绕过游戏驱动的反调试机制,从而方便对游戏驱动进行调试。该项目使用 C++ 编写,与操作系统内核密切交互,实现了一系列复杂功能,包括虚拟机管理、内存虚拟化、Hook 技术和调试事件处理。
绕过反调试机制:VT_Driver 模块利用 Intel VT (Virtualization Technology) 创建虚拟机环境,使其能够绕过游戏驱动的反调试机制。这使得开发人员在调试过程中能更方便地分析和修改游戏驱动,识别诸如性能瓶颈和逻辑错误等问题。
多系统调试适配:DbgkSysWin11 和 DbgkSysWin10 模块专为 Windows 11 和 Windows 10 系统开发,确保在不同操作系统版本上实现有效的调试功能。
### 项目文件结构分析
- **核心文件**:
- `Driver.cpp`:驱动的入口点文件,包含 `DriverEntry` 和 `Unload` 函数,负责驱动初始化和卸载操作。
- `EPT.cpp`:实现扩展页表 (EPT) 功能,例如 EPT Hook 和内存映射管理,实现内存虚拟化和 Hook 技术。
- `vmexit_handler.cpp`:处理虚拟机退出事件,根据退出原因执行相应操作,例如中断注入和指令修改。
- `vmcall_handler.cpp`:处理 `VMCall` 指令,根据 `VMCall` 原因执行相应功能,例如 EPT Hook 操作和断点设置。
- **头文件**:
- `Driver.h`:定义驱动常量、函数原型和数据结构,例如 `IOCTL` 代码和日志宏。
- `vmexit_handler.h`:定义虚拟机退出原因的枚举类型、VM 退出指令信息的联合体以及处理函数的原型。
- `vmcall_reason.h`:定义 `VMCall` 原因枚举类型,用于区分不同的 `VMCall` 功能。
### 关键代码分析
#### 1. `DriverEntry` 函数 (`Driver.cpp`)
```
EXTERN_C
NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath)
{
UNREFERENCED_PARAMETER(DriverObject);
UNREFERENCED_PARAMETER(RegistryPath);
DriverObject->DriverUnload = Unload;
KdPrint(("DriverEntry!!!\n"));
NTSTATUS nStatus = STATUS_SUCCESS;
if (InitNtoskrnlSymbolsTable())
{
if (!hv::virtualization_support()) {
outDebug("VMX operation is not supported on this processor.\n");
return STATUS_UNSUCCESSFUL;
}
hv::InitGlobalVariables();
if (vmm_init() == false)
{
hv::disable_vmx_operation();
free_vmm_context();
outDebug("Vmm initialization failed");
return STATUS_UNSUCCESSFUL;
}
outDebug("�������سɹ�!!!\n");
}
else
{
nStatus = STATUS_UNSUCCESSFUL;
outDebug("��������ʧ��!!!\n");
}
return nStatus;
}
```
- **功能**:驱动的入口点,负责初始化驱动并启动虚拟机监视器 (VMM)。
- **详细步骤**:
1. 设置驱动的卸载函数为 `Unload`。
2. 调用 `InitNtoskrnlSymbolsTable` 函数初始化 Ntoskrnl 符号表。
3. 检查处理器是否支持 VT 技术。如果不支持,输出错误信息并返回失败状态。
4. 初始化全局变量并调用 `vmm_init` 函数启动 VMM。
5. 如果 VMM 初始化失败,终止 VT 操作,释放相关资源,输出错误信息并返回失败状态。
6. 如果所有操作成功,输出成功信息并返回成功状态。
#### 2. `vmexit_handler` 函数(`vmexit_handler.cpp`)
```
EXTERN_C
bool vmexit_handler(guest_context* guest_registers, PFXSAVE64 fxsave)
{
__vcpu* vcpu = reinterpret_cast<__vcpu*>(_readfsbase_u64());
guest_registers->rsp = hv::vmread(GUEST_RSP);
vcpu->vmexit_info.reason = hv::vmread(VM_EXIT_REASON) & 0xffff;
vcpu->vmexit_info.qualification = hv::vmread(EXIT_QUALIFICATION);
vcpu->vmexit_info.guest_rflags.all = hv::vmread(GUEST_RFLAGS);
vcpu->vmexit_info.guest_rip = hv::vmread(GUEST_RIP);
vcpu->vmexit_info.instruction_length = hv::vmread(VM_EXIT_INSTRUCTION_LENGTH);
vcpu->vmexit_info.instruction_information = hv::vmread(VM_EXIT_INSTRUCTION_INFORMATION);
vcpu->vmexit_info.guest_registers = guest_registers;
vcpu->vmexit_info.fxsave = fxsave;
vcpu->hide_vm_exit_overhead = false;
dispatch_vm_exit(vcpu);
if (vcpu->vmx_off_state.vmx_off_executed == true)
{
vcpu->vcpu_status.vmm_launched = false;
RestoreGuest();
return true;
}
return false;
}
```
- **功能**:处理虚拟机退出事件,并根据退出原因执行相应操作。
- **详细步骤**:
1. 通过 `_readfsbase_u64` 函数获取当前 VCPU 指针。
2. 从 VMCS 中读取相关信息,例如 `GUEST_RSP` 和 `VM_EXIT_REASON`,并将其存储在 `vcpu->vmexit_info` 结构中。
3. 调用 `dispatch_vm_exit` 函数根据退出原因分发处理。
4. 如果检测到执行了 `VMXOFF` 操作,将 VMM 启动状态设置为 `false`,恢复 Guest 状态,并返回 `true` 以指示应停止处理。
5. 否则,返回 `false` 以继续处理。
#### 3. `vmexit_vmcall_handler` 函数 (`vmcall_handler.cpp`)
```
void vmexit_vmcall_handler(__vcpu* vcpu)
{
bool status = true;
unsigned __int64 vmcall_reason = 0;
unsigned __int64 vmcall_parameter1 = 0;
// ... Other parameter definitions
if ((vcpu->vmexit_info.guest_registers->rax != VMCALL_IDENTIFIER) &&
(vcpu->vmexit_info.guest_registers->eax != VMCALL_IDENTIFIER2))
{
if (ept::handler_vmcall_rip(*vcpu->ept_state))
{
return;
}
hv::inject_interruption(EXCEPTION_VECTOR_UNDEFINED_OPCODE, INTERRUPT_TYPE_HARDWARE_EXCEPTION, 0, false);
return;
}
if (vcpu->vmexit_info.guest_registers->eax == VMCALL_IDENTIFIER2)
{
vmcall_reason = vcpu->vmexit_info.guest_registers->ecx;
vmcall_parameter1 = vcpu->vmexit_info.guest_registers->edx;
}
else
{
vmcall_reason = vcpu->vmexit_info.guest_registers->rcx;
vmcall_parameter1 = vcpu->vmexit_info.guest_registers->rdx;
//
}
switch (vmcall_reason)
{
case VMCALL_TEST:
adjust_rip(vcpu);
break;
case VMCALL_VMXOFF:
call_vmxoff(vcpu);
adjust_rip(vcpu);
break;
//
}
vcpu->vmexit_info.guest_registers->rax = status;
}
```
- **功能**:处理 `VMCall` 指令,并根据具体的 `VMCall` 原因执行相应操作。
- **详细步骤**:
1. 检查 `VMCall` 是否属于此驱动。如果不属于,尝试处理 `VMCall RIP` Hook。如果不成功,注入未定义操作码异常。
2. 根据其标识符(`VMCALL_IDENTIFIER` 或 `VMCALL_IDENTIFIER2`)检索 `VMCall` 原因和参数。
3. 使用 `switch` 语句处理不同的 `VMCall` 原因:例如,对于 `VMCALL_TEST` 调整指令指针,或者对于 `VMCALL_VMXOFF` 调用 `call_vmxoff` 函数退出 VMX 模式。
4. 将处理结果存储在 `vcpu->vmexit_info.guest_registers->rax` 中。
### 项目功能总结
- **虚拟机管理**:通过 `DriverEntry` 函数初始化并启动 VMM,利用 `vmexit_handler` 函数处理虚拟机退出事件,实现对虚拟机的有效管理。
- **内存虚拟化**:`EPT.cpp` 文件实现了 EPT 相关功能。通过 EPT Hook 技术,可以拦截和处理内存访问,实现内存虚拟化。
- **调试能力**:`VMCall` 机制提供了广泛的调试功能,例如设置断点、隐藏软件断点和读取 EPT 伪造页面内存,方便对游戏驱动进行调试。
- **异常处理**:`vmexit_handler` 和 `vmcall_handler` 函数处理异常情况,包括未定义操作码注入异常和一般保护错误,确保系统稳定性。
### 项目优势与应用场景
- **优势**:利用 Intel VT 技术,有效绕过游戏驱动中的反调试机制,提供强大的调试能力,提高调试效率和成功率。
- **应用场景**:主要用于游戏开发和调试,帮助开发人员快速识别和解决游戏驱动中的问题。同时也适用于系统安全研究和软件调试领域。
### (8) UnrealDbgDll 模块
一个动态链接库 (DLL) 项目,实现与自定义调试系统相关的核心。它封装了调试相关特性以便于其他模块调用,通过模块交互促进整个调试系统的协调运行,并支持跨平台。
- **核心文件**:
- `dllmain.cpp`:DLL 的入口点文件,实现 `DllMain` 函数以处理 DLL 的加载和卸载事件。
- `InitSymbol` 函数:通过 `GetProcAddress` 函数获取系统函数地址来初始化符号表。
- `DispatchSymbol` 函数:将符号表数据发送给驱动程序,以便正确处理调试信息。
- `Initialize` 函数:负责初始化调试工具,包括加载符号表和发送调试数据。
三、代码功能分析
(1) 调试状态枚举
```
enum _DBG_STATE
{
DbgIdle = 0, // Debugger idle state
DbgReplyPending = 1,
DbgCreateThreadStateChange = 2,
DbgCreateProcessStateChange = 3,
DbgExitThreadStateChange = 4,
DbgExitProcessStateChange = 5,
DbgExceptionStateChange = 6,
DbgBreakpointStateChange = 7,
DbgSingleStepStateChange = 8,
DbgLoadDllStateChange = 9,
DbgUnloadDllStateChange = 10,
};
```
此枚举定义了调试器的各种状态,用于跟踪调试过程中的状态变化。
(2) 调试消息结构状态的变化
```
typedef struct _DBGKM_APIMSG {
PORT_MESSAGE h;
DBGKM_APINUMBER ApiNumber;
NTSTATUS ReturnedStatus;
union {
DBGKM_EXCEPTION Exception;
DBGKM_CREATE_THREAD CreateThread;
DBGKM_CREATE_PROCESS CreateProcess;
DBGKM_EXIT_THREAD ExitThread;
DBGKM_EXIT_PROCESS ExitProcess;
DBGKM_LOAD_DLL LoadDll;
DBGKM_UNLOAD_DLL UnloadDll;
DBGKM_ERROR_MSG ErrorMsg;
} u;
} DBGKM_APIMSG, * PDBGKM_APIMSG;
```
此结构定义了调试消息的格式,包含消息头、API ID、返回状态和特定消息内容。联合体允许存储不同类型的调试消息。
(3) 调试事件结构
```
typedef struct _DEBUG_EVENT
{
LIST_ENTRY EventList;
KEVENT ContinueEvent;
CLIENT_ID ClientId;
_EPROCESS* Process;
_ETHREAD* Thread;
NTSTATUS Status;
ULONG Flags;
_ETHREAD* BackoutThread;
DBGKM_APIMSG ApiMsg;
} DEBUG_EVENT, * PDEBUG_EVENT;
```
此结构定义了调试事件的格式,包含事件列表、延续事件、客户端 ID、进程和线程信息、状态码、标志和调试消息。它用于记录和处理调试过程中的事件。
## 四、项目优势
- **跨系统支持**:兼容 Windows 10 和 Windows 11 操作系统,确保广泛的兼容性。
- **混合编程**:采用 Delphi 和 C++ 混合编程方法,发挥两种语言的优势——Delphi 用于快速用户界面开发,C++ 用于实现底层调试功能和内核驱动。
- **安全可靠**:通过许可证密钥注册和加密技术确保调试工具的安全性和合法性,防止未经授权的使用和数据泄露。
- **功能强大**:提供广泛的调试功能,包括进程调试、线程调试、DLL 加载/卸载调试和断点调试,满足多样化的调试需求。
## 五、应用场景
- **游戏开发**:调试游戏驱动,绕过反调试机制,帮助开发人员快速识别并解决游戏中的问题。
- **系统安全研究**:研究操作系统内核机制和反调试技术,为系统安全防护提供见解。
- **软件调试**:调试其他需要绕过反调试的软件,提高调试效率和成功率。
标签:C++, Delphi, DOM解析, EPT Hook, Intel VT, UnrealDbg, VT调试器, Windows驱动, 云资产清单, 内核调试, 反作弊对抗, 反调试, 子域名枚举, 客户端加密, 客户端加密, 客户端加密, 数据擦除, 游戏外挂, 游戏安全, 系统安全, 自动回退, 虚拟化安全, 虚拟化技术, 逆向工程, 驱动调试