Win32 系统线程信息块(TIB)浅析
2009-03-05 20:02:37 来源:WEB开发网光说不练是无法了解 TIB 的,其实就是 FS 寄存器指向的内容。嘿!Win32 中还有段和段寄存器吗?大多数情景是这样的,但都是在基于 Intel 平台的 Win32 系统中实现的(即使是其前身 Win32s),FS 寄存器指向 TIB。因此,我稍候要详细描述的所有结构偏移都适用于 FS 寄存器指向的段偏移。例如,FS:[0] 指向结构化异常处理链,而 FS:[2C] 指向线程的线程局部存储数组。
我刚才提到了编译器直接存取 TIB 结构。让我们用一个小例子来看看这是怎么做的。这是一个使用结构化异常处理的很小的C程序:
int main()
{
__try
{ int i = 0;
}
__except( 1 )
{ int j = 1: }
return 0;
}
在编译的时候,最开始的结果代码是下面这个样子:
401000: PUSH EBP
401001: MOV EBP,ESP
401003: PUSH FF
401005: PUSH 00404000
40100A: PUSH 00401140
40100F: MOV EAX,FS:[00000000]
401015: PUSH EAX
401016: MOV DWORD PTR FS:[00000000],ESP
注意一系列的 PUSH 指令。它们在堆栈上创建一个数据结构(有点像一个不可见的局部变量)。该指令在偏移 0x_40100F 处从线程信息块中取出结构化异常处理链的头,然后将之存储到 EAX——指令的 FS:[00000000] 部分这正是来自于此。此时代码将当前结构化异常处理链的头压入堆栈。至此结束在堆栈上创建局部数据结构的过程。最后一条指令:
MOV DWORD PTR FS:[00000000],ESP
将结构化异常处理链头指向新创建的数据结构。
更多精彩
赞助商链接