09 Windows线程切换FS

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

结合下图的段描述符看代码
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/87442506
09