在WIndows上获得64位进程的TEB

ale*_*dan 3 windows winapi win32-process

我正试图在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;
}
Run Code Online (Sandbox Code Playgroud)

如果我编译为32位,则sz为0x1C,并且调用成功返回.如果我编译为64位,则sz为0x2C,但调用返回状态0xC0000004:STATUS_INFO_LENGTH_MISMATCH.

任何想法在64位目标上_THREAD_BASIC_INFORMATION的大小是多少?或者也许是另一种获取远程TEB的方法?

谢谢,亚历克斯

Dav*_*nan 6

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

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

sizeof(THREAD_BASIC_INFORMATION)
Run Code Online (Sandbox Code Playgroud)

无论如何,你可以用手轻松地完成它:

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.

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

  • 是的,明白了!非常感谢大卫! (2认同)