我通过Createtoolhelp32Snapshot函数枚举进程中的所有线程。 我想为每个线程获取一些基本的堆栈信息。 更具体地说,我想获得堆栈底部地址,如果可能的话,我想获得当前的堆栈顶部地址。 基本上这是在WinDbg中用~*k命令显示的信息。 那么我怎样才能从线程的ID或HANDLE中获取堆栈信息呢?
(定义可以在这里找到。)
获取堆栈边界:
THREAD_BASIC_@R_57_4045@ION basicInfo; NT_TIB tib; // Get TEB address NtQuery@R_57_4045@ionThread(YOUR_THREAD_HANDLE,ThreadBasic@R_57_4045@ion,&basicInfo,sizeof(THREAD_BASIC_@R_57_4045@ION),NULL); // Read TIB NtReadVirtualMemory(YOUR_PROCESS_HANDLE,basicInfo.TebBaseAddress,&tib,sizeof(NT_TIB),NULL); // Check tib.StackBase and tib.StackLimit
要获得esp的价值,只需使用Getthreadcontext 。
一个简单的方法,而不必涉及Windows驱动程序工具包是这样的:
NT_TIB* tib = (NT_TIB*)__readfsdword(0x18); size_t* stackBottom = (size_t*)tib->StackLimit; size_t* stackTop = (size_t*)tib->StackBase;
__readfsdword()仅适用于当前线程。 所以,NtQuery@R_57_4045@ionThread()的变体更加灵活。
添加了一些在ntdll.h中错过的声明:
typedef enum _THREADINFOCLASS { ThreadBasic@R_57_4045@ion = 0,} THREADINFOCLASS; typedef LONG KPRIORITY; typedef struct _CLIENT_ID { HANDLE UniqueProcess; HANDLE UniqueThread; } CLIENT_ID; typedef CLIENT_ID *PCLIENT_ID; typedef struct _THREAD_BASIC_@R_57_4045@ION { NTSTATUS ExitStatus; PVOID TebBaseAddress; CLIENT_ID ClientId; KAFFINITY AffinityMask; KPRIORITY Priority; KPRIORITY BasePriority; } THREAD_BASIC_@R_57_4045@ION,*PTHREAD_BASIC_@R_57_4045@ION;
正如我所知,Toolhelp通过复制堆,模块,进程和线程的基本信息来工作。 这不包括包含堆栈底部地址的TEB块。 我想你需要使用另一个API,调试器引擎API,它提供了检查堆栈的函数
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。