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

时间:2016-01-30 19:44:15

标签: c multithreading debugging winapi

首先,我很惊讶谷歌对这个特定问题绝对没有没有,尽管有必要使用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成员时,出现了我要求的必要性当然是 debuggee 进程的线程ID。现在,我想使用Get/SetThreadContext操纵此 debuggee 线程,HANDLE hThread只接受OpenThread。所以,我需要一些从线程ID获取HANDLE的方法,但似乎没有办法为另一个进程执行此操作(INT3仅适用于当前进程)。

但实现裸机调试器必需的原因是调试器要处理INT3断点时, debuggee 已经执行了ntdll.dll指令,并且需要递减EIP以解决这个问题,因此需要SetThreadContext。所以如果我不能做到这一点,我甚至无法实现像INT3断点那样简陋的东西!

最重要的是,必须有一种方式,一些未记录的方式(甚至没有出现在谷歌中的任何东西!),因为所有现有的,正在运行的调试器,可能是hThread中的一些未记录的函数?

我在Google上可以找到关于INT3断点的Win32实现的所有信息只是使用从CreateProcess的初始调用中检索到的while,这在调试对象只有一个线程时非常有效,但这显然是一个严重的限制。

1 个答案:

答案 0 :(得分:2)

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