系统调用-KiSystemService

Posted joneyyana

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统调用-KiSystemService相关的知识,希望对你有一定的参考价值。

系统调用-SharedCode

2020年3月17日

0:38

SharedCode

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

 

获取系统服务表

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

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

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

技术图片

 

技术图片

 

 

检查索引是否越界

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

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

技术图片

 

加载Win32k

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

 

技术图片

 

 

系统调用

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

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

技术图片

 

 

 

Created with Microsoft OneNote 2016.

以上是关于系统调用-KiSystemService的主要内容,如果未能解决你的问题,请参考以下文章

windows系统调用图(瑕疵)

Linux系统调用跟我学(1)

LINUX系统调用

Linux 内核进程管理 ( 系统调用简介 | 进程相关系统调用源码 )

系统调用的理解

系统调用与函数调用