我想使用它的 ID 获取线程的起始地址。是否可以?
问问题
2738 次
2 回答
2
于 2012-06-04T20:38:50.937 回答
1
嗯,这并不是微不足道的,原因如下:在 Win32 子系统中,所有线程都具有相同的起始地址。在 Windows 到(但不包括)Vista 中,它位于内部(根据官方符号kernel32.dll
命名)。BaseThreadStartThunk
在从 Vista 开始的 Windows 版本中,公共起始地址现在RtlUserThreadStart
位于ntdll.dll
(并且已BaseThreadStartThunk
重命名为BaseThreadInitThunk
并且现在似乎只执行特定于 Win32 的任务)。
但是,您可以尝试暂停线程,检索其CONTEXT
(使用GetThreadContext
)并从中遍历堆栈回到其顶部以调查那里的参数。这将需要对线程启动例程的每个实现进行一些逆向工程kernel32.dll
,但它应该是可行的。
另一种方法是使用未记录的原生 APINtQueryInformationThread
和ThreadQuerySetWin32StartAddress
. 还有一个关于该功能的 MSDN 页面,但还远远不够。
于 2012-06-04T20:39:54.943 回答