经过大量的谷歌搜索以及here的一些提示之后,我终于设法将FS
段的find a layout(由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将这些标记为特权指令:它们当然是而不是内核,但是为什么将它们标记为这样,只是不正确的文档? (我的离线VS 2008文档没有此子句)。
最后,通过单个
ArbitraryUserPointer
直接访问__readfsdword(0x14)
是安全的还是最好通过线性TIB地址使用它? (仍然需要从FS
读取)。 最佳答案
ArbitraryUserPointer
是一个内部字段,不通用。操作系统在内部使用它,如果覆盖它,则会损坏内容。我承认它的名字很差。