(46)分析 INT 0x2E 和 sysenter
一、回顧
上次課我們學習了3環進0環的兩種方式,分別是中斷門和快速調用,如果CPU支持快速調用,那么_KUSER_SHARED_DATA 結構體的 SystemCall 屬性指向的函數是 KiFastSystemCall;如果不支持,那么SystemCall 指向的函數是KiIntSystemCall。
執行 KiFastSystemCall,則使用快速調用的方式進0環;
執行 KiIntSystemCall,則使用中斷門的方式進0環。
共同點是都要給0環提供新的CS,SS,EIP,ESP,只是提供的方式不同。中斷門的CS,EIP從IDT表里獲取,SS,ESP從TSS表里獲取;快速調用的CS,EIP,ESP從MSR寄存器獲取,SS是CS+8計算得到,至于MSR寄存器里的值,則是系統啟動時就已經填好。
所以快速調用比中斷門快就快在,快速調用不需要訪問內存,而中斷門需要讀TSS和IDT表。
這節課,我們來詳細分析 INT 2E 和 sysenter 做了哪些工作。
二、分析 INT 0x2E
KiIntSystemCall 觸發了 2E 中斷。用windbg看看2E號中斷的中斷門描述符,2E 右移3位(或者乘8)得到 0x170,加上 r idtr獲取的IDT基址,可以計算出 2E號中斷對應的描述符:8053ee00`0008e481
kd> r idtr idtr=8003f400 kd> dq 8003f400+170 8003f570 8053ee00`0008e481 80548e00`00081780拆分中斷門描述符,可以得到新的CS是0008(系統代碼段),EIP是 8053e481,這個是內核模塊的 KiSystemService 函數。
kd> u 8053e481 nt!KiSystemService: 8053e481 6a00 push 0 8053e483 55 push ebp 8053e484 53 push ebx 8053e485 56 push esi 8053e486 57 push edi 8053e487 0fa0 push fs 8053e489 bb30000000 mov ebx,30h 8053e48e 668ee3 mov fs,bx接下來查看 TSS 表,首先看看tr寄存器的值,是0x28,然后看看TSS描述符:
kd> dq 8003f000 8003f000 00000000`00000000 00cf9b00`0000ffff 8003f010 00cf9300`0000ffff 00cffb00`0000ffff 8003f020 00cff300`0000ffff 80008b04`200020abTSS描述符是 80008b04`200020ab
所以TSS的地址就是 80042000,dd看一下:
kd> dd 80042000 80042000 0c458b24 8054acf0 8b080010 758b0855所以ESP0 = 8054acf0, SS0 = 0010。
三、分析 sysenter
sysenter 是從 MSR 寄存器里讀取 CS0,ESP0,EIP0,而SS0是通過CS0+8計算得來。我們可以用 rdmsr 指令在windbg里查看 MSR 寄存器,也可以用 wrmsr 修改MSR寄存器。
| IA32_SYSENTER_CS | 174H |
| IA32_SYSENTER_ESP | 175H |
| IA32_SYSENTER_EIP | 176H |
查看 CS,ESP,EIP
kd> rdmsr 174 msr[174] = 00000000`00000008 kd> rdmsr 175 msr[175] = 00000000`f8ac2000 kd> rdmsr 176 msr[176] = 00000000`8053e540其中,EIP是 KiFastCallEntry 函數:
kd> u 8053e540 nt!KiFastCallEntry: 8053e540 b923000000 mov ecx,23h 8053e545 6a30 push 30h 8053e547 0fa1 pop fs 8053e549 8ed9 mov ds,cx 8053e54b 8ec1 mov es,cx 8053e54d 8b0d40f0dfff mov ecx,dword ptr ds:[0FFDFF040h] 8053e553 8b6104 mov esp,dword ptr [ecx+4] 8053e556 6a23 push 23h四、總結
API通過中斷門進0環:
1) 固定中斷號為0x2E 2) CS/EIP由門描述符提供 ESP/SS由TSS提供 3) 進入0環后執行的內核函數:NT!KiSystemServiceAPI通過sysenter指令進0環:
1) CS/ESP/EIP由MSR寄存器提供(SS是算出來的) 2) 進入0環后執行的內核函數:NT!KiFastCallEntryint 0x2e 和 sysenter 指令進0環后,分別調用了兩個函數 KiSystemService 和 KiFastCallEntry。
下一篇博客,我將逆向分析 KiSystemService 和 KiFastCallEntry 這兩個函數。
總結
以上是生活随笔為你收集整理的(46)分析 INT 0x2E 和 sysenter的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (44)MessageBoxA 监视器(
- 下一篇: (47)逆向分析 KiSystemSer