1

我想使用它的 ID 获取线程的起始地址。是否可以?

4

2 回答 2

2

您只需要OpenThread并调用NtQueryInformationThread

第二个参数设置为ThreadQuerySetWin32StartAddress

也可以参考这篇文章

于 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,但它应该是可行的。

另一种方法是使用未记录的原生 APINtQueryInformationThreadThreadQuerySetWin32StartAddress. 还有一个关于该功能的 MSDN 页面,但还远远不够。

于 2012-06-04T20:39:54.943 回答