3环进0环需要换 CS EIP SS ESP
在中断方式时,CS和EIP在中断门描述符里面,SS和ESP在TSS里面
CPU不支持快速调用时使用中断进0环
Sysenter:
通过MSR寄存器获得CS ESP EIP 的值,(CPU计算这个值)SS的值等于CS+8 ,所以cs=0x8 时,ss=0x10
进内核的两条路线
中断方式路线:通过_KUSER_SHARED_DATA +0x300 ->KiIntSystemCall ->int 2E 通过中断门找到中断处理程序地址->KiSystemService
快速调用方式路线:通过_KUSER_SHARED_DATA +0x300 ->KiFastSystemCall ->sysenter(在MSR里面找CS SS ESP EIP)->KiFastCallEntry
练习
1:自己实现通过中断门直接调用内核函数。
2:通过IDA找到KiSystemService和KiFastCallEntry函数并分析
1)进0环后,原来的寄存器存在哪里?
保存在TRAP_FRAME里面
2)如何根据系统调用号(eax中存储)找到要执行的内核函数?
add edi, [esi+_KTHREAD.ServiceTable] ; edi=服务表 SSDT 或者shadow ssdt
mov ebx, [edi+eax*4]
3)调用时参数是存储到3环的堆栈,如何传递给内核函数?
把参数复制到0环
mov ebx, [edi+eax*4] ; ebx=要调用的函数地址
sub esp, ecx ; 提升栈顶 用来复制参数
shr ecx, 2 ; cl/4 才是真正的参数个数
mov edi, esp
rep movsd ; 由ESI复制到EDI 次数为 ecx
4)2中调用方式是如何返回到3环的?