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

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

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

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

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

       
1
2
 index        TI         RPL
 ‭00110        0          00‬  

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

           
1
2
3
4
在老式的cpu 上 应用程序从3环进入0环是通过中断门 在IDT的0x2E位置
而当时程序的入口为_KiSystemService()
而在之后出现了新的进入0环的方法 sysenter 快速系统调用
与新的入口 KiFastCallEntry()
         那就看一下 KiFastCallEntry 到底干了些什么?
       
1
2
3
4
5
6
7
8
9
10
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  去拆分  
           
1
2
                       index         TI          RPL
‭                       111(7)        0           11‬(3)
        在找到 描述符 时 拆分  会发现 基地址  全是  0
        这是为什么呢 ?   因为   微软 在 winXP sp3  之后  对 TEB  进行了随机化 机制处理    , 所以是无法 用 选择子 去找gdt  表找描述符
         不过我们在 3 环下 通过windbg查看 结果是正确的  
1
2
                       index         TI          RPL
‭                       111(7)        0           11‬(3)
        在找到 描述符 时 拆分  会发现 基地址  全是  0
        这是为什么呢 ?   因为   微软 在 winXP sp3  之后  对 TEB  进行了随机化 机制处理    , 所以是无法 用 选择子 去找gdt  表找描述符
         不过我们在 3 环下 通过windbg查看 结果是正确的  
           
        这里验证下  3环fs 指向 TEB 
     

[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

最后于 2018-5-15 22:53 被Cestlavie呀编辑 ,原因:
收藏
免费 4
支持
分享
赞赏记录
参与人
雪币
留言
时间
PLEBFE
为你点赞~
2023-2-5 05:39
Anowhere
为你点赞~
2022-10-25 20:50
风中小筑V
为你点赞~
2019-12-27 09:49
随风飘飞happy
为你点赞~
2019-5-10 14:25
最新回复 (4)
雪    币: 170
活跃值: (10327)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
2
KPCR结构体,最后全图我爱看.  要是能把结构体中的每个成员的作用稍微说下,就完美了.  支持一下.
2018-5-4 21:35
0
雪    币: 474
活跃值: (252)
能力值: ( 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
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册