我想使用它的ID获取线程的起始地址。有可能吗?
答案 0 :(得分:2)
答案 1 :(得分:1)
嗯,由于以下原因,这实际上并不重要:在Win32子系统中,所有线程都具有相同的起始地址。在Windows(但不包括)Vista中,它位于kernel32.dll
内(根据官方符号命名为BaseThreadStartThunk
)。在以Vista开头的Windows版本中,RtlUserThreadStart
中的公共起始地址现在为ntdll.dll
(并且BaseThreadStartThunk
已重命名为BaseThreadInitThunk
,而且现在似乎只执行特定于Win32的任务)
然而,您可以尝试的是暂停该线程,检索其CONTEXT
(使用GetThreadContext
)并从该遍历将堆栈返回到其顶部以调查那里的参数。它需要对kernel32.dll
线程启动例程的每个实现进行一些逆向工程,但它应该是可行的。
另一种方法是将未记录的本机API NtQueryInformationThread
与ThreadQuerySetWin32StartAddress
一起使用。关于这个功能还有an MSDN page,但还远未完成。