经过大量谷歌搜索并给出一些提示后 here ,我终于成功了find a layout FS
段(Windows 使用它来存储 TIB 数据)。我特别感兴趣的是 PSDK 中提供的 ArbitraryUserPointer
成员:
typedef struct _NT_TIB {
struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
PVOID StackBase;
PVOID StackLimit;
PVOID SubSystemTib;
union {
PVOID FiberData;
DWORD Version;
};
PVOID ArbitraryUserPointer;
struct _NT_TIB *Self;
} NT_TIB;
使用这个变量到底有多安全(在 Vista 及以上版本下)?它在 x64 上还存在吗?
其次是对该变量的访问。我正在使用 MSVC,因此我
可以访问 __readfsdword
和 __readgsqword
内在函数,但是 MSDN由于某种原因将这些标记为特权指令:
These intrinsics are only available in kernel mode, and the routines are only available as intrinsics.
它们当然不仅仅是内核,但为什么它们被标记为这样,只是不正确的文档? (我的离线 VS 2008 文档没有此条款)。
最后,通过单个 __readfsdword(0x14)
直接访问 ArbitraryUserPointer
是否安全,还是首选通过线性 TIB 地址使用它? (仍然需要从 FS
读取)。
最佳答案
ArbitraryUserPointer
是一个不用于一般用途的内部字段。操作系统在内部使用它,如果你覆盖它,就会损坏东西。我承认它的名字很糟糕。
关于windows - TIB 定制存储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9261455/