分析 INT 0x2E 和 sysenter如何进入R0
一、回顾
上课我们学习到3环如何进入0环,分别是中断门,快速调用,如果CPU支持快速调用,
那么_KUSER_SHARED_DATA 结构体的 SystemCall 属性指向的函数是 KiFastSystemCall;
如果不支持,那么SystemCall 指向的函数是KiIntSystemCall。
KiFastSystemCall(快速调用)
KiIntSystemCall(中断门)
二、分析 INT 0x2E
KiIntSystemCall触发 INT 2E中断,我们可以用windbg查看2E号中断对应的描述符:83e8ee00`0008efee
拆分中断门描述符:83e8ee00`0008efee
CS=0008(系统代码段),EIP=83e8efee(KiSystemService函数地址)
接下来看看tr寄存器的值,tr=0x28,然后看看TSS描述符:80008b1e`400020ab
拆分TSS描述符:80008b1e`400020ab
base=801e4000
查看一下TSS地址
kd> dd 801e4000
801e4000 00000000 83f79cb0 00000010 00000000
801e4010 00000000 00000000 00000000 00000000
esp0=83f79cb0 ss=10
三、分析 sysenter
sysenter是从MSR寄存器读取 CS0、ESP0、EIP0的寄存器的值,SS0=IA32_SYSENTER_CS+8计算而来。
查看 CS,ESP,EIP
kd> rdmsr 174
msr[174] = 0000000000000008 kd> rdmsr 175 msr[175] = 00000000
80790000
kd> rdmsr 176
msr[176] = 00000000`83e8f0c0
EIP是KiFastCallEntry函数:
kd> u 83e8f0c0
nt!KiFastCallEntry:
83e8f0c0 b923000000 mov ecx,23h
83e8f0c5 6a30 push 30h
83e8f0c7 0fa1 pop fs
83e8f0c9 8ed9 mov ds,cx
83e8f0cb 8ec1 mov es,cx
83e8f0cd 648b0d40000000 mov ecx,dword ptr fs:[40h]
83e8f0d4 8b6104 mov esp,dword ptr [ecx+4]
83e8f0d7 6a23 push 23h
四、总结
通过中断门进入0环:
1.中断号(0x2E)固定的
2.cs/eip门描述符提供
3.进入R0后执行内核函数:nt!KiSystemService:
通过sysenter(快速调用)进入0环:
1.CS/ESP/EIP由MSR寄存器提供(SS是算出来的)
2.进入R0后执行内核函数:nt!KiFastCallEntry:
接下来的课程,我们讲逆向分析:KiSystemService与KiFastCallEntry