第七章——Windows内核基础-内核理论基础(0环通信,内核函数,驱动加载流程)

windowsR3与R0通信
        当我们调用某个API的时候,这个API是被封装在某个DLL库中,而DLL库中的函数则是在更底层的ntdll.dll文件中,而相对应的则是调用ntdll中的Native API函数ntdll中的Native API函数是成对出现,分别以Nt和Zw开头,在ntdll中他们的本质是一样,只是名字不同。当API函数在ntdll中执行时,首先会检查参数工作,接着调用一个中断们(int 2E或者sysenter指令)从R3层进入R0层。在内核中的ntoskrnl.exe中有个一SSDT,里面存放了与ntdll中对应的SSDT系统服务处理函数,(Nt*)它们与ntdll.dll中的函数一一对应
        Ps:在进行内核开发的时候,尽量使用Zw*系列的API,这样可以减少额外的参数列表检查,从而提高效率
 
驱动与应用层的交互
        内核主要由各种驱动.sys文件组成,这些驱动有的是系统自带,有的是第三方提供,驱动加载完成后,会生成对应的设备对象,并像三环提供一个可以打开的符号链接,对应的符号链接名为"\??\C:\","\??\D:\" 等等。应用程序可以根据内核驱动的符号链接名调用CreateFile()函数打开,在获得一个句柄后,就可以将应用层程序和内核驱动进行通信。虽然操作系统是由C语言完成的,但是在操作思想背后还是有C++面向对象的支持
        内核驱动一旦执行了DriverEntry()入口函数,就可以接受三环的通信请求,在内核驱动中专门有一组分发派遣函数用来分别响应应用层的请求(进城退出,读取文件,和MFS的消息机制有点类似)
        如果我们要响应一个API函数的调用,在内核层中会有一个分发派遣的函数来负责这个请求。当我们API调用后,传递给API的数据和命令就会被IRP传递给对应的驱动分发派遣函数执行,当驱动的分发派遣函数处理完这个IRP之后,驱动就可以结束或者允许这个IRP,当然如果复杂还可以调用给下一层驱动去处理
 
 
内核函数
        windows内核部分会用调用一些内核层的函数,这些函数都是以固定的前缀开始,分别属于内核中不同的管理模块,通过这些前缀,我们就可以知道他的基本模块以及层次。
  • Ex:管理层 Executive
  • Ke:核心层 Kernel
  • HAL: 硬件抽象层
  • Ob:对象管理 Object
  • MM: 内存管理,Memory Manager
  • Ps: 进程管理 Process
  • Se: 安全管理,Security
  • Io: I/O管理
  • Fs:文件系统,File System
  • Cc:文件缓存管理,Cc表示Cache
  • Rtl:运行时程序库 Rtl是Runtime Library
  • Zw/Nt:对应SSDT中的服务函数
  • Ndis:Ndis网络框架中调用的函数
在调用内核函数的时候,需要注意他们的中断请求级别(IRQL),也就是说在不同的情况下,我们会运行在不同的IRQL上,因此不同的IRQL会调用不同的IRQL级别函数,下面罗列几种常见的级别:
  • PASSIVE_LEVEL: 这是IRQL的最低级别,没有被屏蔽的中断,所以说在这个级别上,线程执行用户模式可以访问分页内存。线程运行在该中断级别上,遇到中断响应全部会做出响应,我们用户模式的代码都是在这个上面运行
  • APC_LEVEL:这个级别只有APC级别的中断被屏蔽,可以访问分页内存,当有APC发生时,将处理器提升到APC等级,就能屏蔽其他APC,为了与APC同步,驱动程序可以手动提升级别,分页调度管理也就能运行在该级别上
  • DIRQL:Device IRQL:处于高层的驱动程序通常不会使用该IRQL级别,这个级别上所有的中断都会屏蔽,所以通常用来判断设备的有限级
 
 
内核驱动加载执行流程
        内核驱动在磁盘上的sys文件即为驱动程序,遵守PE文件格式,才能被系统加载。这里只讨论编译好的驱动在系统中是如何被加载并执行的:
  1. 创建一个服务(注册表)在注册表的Services键下创建一个与驱动名称相关的服务键,即HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servieces\Srvname。这个服务键规定了驱动的一些属性,比如StartType中的0比1先启动
  2. 对象管理器生成驱动对象,并传递给DriverEntry()。执行DriverEntry()函数,他是第一个执行的函数,类似于main()
  3. 创建控制设备对象
  4. 创建控制设备符号链接(三环)
  5. 如果是过滤驱动,则创建过滤设备并绑定
  6. 注册特定分发派遣函数
  7. 其他初始化操作,HOOK,过滤,回调框架等
 
 

猜你喜欢

转载自www.cnblogs.com/Tempt/p/10182253.html
今日推荐