我在 Windows 64 位系统上运行的 32 位二进制文件中找到了以下代码:
mov eax,dword ptr fs:[18]
mov ecx,dword ptr [eax+F70]
mov eax,dword ptr [ecx+78]
ret
它似乎返回 win32threadinfo 地址,但由于 32 位/64 位混淆,我很难解释偏移量。这是正确的吗?
mov eax,dword ptr fs:[18] => eax = TIB address (32-bit interpretation)
mov ecx,dword ptr [eax+F70] => F70 offset undocumented in TIB ?
mov eax,dword ptr [ecx+78] => eax = win32threadinfo (64-bit interpretation)
WOW64 进程有两个 TEB(和两个 PEBS)。 32 位 TEB (TEB32) 可通过
fs
(及其位于 [fs:0x18]
的线性地址)以通常的方式访问,而本机 64 位 TEB (TEB64) 可通过偏移量 0xf70
处的指针访问TEB32(参见 this)或什至通过 gs
和 [gs:0x30]
(尽管这可能是特定于版本的)。
WOW64 进程的 TEB32 与真正的本机 32 位进程的 TEB32 并不完全相同。
所以,你的解释似乎是正确的。