【发布时间】:2016-05-08 11:19:35
【问题描述】:
首先,我很惊讶 Google 对这个特定问题完全没有显示,尽管有必要使用此处记录的 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。所以,我需要某种方法从线程 ID 中获取 HANDLE,但似乎没有办法为另一个进程执行此操作(OpenThread 仅适用于当前进程)。
但是必须实现一个简单的调试器的原因是当调试器要处理INT3断点时,debuggee 已经执行了INT3 指令,需要减少 EIP 以解决这个问题,因此需要 SetThreadContext。所以如果我不能做到这一点,我什至无法实现像 INT3 断点这样初级的东西!
底线是,必须有一种方法,一些未记录的方法(甚至没有任何在 Google 中弹出的方法!),因为那里有所有现有的、工作的调试器,也许是 ntdll.dll 中的一些未记录的函数?
我可以在 Google 上找到的关于 INT3 断点的 Win32 实现的所有信息都只需使用从对 CreateProcess 的初始调用中检索到的 hThread,当被调试对象只有一个线程时,这非常有效,但那就是显然是一个严重的限制。
【问题讨论】:
-
INT3?那些还在用吗? AFAIK,断点现在由内置调试寄存器处理?
-
无论如何,在 x86 上,AFAIK 我认为硬件调试寄存器只允许 4 个地址之类的东西?
-
也许.. 无论如何,调试器都是神奇的:) 如果我能在发布他们的链接列表代码之前获得更多的 SO 海报来使用它们....
标签: c multithreading debugging winapi