首先,我很惊讶谷歌对这个特定问题完全没有表现出任何影响,尽管有必要使用 Win32 调试函数实现一个基本的 Win32 调试器,如下所述:https://msdn.microsoft.com/en-us/library/windows/desktop/ms679303%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396
当调试器进程从WaitForDebugEvent
返回时,我要求的必要性就出现了,获取任何事件,并且在DEBUG_EVENT结构中是一个DWORD dwThreadId
成员,这当然是调试对象进程的线程ID。现在,我想使用 Get/SetThreadContext
来操作这个调试对象线程,它只接受HANDLE hThread
。因此,我需要某种方法从线程ID中获取HANDLE,但是似乎没有办法为另一个进程执行此操作(OpenThread
仅适用于当前进程(。
但是,实现裸机调试器之所以需要这样做,是因为当调试器要处理INT3
断点时,调试对象已经执行了INT3
指令,并且需要递减 EIP 以说明这一点,因此需要 SetThreadContext。因此,如果我不能做到这一点,我甚至无法实现像 INT3 断点这样基本的东西!
底线是,必须有一种方法,一些未记录的方式(甚至没有在Google中弹出任何东西!(,因为所有现有的,有效的调试器,也许ntdll.dll
中有一些未记录的功能?
我可以在 Google 上找到的有关 INT32 断点的 Win32 实现的所有信息都只是使用从初始调用中检索到CreateProcess
的hThread
,当调试对象只有一个线程时,这非常有效,但这显然是一个严重的限制。
哎呀,我是个白痴。 显然OpenThread
适用于所有进程,我认为它不是,因为它不接受进程 ID/句柄。所以我在所有错误的地方寻找和思考。