你的位置:首页 > 软件开发 > 操作系统 > 浅谈系统服务分发

浅谈系统服务分发

发布时间:2017-03-22 12:00:21
欢迎转载,转载请注明出处:http://www.cnblogs.com/uAreKongqi/p/6597701.html0x00.说在前面  就我们所知,Windows操作系统内核的陷阱处理器会分发中断、异常和系统服务调用,这里我们就其中的系统服务分发简单解析一下。 0x0 ...

浅谈系统服务分发

    欢迎转载,转载请注明出处:http://www.cnblogs.com/uAreKongqi/p/6597701.html

0x00.说在前面

  就我们所知,Windows操作系统内核的陷阱处理器会分发中断、异常和系统服务调用,这里我们就其中的系统服务分发简单解析一下。

 

0x01.粗看不同处理器进入系统调用

  (1).在PentiumII 之前的x86处理器上,Windows使用int2e指令产生一个陷阱,导致执行线程转到内核模式,进入系统服务分发器,eax保存系统服务号,edx指向参数列表。最后通过iret指令返回用户模式;

       我们查看IDT的2e成员,得知该成员保存的地址是系统调用分发器的地址,紧接着u一下KiSystemService,会发现在保存完寄存器等状态之后,他走到了KiFastCallEntry里面!(在Win7 x86下测试)

      浅谈系统服务分发

  (2).在x86Pentium II 处理器上,Windows使用了sysenter指令,内核的系统服务分发器例程的地址保存在与该指令相关联的一个MSR中,eax,edx保存与int2e相同的内容。最后通过sysexit指令返回用户模式;

     这里读取MSR的0x176处,其中包含了系统服务分发器地址,发现实际上调用的就是KiFastCallEntry(入口)!(在Win7 x86下测试)

      浅谈系统服务分发

  (3).在x64体系架构上,Windows使用syscall指令,将系统调用号保存在eax中,前四个参数放在寄存器(rcx/rdx/r8/r9)中,剩下的参数在栈中。

    64位平台读取MSR的0xC00000082处,里面保存的是64位的syscall,当我们u一下这个地址,发现这个就是x64系统调用分发的入口KiSystemCall64(在Win7 x64下测试)

      浅谈系统服务分发

    Ps:通过KiSystemCall64的地址可以通过硬编码得到SSDT、SSSDT地址

 ......

浅谈系统服务分发

 

   我们发现,32位下,系统调用分发操作都会走到KiFastCallEntry里面,而64位下,系统调用分发操作会走到KiSystemCall64,然后去完成相应的系统服务调用。那么我们有个疑问,系统是怎么进入到这些系统调用的呢?

 

0x02.举例查看系统调用如何发生

  这里以Win7 x86 平台下的 NtOpenProcess为例,切换到一个进程内(如explorer.exe),u一下NtOpenProcess,这里显示的是ntdll里的NtOpenProcess的反汇编:

原标题:浅谈系统服务分发

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录