首页
社区
课程
招聘
[原创]浅谈一下FS段寄存器在用户层和内核层的使用
发表于: 2014-9-21 22:12 21593

[原创]浅谈一下FS段寄存器在用户层和内核层的使用

2014-9-21 22:12
21593

菜鸟一枚,有一段时间不搞内核了,分享一下以前学习的结果,有不对的地方请各位指点,大牛飘过~~
在R0和R3时,FS段寄存器分别指向GDT中的不同段:在R3下,FS段寄存器的值是0x3B,在R0下,FS段寄存器的值是0x30。分别用OD和Windbg在R3和R0下查看寄存器(XP3),下图:



FS寄存器的改变是从R3进入R0后和从R0退回到R3前完成的,也就是说:都是在R0下给FS赋不同值的。(FS在R0和R3中是不同的值,在 KiFastCallEntry / KiSystemService中FS值由0x3B变成0x30在 KiSystemCallExit / KiSystemCallExitBranch / KiSystemCallExit2 中再将R3的FS恢复)

一.R3与R0之间的互相转换

6
nt!KiSystemService:
808696a1 6a00            push    0
808696a3 55              push    ebp
808696a4 53              push    ebx
808696a5 56              push    esi
808696a6 57              push    edi
808696a7 0fa0            push    fs   [COLOR="blue"] //旧的R3 下的FS 保存入栈 [/COLOR]
808696a9 bb30000000      mov     ebx,30h
808696ae 668ee3          mov     fs,bx   //FS=0X30  FS 值变成了0X30. 
808696b1 64ff3500000000  push    dword ptr fs:[0]
808696b8 64c70500000000ffffffff mov dword ptr fs:[0],0FFFFFFFFh
808696c3 648b3524010000  mov     esi,dword ptr fs:[124h]  //ESI=_ETHEAD
808696ca ffb640010000    push    dword ptr [esi+140h]     //PreviousMode
808696d0 83ec48          sub     esp,48h                  
808696d3 8b5c246c        mov     ebx,dword ptr [esp+6Ch]  
80869945 8d6550          lea     esp,[ebp+50h]
80869948 0fa1            pop     fs [COLOR="Blue"]// 恢复 FS 值 [/COLOR]
8086994a 8d6554          lea     esp,[ebp+54h]
8086994d 5f              pop     edi
8086994e 5e              pop     esi
8086994f 5b              pop     ebx
80869950 5d              pop     ebp
80869951 66817c24088000  cmp     word ptr [esp+8],80h
nt!_TEB
   +0x000 NtTib            : _NT_TIB
      +0x000 ExceptionList    : Ptr32
      +0x004 StackBase        : Ptr32
      +0x008 StackLimit       : Ptr32
      +0x00c SubSystemTib     : Ptr32
      +0x010 FiberData        : Ptr32
      +0x010 Version          : Uint4B
      +0x014 ArbitraryUserPointer : Ptr32
      +0x018 Self             : Ptr32    //TEB
   +0x01c EnvironmentPointer : Ptr32
   +0x020 ClientId         : _CLIENT_ID
      +0x000 UniqueProcess    : Ptr32
      +0x004 UniqueThread     : Ptr32
   +0x028 ActiveRpcHandle  : Ptr32
   +0x02c ThreadLocalStoragePointer : Ptr32
   +0x030 ProcessEnvironmentBlock : Ptr32   //PEB
   +0x034 LastErrorValue   : Uint4B
   +0x038 CountOfOwnedCriticalSections : Uint4B
   +0x03c CsrClientThread  : Ptr32
   +0x040 Win32ThreadInfo  : Ptr32
kd> dg 8 0x40
                                  P Si Gr Pr Lo
Sel    Base     Limit     Type    l ze an es ng Flags
---- -------- -------- ---------- - -- -- -- -- --------
0008 00000000 ffffffff Code RE    0 Bg Pg P  Nl 00000c9a
0010 00000000 ffffffff Data RW    0 Bg Pg P  Nl 00000c92
0018 00000000 ffffffff Code RE    3 Bg Pg P  Nl 00000cfa
0020 00000000 ffffffff Data RW    3 Bg Pg P  Nl 00000cf2
0028 80042000 000020ab TSS32 Busy 0 Nb By P  Nl 0000008b
0030 ffdff000 00001fff Data RW    0 Bg Pg P  Nl 00000c92
0038 00000000 00000fff Data RW Ac 3 Bg By P  Nl 000004f3
0040 00000400 0000ffff Data RW    3 Nb By P  Nl 000000f2

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

上传的附件:
收藏
免费 3
支持
分享
最新回复 (25)
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好东西哈。
2014-9-21 23:11
0
雪    币: 608
活跃值: (403)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
不错,顶一个。
2014-9-21 23:34
0
雪    币: 253
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
nice~
2014-9-22 01:02
0
雪    币: 222
活跃值: (185)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
5
学习了!
2014-9-22 08:51
0
雪    币: 60
活跃值: (439)
能力值: ( LV5,RANK:65 )
在线值:
发帖
回帖
粉丝
6
火钳刘明
2014-9-22 10:11
0
雪    币: 144
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢普及常识!
2014-9-22 11:23
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
8
哈哈不错,一些ARK 暴利检具线程也是通过这种办法
2014-9-24 00:51
0
雪    币: 310
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
原理性的东西,非常好
2014-9-24 09:00
0
雪    币: 1555
活跃值: (3103)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
10
mark
2014-9-24 16:16
0
雪    币: 16420
活跃值: (1675)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
一代胜一代……
2014-9-24 18:33
0
雪    币: 17
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
似乎有个小错误,第四张图下面"当线程运行在R3下时,FS指向的段是GDT中的0x30段"
                        第六张图下面”当线程运行在R0下时,FS指向的段是GDT中的0x30段“
2014-9-26 11:11
0
雪    币: 219
活跃值: (52)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
感谢指正,在r3下指向的是0x3B,已经改正过来了
2014-9-26 11:24
0
雪    币: 693
活跃值: (108)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
骚年终于冒泡了
2014-9-26 13:33
0
雪    币: 219
活跃值: (52)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
是时候炒炒冷饭了,要不都忘了
2014-9-26 13:54
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
这是XP系统?32bit?
2014-9-29 15:50
0
雪    币: 260
活跃值: (249)
能力值: ( LV12,RANK:350 )
在线值:
发帖
回帖
粉丝
17
,逮着你啦~
2014-10-25 16:31
0
雪    币: 24
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
不错。。学习了。。
2014-10-25 18:03
0
雪    币: 229
活跃值: (94)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
19
mark,,
2014-10-25 18:43
0
雪    币: 102
活跃值: (2050)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
学习了,mark一下
2015-8-15 14:56
0
雪    币: 438
活跃值: (228)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
21
学习了,mark一下。
2017-3-28 20:36
0
雪    币: 202
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
学习了,mark一下
2017-5-11 21:28
0
雪    币: 29
活跃值: (61)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
23
学习了,mark一下
2017-6-2 16:38
0
雪    币: 3738
活跃值: (3872)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
感谢分享!
2017-6-5 13:36
0
雪    币: 9
活跃值: (180)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
25
谢谢分享
2018-1-3 19:13
0
游客
登录 | 注册 方可回帖
返回
//