查看操作系统如何处理 Windows 系统调用

Posted

技术标签:

【中文标题】查看操作系统如何处理 Windows 系统调用【英文标题】:Viewing how Windows syscalls are handled by OS 【发布时间】:2021-09-22 17:19:11 【问题描述】:

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

基本上我在问什么

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

谢谢。

【问题讨论】:

【参考方案1】:

查看操作系统如何处理 Windows 系统调用

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

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

b) 内核是否改变并不重要。例如。如果旧内核具有特定功能,但内核设计人员希望用具有不同参数的更新/更好的功能替换它,那么他们可以这样做,并且新库(用于新内核)可以模拟旧功能,以便所有更新内核(和库)时,旧软件不会中断。

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

出于这些原因;微软有意不记录内核的 API/系统调用(针对其内核的任何特定版本),以防止人们创建可能/将要崩溃的狡猾软件。

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

在执行这条指令后,有什么方法可以查看操作系统的功能、它如何填充寄存器、设置返回值等?

您可以在支持调试的虚拟机中运行操作系统,并检查它一次执行一条指令的功能。但这并没有多大帮助(这将是一个混乱的混乱,不同版本的内核可能会有所不同)。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于查看操作系统如何处理 Windows 系统调用的主要内容,如果未能解决你的问题,请参考以下文章

在windows中如何将本地文件放入Linux系统指定目录

Windows 如何处理无符号 64 位整数?

如何处理返回 PartialView 的 ajax 调用控制器操作中的模型状态错误

电脑安装win10时出现这个无法继续安装 如何处理

Asyncio:如何处理多个打开的文件操作系统错误

windows故障转移群集仲裁盘坏了如何处理?