我的印象是 x86 上的“int”指令没有特权。所以,我认为我们应该能够从用户空间应用程序执行这条指令。但似乎并非如此。
我正在尝试从 Windows 上的用户应用程序执行 int 。我知道这样做可能不对。但我想找点乐子。但 Windows 正在杀死我的应用程序。
我认为问题是由于条件 cpl
通常,用户模式代码转换到内核模式以调用内核服务的旧调度程序机制是通过int 2Eh
(现在替换为sysenter
). Also int 3
直到今天仍然保留断点。
基本上,内核为某些中断设置陷阱(但不记得是否为所有中断),并且根据陷阱代码,它们将为用户模式调用程序执行某些服务,或者如果不可能,您的应用程序将被杀死,因为它尝试特权操作。
无论如何,详细信息取决于您尝试调用的确切中断。功能DbgBreakPoint
(ntdll.dll
) and DebugBreak
(kernel32.dll
)除了调用之外什么都不做int 3
(或者实际上是特定的操作码int3
), 例如。
Edit 1:在较新的 Windows 版本(XP SP2 及更高版本,IIRC)上sysenter
取代int 2Eh
正如我在回答中所写。它被终止的一个可能原因 - 尽管您应该能够通过异常处理来捕获它 - 是因为您没有传递它在堆栈上期望的参数。基本上,本机 API 的用户模式部分将您调用的系统服务的参数放入堆栈中,然后将服务编号(系统服务调度程序表的索引 - SSDT,有时是 SDT)放入特定的寄存器中,然后调用在较新的系统上sysenter
在旧系统上int 2Eh
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)