如何使用其ID检索线程的起始地址?

时间:2012-06-04 20:26:29

标签: windows winapi

我想使用它的ID获取线程的起始地址。有可能吗?

2 个答案:

答案 0 :(得分:2)

您需要的只是OpenThread并致电NtQueryInformationThread

第二个参数设置为ThreadQuerySetWin32StartAddress

另请参阅此article

答案 1 :(得分:1)

嗯,由于以下原因,这实际上并不重要:在Win32子系统中,所有线程都具有相同的起始地址。在Windows(但不包括)Vista中,它位于kernel32.dll内(根据官方符号命名为BaseThreadStartThunk)。在以Vista开头的Windows版本中,RtlUserThreadStart中的公共起始地址现在为ntdll.dll(并且BaseThreadStartThunk已重命名为BaseThreadInitThunk,而且现在似乎只执行特定于Win32的任务)

然而,您可以尝试的是暂停该线程,检索其CONTEXT(使用GetThreadContext)并从该遍历将堆栈返回到其顶部以调查那里的参数。它需要对kernel32.dll线程启动例程的每个实现进行一些逆向工程,但它应该是可行的。

另一种方法是将未记录的本机API NtQueryInformationThreadThreadQuerySetWin32StartAddress一起使用。关于这个功能还有an MSDN page,但还远未完成。