在Windows上获得一个64位进程的TEB

我试图在Windows 8中获得64个远程线程的TEB。

按照这里的定义,我这样做:

sz = sizeof(NTSTATUS) + sizeof(PTEB) + sizeof(HANDLE) + sizeof(HANDLE) + sizeof(ULONG_PTR) + sizeof(LONG) + sizeof(LONG); infoBuff = malloc(sz); stat = NtQueryInformationThread(mainThread, (THREADINFOCLASS) 0, infoBuff, sz, NULL); if (!NT_SUCCESS(stat)) { printf ("ERROR (code 0x%x): Cannot get information about about the main TEB. \n", stat); return 1; } 

如果我编译为32位,sz是0x1C和调用返回成功。 如果我编译为64位,sz是0x2C但呼叫返回状态0xC0000004:STATUS_INFO_LENGTH_MISMATCH。

任何ideea 64位目标上_THREAD_BASIC_INFORMATION的正确大小是多less? 或者也许是一个获得远程TEB的替代方法?

谢谢,Alex

Solutions Collecting From Web of "在Windows上获得一个64位进程的TEB"

在你不允许的结构中有填充,因此STATUS_INFO_LENGTH_MISMATCH错误。

找出结构体积的最简单也是最可靠的方法是让编译器解决这个问题:

 sizeof(THREAD_BASIC_INFORMATION) 

无论如何,你可以很容易地手工完成:

类型名称偏移大小
 ---- ---- ------ ----
 NTSTATUS ExitStatus;  0 4
             填充4 4
 PVOID TebBaseAddress;  8 8
 CLIENT_ID ClientId;  16 16
 KAFFINITY AffinityMask;  32 8
 KPRIORITY优先;  40 4
 KPRIORITY BasePriority;  44 4

所以这会使结构的总大小为48个字节,或0x30

填充是为了确保TebBaseAddress是8字节对齐。