内核呓语系列4 —— 系统调用

2014-1-6 Nie.Meining Coding

内核通过系统调用向应用层提供接口,应用层代码通过中断(Windows int 0x2e,Linux int 0x80)或sysenter的形式进入系统调用。相信很多玩过rootkit的朋友最初就是从ssdt hook开始的,网上也有大量介绍ssdt的文章,因此本篇也不对ssdt的原理、调用流程什么的进行说明了,就挑一些有意思的周边东西讲讲。

首先Windows和Linux都有一张SSDT表,Linux的SSDT表中各个函数的地址可以在编译内核后的system.map文件中找到。Windows由于子系统集成到了内核中,因此win32k.sys还扩展了一张Shadow SSDT表。win32k.sys模块并不常驻内存,Shadow SSDT地址也未导出,因此hook其中的函数需要多做一些工作。关于子系统的问题可以参见本系列的前两篇文章。

此外,来自应用层的东西通常是不可信的,所以系统调用必须进行参数检查。可能为了效率问题,Windows引入了PreviousMode的概念。通常只在KeGetPreviousMode() != KernelMode时进行参数检查。写过驱动的朋友应该知道,Windows执行体中同样功能的函数通常有两套,NtXXX和ZwXXX。其实NtXXX才是真正完成功能的函数,而调用ZwXXX的目的就是改变PreviousMode为KernerMode再调用NtXXX,省去参数检查的麻烦。可以找个函数验证一下:

阅读全文>>

评论(0) 浏览(31361)

Powered by emlog