windows Native API (Ntdll.dll) 是一个用户模式库。然而,它是与内核接口的最终用户模式库。它实际上如何与内核交互并弥合从用户模式到内核模式的差距?例如,如果我编写一个标准的用户模式应用程序,我就不能直接调用 ntoskrnl.exe 函数。Ntdll.dll实际上是直接调用ntoskrnl.exe函数吗?如果是这样,作为用户模式库,它如何有权限这样做?
Windows Native API 如何与内核通信?
逆向工程
视窗
内核模式
2021-06-19 06:58:30
1个回答
ntdll.dll
在任何意义上都没有特权,并且不能做您的用户模式库不能做的任何事情。所以不,它没有“权限”直接调用内核模式代码,它没有这样做。
它所做的是通过内核提供的一个特殊接口来接收用户模式调用。根据版本和 CPU,这些ntdll
函数会加载几个寄存器,其中包含 (a) 表示所请求操作的 id 的数字,以及 (b) 堆栈的地址,其中包含此操作的参数。它做了一些特殊的事情(见下文),导致 CPU 转换到内核模式,并开始执行系统调用的入口点。
此代码基本上是索引上的 switch 语句,它调用正确的适当内核模式函数(并复制参数)。
“特殊的东西”ntdll
所做的要么是调用软件中断 ( int 0x2e
),要么在现代版本的 Windows 中使用专门的系统调用指令 (syscall
或sysenter
)。这两件事所做的是转换到环 0 并开始执行给定堆栈中的给定地址。不同之处在于调度中断需要查阅存储在内存中的表(IDT),而专用指令则不需要。
这就是魔法发生的地方。没有什么能真正阻止您在堆栈上准备正确的参数,使用正确的值加载 eax 和 edx 并执行int 2e
(或适用于 x64 的适当内容)。
其它你可能感兴趣的问题