FS:[0]在3环指向TEB,进0环后指向KPCR
系统中同时存在多个线程,这就意味着FS:[0]在3环时指向的TEB有多个(每个线程一份)
但我们在实际使用中发现,当我们在不同线程中查看FS的值时,FS的段选择子都是相同的,那是如何通过一个FS寄存器指向多个TEB的呢?
SwapContext代码片段
loc_46AAA4: ; CODE XREF: SwapContext+86↑j
.text:0046AAA4 ; SwapContext+AF↑j
.text:0046AAA4 mov eax, [ebx+18h] ; 取出目标线程的TEB
.text:0046AAA7 mov ecx, [ebx+3Ch] ; 获取GET
.text:0046AAAA mov [ecx+3Ah], ax ; 修改GDT表中段描述符的基地址,ax的底2字节存储到段描述符底4字节的16~31位
.text:0046AAAE shr eax, 10h ; 右移16位得到地址的高2字节
.text:0046AAB1 mov [ecx+3Ch], al ; 修改高4字节的0~7位
.text:0046AAB4 mov [ecx+3Fh], ah ; 修改高4字节的24~31位
.text:0046AAB7 inc dword ptr [esi+4Ch] ; 统计切换次数
.text:0046AABA inc dword ptr [ebx+61Ch] ; 统计信息
.text:0046AAC0 pop ecx
结合下图的段描述符看代码