zoukankan      html  css  js  c++  java
  • NDIS初级理论篇(一)

    一、用户模式和内核模式

            由于安全因素等考虑,CPU由内而外的划分成四层,Ring0、Ring1、Ring2、Ring3,Ring0层的特权最高,可以执行任意的代码,Ring3层的特权最低,只能执行有限的代码。Windows的设计正是利用了CPU的这种特性,将本身分为内核模式和用户模式。用户模式工作在Ring3层,内核模式工作在Ring0层。运行在用户模式下的应用程序的访问权限受到操作系统的限制,比如不能直接访问硬件,不能直接访问其他进程的地址空间。而运行在内核模式下的程序,对操作系统和硬件设备有着直接的访问和操作的权力。Windows的核心代码和驱动程序运行在内核模式下。

            更详细的内容可以参考《Windows内核原理与实现》、《Windows内核情景分析》等书籍。

    二、Windows下网络程序设计实现技术的选择

            在用户模式下,Windows提供了windows socket、SPI等手段。如果进行网络程序设计的功能需求是开发一个Client或者简单的P2P软件,socket或许就能够满足开发的技术需求。如果软件内部想实现兼有包过滤的功能,则可以利用SPI实现。

            此外,有很多第三方机构提供了一些开发网络程序的开发库,比较著名的有ACE、libnet、WinPcap等。ACE是一个大型的网络程序开发框架,功能强大,且支持跨平台。libnet是拼装、发送原始数据包的库,大名鼎鼎的NMAP就利用了它进行数据包发送。WinPcap是将流经网卡的数据帧的副本传递到用户层,用其开发网络嗅探程序是不错的选择,但是切记,WinPcap捕获的数据包,是流经网卡数据包的一个副本,所以WinPcap并没有截获数据包的功能,常规手段下也没有中断连接的功能(非常规:比如构造一个Fin包,发出去)。

            用户层网络程序设计实现技术功能总结:可以收发数据、可以发送捕获原始数据包(libnet/winpcap),可以进行简单的包过滤,但不支持内容过滤,因此不能开发防火墙等软件。

            内核模式下,可以利用NDIS开发网络驱动程序,实现数据包的拦截、修改,向用户层应用软件提供网络传输加密等功能。也可以将自己设计的协议栈实现在这一层。NDIS功能强大,但开发难度也较大,调试过程中经常性的蓝屏、重启,因此,要掌握好调试技术。

    三、关于NDIS的一点详细介绍

            NDIS是什么,可以去百度百科,那里有十分详细的介绍。以下内容只是一点个人对NDIS的理解,从原理上讲不一定十分正确,但可能会更形象一点。

            NDIS支持三种驱动,分别是微端口驱动、中间层驱动、协议驱动。

            微端口(Miniport)驱动就是我们熟知的网卡驱动,微端口驱动的开发一般由硬件开发商提供,功能就是将一串经过曼彻斯特编码的数据帧电信号,转变成为能够让操作系统识别的数字信号。微端口为上层的驱动提供接口,可以将转变好的接收到的数据帧取走,或将上层发送来的数据经过转码后,发送到网络上,导出的接口我们暂且称之为微接口吧。

            协议(Protocol)驱动,用户层传输服务的内核层提供者,一个设计好的协议的实现通常是在这一层,一个协议驱动向下层驱动导出一个接口,用来传达下层对上层的信息。微端口接口虽然提供了将接收到的数据传递到协议驱动的功能,但协议驱动如何知道有数据接收的信息呢?这就需要微端口驱动调用协议驱动的接口了。我们也暂且称这个接口为协议接口吧。

            一个最简单的分层驱动结构就是上述两层:微端口驱动位于底层,直接与物理层交互,协议驱动位于微端口驱动之上,与微端口驱动交互。但还有这样一种驱动:中间层(Intermediate)驱动。中间层驱动位于微端口驱动和协议驱动之间,其向下伪装成协议驱动,即向微端口驱动导出协议接口并调用微端口接口,向上伪装成微端口驱动,即向协议驱动导出微端口接口并调用协议接口。中间层驱动主要用途之一就是对数据包截获和修改,此外,还可以实现VPN、NAT等功能,这些功能的实现实际上也是基于对数据包的修改。

  • 相关阅读:
    C语言 sprintf 函数 C语言零基础入门教程
    C语言 printf 函数 C语言零基础入门教程
    C语言 文件读写 fgets 函数 C语言零基础入门教程
    C语言 文件读写 fputs 函数 C语言零基础入门教程
    C语言 fprintf 函数 C语言零基础入门教程
    C语言 文件读写 fgetc 函数 C语言零基础入门教程
    C语言 文件读写 fputc 函数 C语言零基础入门教程
    C语言 strlen 函数 C语言零基础入门教程
    Brad Abrams关于Naming Conventions的演讲中涉及到的生词集解
    适配器模式
  • 原文地址:https://www.cnblogs.com/raymon/p/2394483.html
Copyright © 2011-2022 走看看