我正在尝试使用 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;
}
当然。你有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