3

我正在尝试在 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。

知道 64 位目标上 _THREAD_BASIC_INFORMATION 的正确大小是多少?或者也许是获得远程TEB的另一种方式?

谢谢,亚历克斯

4

1 回答 1

6

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

找出结构大小的最简单和最可靠的方法是让编译器计算出来:

sizeof(THREAD_BASIC_INFORMATION)

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

类型名称 偏移大小
---- ---- ------ ----
NTSTATUS 退出状态;0 4
             填充 4 4
PVOID TebBaseAddress; 8 8
CLIENT_ID 客户 ID;16 16
KAFFINITY AffinityMask;32 8
KPRIORITY 优先;40 4
KPRIORITY BasePriority;44 4

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

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

于 2013-06-17T16:57:28.817 回答