在WIndows上获取64位进程的TEB
我正在尝试获取Windows8中64个远程线程的TEB 根据中的定义,我这样做:在WIndows上获取64位进程的TEB,windows,winapi,win32-process,Windows,Winapi,Win32 Process,我正在尝试获取Windows8中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
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,但调用返回状态0xc000004:status\u INFO\u LENGTH\u MISMATCH
任何想法64位目标上的线程基本信息的正确大小是多少?
或者是另一种获取远程TEB的方法
谢谢,
Alex结构中存在您不允许的填充,因此出现
状态\u信息\u长度\u不匹配
错误
找出结构大小的最简单、最可靠的方法是让编译器计算出来:
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
类型名称偏移量大小
---- ---- ------ ----
NTSTATUS存在状态;0 4
填充4
PVOID基址;8 8
客户ID ClientId;16 16
亲缘关系;32 8
KPRIORITY优先级;40 4
KPRIORITY-BasePriority;44 4
这将使结构的总大小为48字节,或0x30
填充是为了确保
TebBaseAddress
是8字节对齐的。您是否尝试直接在其上执行sizeof?我无法执行sizeof(线程基本信息),因为我在任何地方都找不到结构定义。非常感谢David,它成功了!我无法执行sizeof(线程基本信息),因为我在任何地方都找不到结构定义。您可以将链接到的结构定义粘贴到程序中。另一个有用的提示是,结构的对齐方式等于其成员的最大对齐方式。这意味着您的结构具有对齐8。这意味着它的大小必须是8的倍数。作为一种精神检查很有用。是的,明白了!非常感谢大卫!