系统调用-SharedCode

SharedCode

SharedCode是参考ReactOS取的名, 之所以称为"Shared"是因为不管是KiSysteService还是KiFastCallEntry,正常流程都会执行到这个位置. SharedCode里面才包含真正的调用目标函数的过程, KiSystemService和KiFastCallEntry中只是做了一些数据保存相关的操作.

     

获取系统服务表

一进入SharedCode首先会对系统服务号进行处理.

bit12~bit13用来表示目标系统服务是哪个模块, 姑且称为系统服务模块号. 0:nt模块 1:Win32k 2和3未使用.

ETHREAD.Tcb.ServiceTable指向了一个数组, 这个数据包含了4个SYSTEM_SERVICE_TABLE结构, SYSTEM_SERVICE_TABLE结构大小是16个字节, 也就是0x10

     

     

     

检查索引是否越界

系统服务号的bit0~bit11一共12位, 用来表示函数地址表和函数参数表的索引.

KSYSTEM_SERVICE_TABLE.NumberOfService表示了函数的个数. 如果索引 >= 个数, 说明索引越界了.

     

加载Win32k

当系统服务模块号为1,表示这个模块是win32k. win32k在进程创建的时候并不会被立即加载, 而是懒加载:第一次调用win32k相关的函数时加载.

     

     

     

系统调用

执行到最后,这里才是关键步骤:

  • 系统调用计数器+1.
  • 通过函数地址表找到目标函数地址.
  • 复制3环参数到0环堆栈.
  • 调用目标函数.

 

posted @ 2020-03-22 02:31  Joney_Yana  阅读(255)  评论(0编辑  收藏  举报