FS寄存器指向当前活动线程的TEB结构(线程结构) 偏移 说明 000 指向SEH链指针 004 线程堆栈顶部 008 线程堆栈底部 00C SubSystemTib 010 FiberData 014 ArbitraryUserPointer 018 FS段寄存器在内存中的镜像地址 020 进程PID 024 线程ID 02C 指向线程局部存储指针 030 PEB结构地址(进程结构) 034 上个错误号
了解了FS寄存器的数据构成,即可轻松使用汇编语言获得自身PID和TID,例如获取PID,只需要取fs:[20h]即可。 下面是另一个稍复杂的使用场景:获取KERNEL32.DLL基址(来自互联网,本人未经验证)。 得到KERNEL32.DLL基址的方法 assume fs:nothing ;打开FS寄存器 mov eax,fs:[30h] ;得到PEB结构地址 mov eax,[eax 0ch] ;得到PEB_LDR_DATA结构地址 mov esi,[eax 1ch] ;InInitializationOrderModuleList lodsd ;得到KERNEL32.DLL所在LDR_MODULE结构的InInitializationOrderModuleList地址 mov edx,[eax 8h] ;得到BaseAddress,既Kernel32.dll基址