windows内核情景分析———系统调用分析

今天看了下windows内核情景分析中的系统调用这章,对于系统调用的一个大概过程有了一定的了解!

            就拿书上的ReadFile这个API来说,首先这个API是在用户空间的,所以能够直接调用,然后在这个函数的内部会调用NtReadFile这个中介函数(这个在ntdll.dll中也是用户空间),当然内核中也有一个同名的函数,ntdll.dll中的这个NtReadFile函数在内部实现如下:

NtReadFile(int dummy0, int dummy1, int dummy2)
{
 __asm
 {
  mov eax, 152
  mov ecx, KUSER_SHARD_SYSCALL
  call [ecx]
  ret 9
 }
}

这个KUSER_SHARD_SYSCALL是用户空间的一个地址,这个地址存放着一个函数指针,指向KiIntsystemcall()或KiFastSystemCall();

这两个函数的实现如下

_KiIntsystemcall@0:

lea edx,[esp+8]    //edx指向函数调用的第一个参数

int 0x2e

ret

_KiFastSystemCall@0:

mov edx,esp

sysenter

_KiFastSystemCallRet@0:

ret

通过int 0x2e 这个中断,cpu进入了系统态,然后一些寄存器会被压到系统堆栈中如ss esp cs  EFLAGS 等,然后系统通过中断好从中断向量表中找到中断处理函数的入口

这个入口就是KISystemService(),实现如下:

_KiSystemService:

SYSCAL_PROLOG kss_a,kss_t

jmp SharedCode

SYSCAL_PROLOG kss_a,kss_t

这个是一个宏,这个宏的作用主要是保存一些之前的数据,然后设置为新的内容,最主要的就是设置新的堆栈框架,做完这些之后就跳到SharedCode,这个标签下的代码的作用是判断系统调用号的大小,根据系统调用号的大小来调用基本的系统调用或扩充

的系统调用Win32k,以及检查系统调用号是否越界,然后将用户空间栈中的函数参数复制到系统空间栈中,再通过系统调用号找到系统调用表中的的函数,得到函数的地址,最后才进入真正的系统函数中!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值