逆向分析 KiSystemService和KiFastCallEntry 调用内核函数部分
一、回顾
前两篇博客,我逆向分析 KiSystemService 和 KiFastCallEntry 填充_KTRAP_FRAME 结构体的代码,二者
大同小异,主要的区别是 sysenter 只改了eip,cs,ss,虽然esp也改了,但是windows不使用,而是从TSS
里取esp0;另外sysenter并没有像中断门那样压栈,所以3环的 ss, esp, eflags, cs,eip都要在函数里依
次保存到 _KTRAP_FRAME.
本章节:逆向 KiSystemService和KiFastCallEntry 调用内核函数部分
1)如何根据系统服务号(eax中存储)找到要执行的内核函数?
2)调用时参数是存储到3环的堆栈,如何传递给内核函数?
二、SystemServiceTable 系统服务表(系统服务表不是SSDT)
ServiceTable:指向函数地址表
Count:没有用
ServiceLimit:是这两张表的长度
ArgmentTable:指向函数参数表
通过上面图,我们可以得知以下信息:
通过 _KTHREAD 可以找到系统服务表
系统服务表又指向函数地址表和函数参数表
有两张系统服务表,第一张是用来找内核函数的,第二张是找Win32k.sys驱动函数的。
三、逆向 KiSystemService和KiFastCallEntry 调用内核函数部分
在逆向分析调用内核函数部分时候,需要补充一下知识:
逆向三环API进入0环之前,无论是中断门还是快速调用进入,都会在eax存储一个值,我们称作为(系统调用号,服务号,)这个东西的低12位就是函数参数表和函数地址表的下标,
而第13位(下标12)如果是0,表示找第一张系统服务表(绿色的表),如果是1,那么找第二张表(黄色的表)。这点可以先记住,待会逆向的时候可以印证这个结论。