获取当前线程的起始地址

时间:2018-07-11 02:31:32

标签: c windows winapi 64-bit

我试图弄清楚如何获取当前线程的入口点(我只需要阅读它)。

我尝试从RtlCaptureContext中读取RCX,但这并没有给我提供包含线程起始地址的地址。

我知道有NtQueryThreadInformation函数,但是我想知道是否有更好的内部方法可以避免使用未记录的函数。

1 个答案:

答案 0 :(得分:1)

不幸的是,当您将ThreadQuerySetWin32StartAddress作为参数传递时,NtQueryInformationThread是获取该信息的唯一方法。原因是Win32StartAddress包含在代表线程对象(ETHREAD)的内核数据结构中。 NtQueryInformationThread从结构中请求该信息并输出。

您可以通过挂钩RtlUserThreadStart来监视将来线程的创建。这是线程开始执行的地方,也是内核模式中在进程中创建线程时的回调。累加器寄存器包含在用于创建线程的参数中指定的执行的初始地址。例如,假设有一个名为“ begin”的子例程。

CreateThread(NULL, NULL, begin, NULL, NULL, NULL);

如果钩住RtlUserThreadStart,则EAX(累加器)寄存器将包含“开始”地址。

这是不使用NtQueryInformationThread时需要挂钩的例程的签名:

void RtlUserThreadStart(PTHREAD_START_ROUTINE BaseExecutionAddress, PVOID Context);

尽管如此,Microsoft尚无记录的方法可以从用户模式获取此信息。