我试图弄清楚如何获取当前线程的入口点(我只需要阅读它)。
我尝试从RtlCaptureContext
中读取RCX,但这并没有给我提供包含线程起始地址的地址。
我知道有NtQueryThreadInformation
函数,但是我想知道是否有更好的内部方法可以避免使用未记录的函数。
答案 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尚无记录的方法可以从用户模式获取此信息。