在WIndows上获得64位进程的TEB

时间:2013-06-17 16:48:47

标签: windows winapi win32-process

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

根据here的定义,我这样做:

    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。

任何想法64位目标上_THREAD_BASIC_INFORMATION的正确大小是什么? 或者也许是获得远程TEB的另一种方式?

谢谢, 亚历

1 个答案:

答案 0 :(得分:6)

结构中有填充,你不允许这样做,因此STATUS_INFO_LENGTH_MISMATCH错误。

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

sizeof(THREAD_BASIC_INFORMATION)

无论如何,你可以用手轻松地解决它:

Type         Name              Offset   Size
----         ----              ------   ----
NTSTATUS     ExitStatus;        0        4
             Padding            4        4
PVOID        TebBaseAddress;    8        8
CLIENT_ID    ClientId;          16      16
KAFFINITY    AffinityMask;      32       8
KPRIORITY    Priority;          40       4
KPRIORITY    BasePriority;      44       4

这样就可以使结构的总大小为48字节,或0x30

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