查看 Windows 系统调用如何由 OS 处理

Viewing how Windows syscalls are handled by OS

我试图弄清楚系统调用是如何在内核上执行的,关于 当遇到“系统调用”指令时内核究竟发生了什么,有什么好的解释吗?什么是查看那些内核模式回调和可能记录一些未记录的函数的方法。

基本上就是我要问的

mov eax, 23h ; NtQueryVirtualMemory
syscall      ; Any way to view what OS does, how it fills registers, sets return value etc. after executing this instruction

谢谢。

Viewing how Windows syscalls are handled by OS

了解 Windows 如何处理系统调用(以及几乎所有现代操作系统应该如何处理它们)最重要的是它们是抽象的(例如,通过库- DLL 或共享库);这样:

a) 机制是否改变并不重要 - 例如如果内核和库在内部使用 syscall 指令或 sysenter 指令,或调用门或软件中断或其他东西;或者如果在不同的计算机上使用不同的机制(由于不同的 CPU 支持不同的功能)。请注意,目前英特尔和 AMD 都对未来的“主管入口”扩展提出了建议,因此可以合理地预期(在未来的某个时候)syscall 指令将过时且不会被使用。

b)换内核没关系。例如。如果旧内核具有特定功能,但内核设计者想用具有不同参数的 newer/better 函数替换它,那么他们可以这样做,并且新库(用于新内核)可以模拟旧功能,以便更新内核(和库)时,所有旧软件都不会中断。

c) 是否是内核系统调用变得无关紧要。一个很好的例子是在 80x86 上获取当前时间的函数——如果 hardware/CPU 是旧的并且不支持“单调时间戳计数器”功能,那么 QueryPerformanceCounter() 之类的东西涉及系统调用,但是在较新的硬件上,它可以完全由库在 user-space 中完成(完全避免系统调用的开销),方法是依赖 rdtsc 指令。

出于这些原因; Microsoft 故意不记录内核的 API/system 调用(针对其内核的任何特定版本),以试图防止人们创建 can/will 破坏的狡猾软件。

对于汇编语言程序员(尤其是来自 MS-D 的程序员OS)这很烦人(因为在 DLL 中调用函数更复杂);但是这个问题没有很好的解决方案。

Any way to view what OS does, how it fills registers, sets return value etc. after executing this instruction?

您可以 运行 OS 在支持调试的虚拟机中,并一次检查一条指令的作用。但这不会有太大帮助(这将是一团混乱,不同版本的内核可能不同)。

为了向我上面的 post 添加更多信息,系统调用将在系统调用处理程序 KiSystemCall64(Shadow) 处进入内核。在这里它进行上下文切换并调用 SSDT 中的相应函数,要调用的函数的标识符存储在 EAX 中。要了解更多信息,您可以考虑进入内核并通过获取 MSR 寄存器然后更改 MSR 的 LSTAR 索引来挂接系统调用处理程序。 LSTAR 指向系统调用处理程序。您可以覆盖它以自己处理/记录它。如果您想了解更多,这可能是一个有趣的项目。