C语言 从另一个进程的线程 ID 获取线程句柄



首先,我很惊讶谷歌对这个特定问题完全没有表现出任何影响,尽管有必要使用 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 实现的所有信息都只是使用从初始调用中检索到CreateProcesshThread,当调试对象只有一个线程时,这非常有效,但这显然是一个严重的限制。

哎呀,我是个白痴。 显然OpenThread适用于所有进程,我认为它不是,因为它不接受进程 ID/句柄。所以我在所有错误的地方寻找和思考。

最新更新