有没有办法可以在不创建进程的情况下调用WaitForDebugEvent?

问题描述 投票:0回答:1

我正在尝试使用 WaitForDebugEvent 捕获调试事件,但在 Microsoft 网站上它说“只有创建正在调试的进程的线程才能调用 WaitForDebugEvent。”

所以我试图找到一种方法来捕获调试事件而不创建进程。

这是我用于附加调试器的代码。效果很好:

NTSTATUS Status = SysNtCreateDebugObject(&DebugObject, DEBUG_ALL_ACCESS, &ObjectAttributes, FALSE);
if (!NT_SUCCESS(Status))
{
    printf("Unable to create debug object: 0x%x\n", Status);
    CloseHandle(ProcessHandle);
    return 0;
}
printf("Created debug object\n");

Status = SysNtDebugActiveProcess(ProcessHandle, DebugObject);
if (!NT_SUCCESS(Status))
{
    printf("Unable to debug process: 0x%x\n", Status);
    CloseHandle(DebugObject);
    CloseHandle(ProcessHandle);
    return 0;
}
c++ windows debugging
1个回答
0
投票

当然。你有2个选择: 或致电

NTSYSAPI
VOID
NTAPI
DbgUiSetThreadDebugObject(
    _In_ HANDLE DebugObject
    );

然后使用

DbgUiWaitStateChange
WaitForDebugEvent
或直接致电
NtWaitForDebugEvent

NTSYSCALLAPI
NTSTATUS
NTAPI
NtWaitForDebugEvent(
    _In_ HANDLE DebugObjectHandle,
    _In_ BOOLEAN Alertable,
    _In_opt_ PLARGE_INTEGER Timeout,
    _Out_ PDBGUI_WAIT_STATE_CHANGE StateChange
    );

DbgUiSetThreadDebugObject
DebugObjectHandle
保存在线程
TEB
中,并且
DbgUiWaitStateChange
获取它(通过
DbgUiGetThreadDebugObject
)并调用
NtWaitForDebugEvent

WaitForDebugEvent
调用
DbgUiWaitStateChange
,然后将
DBGUI_WAIT_STATE_CHANGE
转换为
DEBUG_EVENT

© www.soinside.com 2019 - 2024. All rights reserved.