我正在尝试获取 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/