介绍
本模块解释Windows体系结构以及Windows进程和应用程序的底层内容。
Windows体系结构
运行Windows操作系统的机器内部的处理器可以在两种不同的模式下运行:用户模式和内核模式。应用程序在用户模式下运行,操作系统组件在内核模式下运行。当应用程序想要完成任务(例如创建文件)时,它不能单独完成。唯一能够完成任务的实体是内核,因此应用程序必须遵循特定的函数调用流。下图显示了此流程的高级别。
- 用户进程 – 由用户执行的程序/应用程序,如记事本、Google Chrome或Microsoft Word。
- 子系统DLL – 包含由用户进程调用的API函数的DLL。例如
kernel32.dll
导出CreateFile Windows API(WinAPI)函数,其他常见的子系统dll为ntdll.dll
、advapi32.dll
和user32.dll
。 - Ntdll.dll – 一个系统范围的dll,它是用户模式下可用的最低层。这是一个特殊的DLL,用于创建从用户模式到内核模式的转换。这通常被称为本机API或NTAPI。
- 执行内核-这就是所谓的Windows内核,它调用内核模式中可用的其他驱动程序和模块来完成任务。Windows内核部分存储在名为
n#krnl.exe
的文件中,位于“C:\Windows\System32”下。
函数调用流
下图显示了一个创建文件的应用程序示例。它从用户应用程序调用kernel32.dll
中提供的CreateFile
WinAPI函数开始。Kernel32.dll
是向WinAPI公开应用程序的关键dll,因此可以看到大多数应用程序都加载了它。接下来,CreateFile
调用其等效的NTAPI函数NtCreateFile
,该函数是通过ntdll.dll
提供的。Ntdll.dll
然后执行程序集sysenter
(x86)或syscall
(x64)指令,该指令将执行转移到内核模式。然后使用内核NtCreateFile
函数,该函数调用内核驱动程序和模块来执行请求的任务。
函数调用流程示例
此示例显示通过调试器进行的函数调用流。这是通过将调试器附加到二进制文件来完成的,该二进制文件通过CreateFileW
Windows API创建文件。
用户应用程序调用CreateFileW
WinAPI。
接下来,CreateFileW
调用其等效的NTAPI函数NtCreateFile
。
最后,NtlogFile
函数使用一条syscall
汇编指令从用户模式转换到内核模式。然后内核将是创建该文件的那个内核。
直接调用本机API(NTAPI)
需要注意的是,应用程序可以直接调用系统调用(即NTDLL函数),而无需通过Windows API。Windows API只是作为本机API的包装器。话虽如此,但原生API更难使用,因为它没有微软的官方文档。此外,微软建议不要使用原生API函数,因为它们可以在没有警告的情况下随时更改。
未来的模块将探讨直接调用Native API的好处。
暂无评论内容