系统调用-KiSystemService
Posted joneyyana
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统调用-KiSystemService相关的知识,希望对你有一定的参考价值。
系统调用-SharedCode
2020年3月17日
0:38
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环堆栈.
- 调用目标函数.
Created with Microsoft OneNote 2016.
以上是关于系统调用-KiSystemService的主要内容,如果未能解决你的问题,请参考以下文章