抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

系统调用

系统调用

知识点

自己实现NtOpenProcess

在Ring3的代码下调用了sysenter指令之后, CPU会做出如下操作

  1. SYSENTER_CS_MSR的值装载到cs寄存器; // rdmsr 174
  2. SYSENTER_EIP_MSR的值装载到eip寄存器; // rdmsr 176
  3. SYSENTER_CS_MSR的值加8(Ring0的堆栈段描述符)装载到ss寄存器;
  4. SYSENTER_ESP_MSR的值装载到esp寄存器; // rdmsr 175
  5. 将特权级别切换到Ring0;
  6. 如果EFLAGS寄存器的VM标志被置位, 则清除该标志;
  7. 开始执行指定的Ring0代码;

在Ring0代码执行完毕, 调用SYEXIT指令退回Ring3时, CPU会做出如下操作

  1. SYSENTER_CS_MSR的值加16(Ring3的代码段描述符)装载到cs寄存器;
  2. 将寄存器edx的值装载到eip寄存器;
  3. SYSENTER_CS_MSR的值加24(Ring3的堆栈段描述符)装载到ss寄存器;
  4. 将寄存器ecx的值装载到esp寄存器;
  5. 将特权等级切换到Ring3;
  6. 继续执行Ring3的代码

rdmsr用法

  1. 读取msr寄存器
1
2
3
4
5
6
7
8
__asm
{
mov ecx, 0x174;
rdmsr;
}
// 返回值存在ecx和edx寄存器中
// eax: 低32位
// edx: 高32位
  1. 写入msr寄存器
1
2
3
4
5
6
7
__asm
{
mov eax, 0x12345678;
mov edx, 0;
mov ecx, 176h;
wrmsr;
}

_KTRAP_FRAME

内核下的CONTEXT

SSDT Hook

评论