其他分享
首页 > 其他分享> > 12323

12323

作者:互联网

系统调用-KiSystemService

2020年3月16日

17:07

找到KiSystemService

通过分析3环的调用过程可以知道, 系统调用会使用int 2e进入0环. 2e就是中断向量. 对应了IDT中索引为2e的中断描述符.

 

通过WinDbg在IDT中找到索引为2e的中断描述符, 并分析描述符的字段.

可以看到这个中断描述符的目标代码段(CS段)是0008, 这是一个0环的代码段.

中断处理函数地址是 0x8053E481, 这个地址对应的就是 KiSystemService

 

 

 

Machine generated alternative text:
u OxBOS3E4B1 
nt ! kiSystemService 
80532481 
80532483 
80532484 
80532487 
BOS3e4Be 
SaOO 
53 
57 
OfaO 
bb30000000 
66 Bee3 
push 
push 
push 
push 
push 
push 
mov 
mov 
ebp 
edi 
ebx, 30h

 

 

保存现场

如果发生了特权等级提升. CPU会依次把3环的SS/ESP/EFLAGS/CS/EIP压入0环的堆栈.这意味着, 当CPU执行到KiSystemService的时候, 堆栈中已经压入了这5个3环的寄存器.

 

进入到KiSystemService首先看到的是6个push. 这是在保存现场.

Machine generated alternative text:
. text: øø466481 
. text:øø466483 
. text:øø466484 
. text:øø466485 
. text:øø466486 
. text: øø466487 
. text: øø466489 
55 
53 
56 
57 
øø 
Aø 
push 
push 
push 
push 
push 
push 
ebp 
es1 
ed i 
KT RAP 
. ErrCode 
F RAN E 
F RANE . E bp 
F RANE . E S I 
F RANE . Edi 
SegF s

 

其实Windows用了结构体KTRAP_FRAME来保存现场. Windows设定TSS.Esp0指向的是 KTRAP_FRAME+7C.

+78对应的是字段HardwareSegSs. +74则是HardwareEsp,+70:Eflags, +6C:SegCs, +68:Eip.

 

Machine generated alternative text:
DbgEbp 
DbgEip 
DbgArgMark 
DbgArgPointer 
Tempsegcs 
TenpE sp 
D re 
Dri 
Dr2 
Drs 
Dr7 
segEs 
SegEs 
segos 
Edx 
Ecx 
SJiÉKisy ESP 
TSS. 
nt! {TRAP 
•exeee 
*exeu 
•exee8 
•exeec 
*exe le 
*exe 14 
*exe 18 
.exelc 
*exe ze 
*exe 24 
*exe 28 
.exe2c 
*exe se 
•exe 34 
*exe 38 
.exe3c 
*exege 
•exe48 
•exeg c 
*exe se 
•exe 54 
*exe 58 
*exesc 
•exe€e 
•exe€4 
•exe€8 
.exe€c 
.exe7e 
•exe74 
•exe78 
.exe7 c 
*exese 
*exeu 
.exe88 
. Uint4B 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
Previouspreviousmode : Uint43 
ExceptionList 
segFs 
Edi 
Esi 
E r Xo-de 
Elg 
segcs 
Flags 
HardwareEsp 
HardwareSegSs 
V8€Es 
V8€os 
V8€Fs 
V8€Gs 
Ptr32 EXCEPTION 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43 
. Uint43

 

 

 

切换FS

Windows设计FS.Base指向的是KPCR结构, 所以0环处理函数.会切换FS.

Windows对每个处理器都使用一个KPCR结构保存辅助信息.如果你只有一个处理器, 这个KPCR结构有一个固定的地址:0xFFDFF000.

 

可以看到KiSystemService中切换了FS为0x30.这个0x30对应的是GDT中Index为6的段描述符, 这个段描述符的Base刚好就是0xFFDFF0000.

Machine generated alternative text:
. text: øø466489 
. text:øø46648g 
. text:øø46648E 
. text:øø46648E 
aa 
66 
3ø 
øø øø øø 
ebx, 
fs, 
3øh 
bx

Machine generated alternative text:
kd> dq gdtr+6*B LI 
B003f030 
ffc033df'f0000001

Machine generated alternative text:
24 
Base 31:24 
23 
22 
D 
21 
ø 
A 
ø 
1 
1 
19 
Seg 
Limit 
19:16 
16 
14 13 
D 
P 
12 
s 
11 
Type 
Base 23:16 
Base Address 
lløøøøøø 
AVL 
BASE 
øxFFDFF-øøø 
1 
DPL 
G 
1 
øxØØØØIF-F-F 
1 
15:øø 
øøøøøø 
IS 
ø 
Segment Limit 15:ØØ 
øøøøøøøøøøøøøø 
64- bit code segment (IA-32e mode only) 
LIMIT 
s 
TYPE (DEC) 
Available for use by system software 
Segment base address 
Default operation size (0 = 16-blt, 1 
Descriptor privilege level 
Granularity 
Segment Limit 
Segment present 
Data Segment 
Read /Write, accessed 
= 32-blt) 
BV Jonev

 

 

设置异常链表

KiSystemService会把原本保存在KPCR中的ExceptionList保存在KTRAP_FRAME.Exception中.

并把KPCR的ExceptionList置为-1, 表明当前异常链表为空.

Machine generated alternative text:
. text: øø4664g1 
. text: øø4664g1 
. text: øø4664g1 
. text: øø466497 
assume fs:nothing 
35 
FF push 
F +mov 
dword ptr 
dword ptr 
ds:øFFDFFøøøh 
ds:øFFDFFøøøh, 
KPCR 
KPCR 
. Exception 
(TRAP FRAME. ExceptionList 
.NT LIT. ExceptionList

 

设置先前模式

KiSystemService把当前线程的PreviousMode(先前模式)备份到KTRAP.PreviousMode中.并计算PreviousMode后存到当前线程结构ETHREAD.PreviousMode中.

Windows只使用了3环/0环, CS的CPL只有两种情况:3或者0, 3 and 1 = 1;0 and 1 = 0;

所以PreviousMode 为1时表示先前模式是用户模式, 为0时表示先前模式是内核模式.

 

Machine generated alternative text:
. text: øø4664A7 
. text: øø4664AD 
. text:øø46648ø 
. text:øø466434 
. text:øø466434 
. text:øø466434 
. text:øø466487 
86 
83 
88 
83 
88 
48 
24 
øø 
øø 
push 
sub 
and 
mov 
dword ptr Cesi+_ETHREAD. Tcb. Previous"ode) • 
esp. 
ebx, Cesp+_KTRAP FRAME . SegCs) 
ebx, I 
Cesi+_ETHREAD. Tcb. Previous"ode) , 
FRANE-+øxøf%å 
(TRAP FRANE+6c:segcs 
CS. RPL meindo-ws 
ETHREAD. (THREAD. Previousmode

 

 

保存调试相关

在KiSystemService中保存了一些DbgXxx字段.同时还会判断线程的DebugActive, 如果bit0~7有一位不是0, 就会去保存调试相关的寄存器.

Machine generated alternative text:
. text: øø4664CF 
. text: øø4664CF 
. text:øø4664D2 
. text:øø4664D5 
. text:øø4664D8 
. text:øø4664DF 
.text:øø4664E2 
.text:øø4664E5 
. text:øø4664Eg 
83 
88 
89 
89 
89 
KDbgXX 
ebx, ._Ebp) 
edi, 
70 
55 
45 
70 
46 
85 
68 
øø 
80 
øø 
mov 
D8+mov 
mov 
mov 
test 
Jnz 
Cesi+_ETHREAD.Tcb 
Dr Label 
. DbgArgPointer), edx 
.DbgArgmark), øaADaøDøøh 
. DbgEbp), ebx 
. DbgEip), edi 
. DebugActive), h 
if(ETHREAD.KTHREAD.DebugActive & øxFF) jmp

 

跳转到SharedCode

可以看到在KiSystemService中并没有开始调用系统函数. 而是在最后跳入到另一份代码中.

在跳转前使用指令sti打开了中断, 这是因为在执行int 2e后CPU会把中断位关闭.

Machine generated alternative text:
.text:øø4664EF 
. text:øø4664Fø 
08 
øø 
øø 
sti 
Imp 
Sha red Code 
• Jump

 

Created with Microsoft OneNote 2016.

标签:KPCR,Windows,PreviousMode,12323,2e,描述符,KiSystemService
来源: https://www.cnblogs.com/joneyyana/p/12560538.html