我目前
NtQueryInformationThread(.., ThreadQuerySetWin32StartAddress, addr, ..)
用于获取线程地址addr
。
msdn文档说
NtQueryInformationThread 可能在未来版本的 Windows 中被更改或不可用
还,
请注意,在 Windows Vista 之前的 Windows 版本上,返回的起始地址仅在线程开始运行之前是可靠的。
检索线程地址的建议方法是什么?
NtQueryXxxx 函数组是未记录的内部 Windows 内核函数。直到微软被迫在与美国司法部的和解中记录他们。他们这样做了,但保留在任何未来版本的 Windows 中更改其实施的权利,这是允许他们在 Windows 上进行创新所必需的。并保留不必使该函数在内核中的预期用途之外实际有用的权利。
警告非常准确,线程启动后,您将无法从此函数中获得可用的线程起始地址。它将指向真正的起始地址,即 ntdll.dll 中名为 __RtlUserThreadStart() 的内部帮助函数。当你有 Windows 的调试符号时,你可以在任何堆栈跟踪中看到它。每个启动线程的起始地址相同。
字写在墙上。不要使用它。