首页
社区
课程
招聘
[原创]新手分享_再谈FS寄存器
发表于: 2018-5-4 19:50 11537

[原创]新手分享_再谈FS寄存器

2018-5-4 19:50
11537
     历史:在80386及之后的处理器 又增加了两个寄存器 FS 寄存器和 GS寄存器
     环境:win7 32位(单核)  工具 windbg 、OD

一、FS 寄存器到底指向哪里?

     历史:在80386及之后的处理器 又增加了两个寄存器 FS 寄存器和 GS寄存器
     环境:win7 32位(单核)  工具 windbg 、OD
                           

       
 index        TI         RPL
 ‭00110        0          00‬  

                
    根据索引 找到 GDT 表中的内容   834093f3`4c003748
    段描述符的结构在进行拆分 (在windbg可以使用 dg 命令 进行 查看   后来才看到)
             
          最终找到 0环下 FS 指向的内容  那这个地址到底是什么呢?
     我们先查看下 KPCR 结构的信息
                   
    看到之后 是不是很熟悉 ,这里正是 我们 0环下 FS 指向的内容 
    
由于Windows需要支持多个CPU,
因此Windows内核中为此定义了一套以处理器控制区(Processor Control Region)
即KPCR为枢纽的数据结构, 使每个CPU都有个KPCR. 
其中KPCR这个结构中有一个域KPRCB(Kernel Processor Control Block)结构, 这个结构扩展了KPCR. 这两个结构用来保存与线程切换相关的全局信息. 
   关于一些 重要的结构 都能在 KPCR 中找到  
由于Windows需要支持多个CPU,
因此Windows内核中为此定义了一套以处理器控制区(Processor Control Region)
即KPCR为枢纽的数据结构, 使每个CPU都有个KPCR. 
其中KPCR这个结构中有一个域KPRCB(Kernel Processor Control Block)结构, 这个结构扩展了KPCR. 这两个结构用来保存与线程切换相关的全局信息. 
   关于一些 重要的结构 都能在 KPCR 中找到  

2)3环下的FS

           0环下的 基本了解差不多了  那再看下 3环 下的 FS      3B
           在OD 中 我们 看到   是指向  7FFDF000   ,那我们拿  3B  去拆分  
           
                       index         TI          RPL
‭                       111(7)        0           11‬(3)
        在找到 描述符 时 拆分  会发现 基地址  全是  0
        这是为什么呢 ?   因为   微软 在 winXP sp3  之后  对 TEB  进行了随机化 机制处理    , 所以是无法 用 选择子 去找gdt  表找描述符
         不过我们在 3 环下 通过windbg查看 结果是正确的  
           
        这里验证下  3环fs 指向 TEB 
     

二、哪里改变了FS的值?

            现在  我们知道了 FS 在3环和 0环指向的内容   ,不过 0环和3环的FS 值是不同的 在哪里改变的呢?

           关于 3环进入0环

           
在老式的cpu 上 应用程序从3环进入0环是通过中断门 在IDT的0x2E位置
而当时程序的入口为_KiSystemService()
而在之后出现了新的进入0环的方法 sysenter 快速系统调用
与新的入口 KiFastCallEntry()
         那就看一下 KiFastCallEntry 到底干了些什么?
       
nt!KiFastCallEntry:
83e470c0 b923000000      mov     ecx,23h
83e470c5 6a30            push    30h
83e470c7 0fa1            pop     fs      //在这对fs 进行了赋值
83e470c9 8ed9            mov     ds,cx
83e470cb 8ec1            mov     es,cx
83e470cd 648b0d40000000  mov     ecx,dword ptr fs:[40h]
83e470d4 8b6104          mov     esp,dword ptr [ecx+4]
83e470d7 6a23            push    23h
83e470d9 52              push    edx

          可以看到 在刚进入 函数 就对 fs 进行赋值   那再哪 给还原回去了?  
           0环下的 基本了解差不多了  那再看下 3环 下的 FS      3B
           在OD 中 我们 看到   是指向  7FFDF000   ,那我们拿  3B  去拆分  
           
                       index         TI          RPL
‭                       111(7)        0           11‬(3)
        在找到 描述符 时 拆分  会发现 基地址  全是  0
        这是为什么呢 ?   因为   微软 在 winXP sp3  之后  对 TEB  进行了随机化 机制处理    , 所以是无法 用 选择子 去找gdt  表找描述符
         不过我们在 3 环下 通过windbg查看 结果是正确的  
                       index         TI          RPL
‭                       111(7)        0           11‬(3)
        在找到 描述符 时 拆分  会发现 基地址  全是  0
        这是为什么呢 ?   因为   微软 在 winXP sp3  之后  对 TEB  进行了随机化 机制处理    , 所以是无法 用 选择子 去找gdt  表找描述符
         不过我们在 3 环下 通过windbg查看 结果是正确的  
           
        这里验证下  3环fs 指向 TEB 
     

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2018-5-15 22:53 被Cestlavie呀编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (4)
雪    币: 871
活跃值: (9841)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
2
KPCR结构体,最后全图我爱看.  要是能把结构体中的每个成员的作用稍微说下,就完美了.  支持一下.
2018-5-4 21:35
0
雪    币: 474
活跃值: (232)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
谢谢,分析一下kpcr结构体吧
2018-5-4 22:14
0
雪    币: 183
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
请问一下文章中显示段选择子拆分跟反汇编代码的黑色背景,用的是什么工具?
2018-5-15 20:24
0
雪    币: 1378
活跃值: (3067)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
大佬,你这个图用什么做的??PS吗??
2019-9-30 18:52
0
游客
登录 | 注册 方可回帖
返回
//