Windows Native API(Ntdll.dll)是一个用户模式库。但是,它是与内核连接的最终用户模式库。它实际上如何与内核交互,并弥合从用户模式到内核模式的鸿沟?例如,如果我编写标准的用户模式应用程序,则无法直接调用ntoskrnl.exe函数。实际上Ntdll.dll是否直接调用ntoskrnl.exe函数?如果是这样,作为用户模式库如何拥有权限?

评论

任何应用程序都可以进行这样的调用来调用SSDT函数或仅调用Ntdll吗?

@blabb我不认为这是此问题的答案。我查看了您的其他答案,尽管它与之相关,但其中没有提及int 2e或sysenter / syscall。很好,因为它们是2个独立的问题,而您的答案是针对另一个问题的。但是,您确实在评论中回答了这一问题。如果您想详细说明答案,请放心!

#1 楼

ntdll.dll在任何意义上都不具有特权,并且无​​法执行用户模式库无法执行的任何操作。因此,不,它没有“权限”可以直接调用内核模式代码,也不可以。

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

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

ntdll的“特殊之处”是调用软件中断(int 0x2e),或者在现代Windows版本中,使用专门的指令用于系统调用(syscallsysenter)。这两种方法的作用是过渡到环0,并开始从给定堆栈执行给定地址。区别在于,调度中断需要查询存储在内存(IDT)中的表,而专用指令则不需要。

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