#1 楼
ntdll.dll
在任何意义上都不具有特权,并且无法执行用户模式库无法执行的任何操作。因此,不,它没有“权限”可以直接调用内核模式代码,也不可以。它所做的是通过内核提供的一个特殊接口来接收用户模式调用。根据版本和CPU,
ntdll
函数使用(a)代表所请求操作的id的数字和(b)包含该操作参数的堆栈地址来加载几个寄存器。它执行了一些特殊的操作(请参见下文),导致CPU转换为内核模式,并开始执行系统调用的入口点。这段代码基本上是索引上的switch语句,其中调用正确的适当内核模式函数(并复制参数)。
ntdll
的“特殊之处”是调用软件中断(int 0x2e
),或者在现代Windows版本中,使用专门的指令用于系统调用(syscall
或sysenter
)。这两种方法的作用是过渡到环0,并开始从给定堆栈执行给定地址。区别在于,调度中断需要查询存储在内存(IDT)中的表,而专用指令则不需要。这就是发生魔术的地方。没有什么真正阻止您在堆栈上准备正确的参数,使用正确的值加载eax和edx并执行
int 2e
(或适用于x64的适当操作)的问题。
评论
任何应用程序都可以进行这样的调用来调用SSDT函数或仅调用Ntdll吗?@blabb我不认为这是此问题的答案。我查看了您的其他答案,尽管它与之相关,但其中没有提及int 2e或sysenter / syscall。很好,因为它们是2个独立的问题,而您的答案是针对另一个问题的。但是,您确实在评论中回答了这一问题。如果您想详细说明答案,请放心!