【发布时间】:2023-03-30 03:53:01
【问题描述】:
Windows 将TEB 存储在 FS(32 位)或 GS(64 位)段寄存器中。在使用NtCurrentPeb() 的程序中,x86 指令是mov rax, gs:60h。 0x60 的值为 offsetof(TEB, ProcessEnvironmentBlock)。
要在程序中使用它,我必须同时包含 Windows.h 和 Winternl.h 头文件,其中包含许多其他 #define。正如问题所说,我想使用没有这些头文件的函数并直接访问段寄存器。我还用 TEB 和 PEB 结构制作了一个单独的头文件。那么我该怎么做呢?我在想__asm 关键字和typedef NtCurrentTeb() 什么的。
【问题讨论】:
-
您想在没有 windows 头文件的情况下为 windows 编程吗?为什么你不想包含
windows.h?你当然可以使用__readfsdword和__readgsqword等,但这有什么意义呢? -
__asm在 64 位版本中不受支持 -
__readfsdword不是宏,而是 cl 编译器的内联函数。如何不使用 Windows 标头或__readfsdword帮助您深入了解 API 和 ABI。 ? -
您已将此标记为“程序集”和“c”。这是否意味着您正在使用汇编程序进行编码?使用 VStudio?海合会?使用硬件特定功能(如
gs:或fs:)不会有通用的解决方案。