Windows系统调用中的系统服务表

 Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

Windows系统调用中的系统服务表

  如果这部分不理解,可以查看 Windows内核分析索引目录依次阅读。

  我们在之前讲过系统调用过程中,给予eax一个编号,操作系统通过这个编号来执行某个内核函数。

  这个函数是通过操作系统的系统服务表来查找的。

  现在,我们来探究一下nt!KiFastCallEntry的反汇编代码,看看其如何查看系统服务表找到要执行的函数的。

 

一、系统服务表结构

  Windows一共有两张表,每张表大小10h,每个成员占4h。

  如图,其中函数地址表每成员四字节,函数参数表每成员一字节。

  参数的数值是以字节为单位。

  

二、系统服务表在哪里

  在Win7 32位中存于 [KTHREAD+0xbc]

  kd> dt _KTHREAD
    ntdll!_KTHREAD

    +0x000 Header           : _DISPATCHER_HEADER

    ·······

    +0x0bc ServiceTable     : Ptr32 Void

    ····

  该结构地址为第一个表

  

三、要判断使用哪个表

  传入函数序号的第12位,存储的就是关于使用那个表的标志,如果为0,则调用第一张表,如果为2,则调用第二张表。

  大于12位的值其实全部是忽略的。

  

四、找到要执行的函数

  如图,通过第0-11位作为序号,找到函数地址表和函数参数表。

  以参数表中的数值作为开辟新的栈的大小,之后开辟新的栈,将参数传入进来,之后根据函数地址表来调用内核函数。

  

 

原文地址:https://www.cnblogs.com/onetrainee/p/11713969.html