Windows Native API 如何与内核通信?

逆向工程 视窗 内核模式
2021-06-19 06:58:30

windows Native API (Ntdll.dll) 是一个用户模式库。然而,它是与内核接口的最终用户模式库。它实际上如何与内核交互并弥合从用户模式到内核模式的差距?例如,如果我编写一个标准的用户模式应用程序,我就不能直接调用 ntoskrnl.exe 函数。Ntdll.dll实际上是直接调用ntoskrnl.exe函数吗?如果是这样,作为用户模式库,它如何有权限这样做?

1个回答

ntdll.dll在任何意义上都没有特权,并且不能做您的用户模式库不能做的任何事情。所以不,它没有“权限”直接调用内核模式代码,它没有这样做。

它所做的是通过内核提供的一个特殊接口来接收用户模式调用。根据版本和 CPU,这些ntdll函数会加载几个寄存器,其中包含 (a) 表示所请求操作的 id 的数字,以及 (b) 堆栈的地址,其中包含此操作的参数。它做了一些特殊的事情(见下文),导致 CPU 转换到内核模式,并开始执行系统调用的入口点。

此代码基本上是索引上的 switch 语句,它调用正确的适当内核模式函数(并复制参数)。

“特殊的东西”ntdll所做的要么是调用软件中断 ( int 0x2e),要么在现代版本的 Windows 中使用专门的系统调用指令 (syscallsysenter)。这两件事所做的是转换到环 0 并开始执行给定堆栈中的给定地址。不同之处在于调度中断需要查阅存储在内存中的表(IDT),而专用指令则不需要。

这就是魔法发生的地方。没有什么能真正阻止您在堆栈上准备正确的参数,使用正确的值加载 eax 和 edx 并执行int 2e(或适用于 x64 的适当内容)。