windows - 在 WIndows 上获取 64 位进程的 TEB

标签 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 的替代方法?

谢谢, 亚历克斯

最佳答案

结构中存在您不允许的填充,因此出现 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 字节对齐的。

关于windows - 在 WIndows 上获取 64 位进程的 TEB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17152735/

相关文章:

c++ - 如何更改已映射和已提交内存空间的权限?

c++ - 如何获取IStream的长度? C++

c++ - 如何从 C++ 中的线程开始(返回)

c++ - 如 MSDN 所述,提供 SERVICE_STATUS_HANDLE (long unsigned int),函数需要 HANDLE (void*)

c++ - 阻止 Win32 应用程序的所有 Windows Internet 访问

c++ - GetPrivateProfileInt- 只读取默认值

java - Ant 目标符号链接(symbolic link)在 Windows 上不起作用

c++ - Windows 消息循环和 WTL

c++ - Windows GDI API 是否在 GetLastError 中返回错误代码?

c++ - 获取当前用户的所有进程