本文主要是介绍TEB结构思考,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在网上看到的一篇文章如下:
TEB与PEB的结构分析,如阿燐燐所诉FS寄存器指向当前活动线程的TEB结构(线程结构)
用OD打开一个任意程序可以看到FS段寄存器的状况,

在数据窗口中跟踪7FFDF000然后以长型地址的方式查看数据,可以完整的看到TEB结构
,
而FS:[18]则是TEB 7FFDF000的指针。
FS:[0]
FS:[30]
都是FS:[18]结构中的一部分。在程序初始化的过程中,FS在GDT中得到一个大小是00FFFFFF,起始位置为7FFDF000可以被RING3权限程序控制的地址空间。并且把程序的一些线程和进程信息存放在此处。
而整个表的指针放在FS:[18]中。
当时考虑为什么要通过获取FS:[18],而不是直接获取FS的值呢,其实是因为使用FS:[18]这样的形式可以让cpu自动实现地址翻译,即我们使用的段寻址方式来获取地址,如果
直接用FS寄存器,得到的是一个16为的段选择子,如果用FS:[0],则得到的是TEB指针偏移0处的值为地址,从该地址里取出来的值,已经不是FS这个段选择子表示的地址了,
从而也就不是TEB的地址了,因此需要绕一个弯,从偏移18h处取得TEB的指针,也就是TEB的地址,然后再按照TEB结构来获取其它的变量,如PEB等。
- TEB结构
- //
- // Thread Environment Block (TEB)
- //
- typedef struct _TEB
- {
- NT_TIB Tib; /* 00h */
- PVOID EnvironmentPointer; /* 1Ch */
- CLIENT_ID Cid; /* 20h */
- PVOID ActiveRpcHandle;
- //
这篇关于TEB结构思考的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!