Windows系统调用学习笔记(二)—— 3环进0环
Windows系統調用學習筆記(二)—— 3環進0環
- 要點回顧
- 基本概念
- _KUSER_SHARED_DATA
- 0x7FFE0300
- 實驗:判斷CPU是否支持快速調用
- 第一步:修改EAX=1
- 第二步:將當前匯編指令修改為cpuid
- 第三步:清空ECX與EDX
- 第四步:執行cpuid,觀察結果
- 第五步:觀察EDX的SEP位(第11位)
- 3環進0環
- 基本步驟
- 中斷門進0環
- 分析 KiIntSystemCall
- 分析 INT 0x2E
- 第一步:在IDT表中找到0x2E號門描述符
- 第二步:分析CS/SS/ESP/EIP的來源
- 第三步:查看門描述符指向的EIP
- 快速調用進0環
- 分析 KiFastSystemCall
- 分析 sysenter指令
- MSR寄存器
- 總結
- API通過中斷門進0環
- API通過sysenter指令進0環
- 內核模塊
- 練習
要點回顧
上一篇我們分析了ReadProcessMemory這個函數的3環部分
本篇將弄清這個 函數地址(7FFE0300h) 是什么
基本概念
_KUSER_SHARED_DATA
User:0x7ffe0000
Kernnel:0xffdf0000
注意:雖然指向的是同一個物理頁,但在User層是只讀的,在Kernnel層是可寫的
0x7FFE0300
描述:
當通過eax=1來執行cpuid指令時,處理器的特征信息被放在ecx和edx寄存器中,其中edx包含了一個SEP位(11位),該位指明了當前處理器知否支持sysenter/sysexit指令
- 支持:
ntdll.dll! KiFastSystemCall() - 不支持:
ntdll.dll! KiIntSystemCall()
實驗:判斷CPU是否支持快速調用
第一步:修改EAX=1
第二步:將當前匯編指令修改為cpuid
第三步:清空ECX與EDX
第四步:執行cpuid,觀察結果
第五步:觀察EDX的SEP位(第11位)
0xBFF = 二進制:1011 1111 1111
SEP=1,說明當前CPU支持 sysenter / sysexit 指令
3環進0環
基本步驟
中斷門進0環
分析 KiIntSystemCall
該函數函數只執行了兩行代碼
分析:
注意:在執行KiIntSystemCall函數前,編號已被寫入EAX
分析 INT 0x2E
第一步:在IDT表中找到0x2E號門描述符
門描述符:804dee00`0008e7d1
指向地址:804de7d1
第二步:分析CS/SS/ESP/EIP的來源
CS:門描述符的段選擇子部分(0008)
SS:從段選擇子指向的TSS段描述符指向的TSS表中取出
ESP:從段選擇子指向的TSS段描述符指向的TSS表中取出
EIP:804de7d1
第三步:查看門描述符指向的EIP
nt表示當前函數為內核函數
快速調用進0環
快速調用:
分析 KiFastSystemCall
該函數函數只執行了兩行代碼
分析:
注意:在執行KiIntSystemCall函數前,編號已被寫入EAX
分析 sysenter指令
注意:
MSR寄存器
描述:MSR寄存器非常龐大,這里只列出三個值,詳細信息參照Intel白皮書
可以通過RDMSR/WRMST來進行讀寫(操作系統使用WRMST寫該寄存器):
查看EIP所在地址的反匯編
nt表示當前函數為內核函數
注意:
4. 在執行sysenter指令時,只有CS、ESP、EIP三個寄存器的值可從MSR寄存器中獲得,其中并不包括SS!
5. SS= IA32_SYSENTER_CS + 8
6. 這些操作與操作系統無關,而是硬件(CPU)做的(詳情參考Intel白皮書第二卷)
總結
API通過中斷門進0環
API通過sysenter指令進0環
內核模塊
10-10-12分頁:ntoskrnl.exe
2-9-9-12分頁:ntkrnlpa.exe
練習
要求:通過IDA找到KiSystemService和KiFastCallEntry函數并分析
問題:
答案:見下篇
總結
以上是生活随笔為你收集整理的Windows系统调用学习笔记(二)—— 3环进0环的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows系统调用学习笔记(一)——
- 下一篇: Windows系统调用学习笔记(三)——