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的方法?
谢谢,亚历克斯
结构中有填充,你不允许这样,因此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字节对齐.