对网络编程感兴趣的朋友可能都听过 OSI 七层模型,下面一张便是在 Windows 下实现的整个协议的结构图。
Windows 下的 OSI 七层模型的实现结构 +-------------------------------+ | Ws2_32.dll | +-------------------------------+ UserMode | | +-------------------------------+ | msafd.dll | +-------------------------------+ | System Call | | File Operation | ---------------------------------------------------------------------- | | +-------------------------------+ | afd.sys | | \Device\Afd | +-------------------------------+ Kernel Mode | File Operation | | IRP | +----------------------------------------+ | tcpip.sys | ( Tdi layer ) --- 传输层 | \Device\Tcp \Device\Udp \Device\RawIp | ( Ndis Protocol ) --- 网络层 +----------------------------------------+ | Ndis lib | | | +-------------------------------+ | k57xp32.sys | ( Miniport ) --- 链路层 +-------------------------------+ | Net Interface Card | --- 物理层 +-------------------------------+
简单来讲, Windows 对网络部分的实现分为两部分,用户态部分和内核态部分。用户态部分为标准的 socket 调用,一般情况下可以认为有 ws2_32.dll 和 msafd.dll 组成,msafd.dll 为一个服务提供者,主要完成 socket 用户层的代码实现, 在内核态 socket 的实现由 afd.sys 实现,它主要创建设备 \Device\Afd 来与 msafd.dll 进行交互,完成
socket 的创建等其它操作。
tcp/ip 协议的传输层和网络层实现是在 tcpip.sys 里完成的,它主要完成两部分工作,传输层实现和网络层实现,在传输层部分完成 TCP, UDP, RawIp 的绑定,连接等功能,主要服务于 afd.sys 发下来的 TDI 命令,然后进入到网络层,来完成路由以及 IP 包的构成,网络层部分相当于一个 Ndis 协议驱动,一般来讲它会绑定所有的网卡来监听和发送 IP 包。
链路层在笔者的电脑上是由 k57xp32.sys 驱动完成,不同的网卡此驱动可能不同,它相当于一个 Ndis Miniport 驱动,和 Ndis 协议驱动一样,都是运行在 Ndis 库营造的一个运行环境中,主要完成例如以内网数据包的构成,操作网卡发送数据包,以及注册中断接收数据包以及其它信息的工作。
物理层,当然由网卡硬件来实现。
有了上面清晰的结构之后,我们要开发一些业务就会非常明白的知道它工作在哪里,比如 TDI 防火墙,就可以直接附加到 tcpip.sys 创建的几个命名设备对象上面,就可以监听到 afd.sys 发下来的 TDI 命令,进而可以拦截,一些 socket 创建,绑定,发送和接收的命令,从而完成防火墙的功能。当然,如果别人直接注册一个协议驱动,然后直接进行发包,那么这个防火墙就不能对这样的操作对待监控,比如直接发 ARP 包到局域网中,就可以造成攻击。但是如果你的防火墙工作在链表层上面,即注册一个中间层驱动来完成防火墙的功能,那么就又可以拦截掉我刚才假设的那种操作,所以如果一个 Ndis 中间层驱动来完成防火墙功能,那么就可以有更大的监控范围。再比如,想实现一个虚拟网卡,那么就可以完成一个 Ndis 小端口驱动,来让其它协议对你进行绑定,一些应用程序就可以直接选择这张网卡进行数据处理,便可完成一些特殊工作了。
总之,有多灵活的思路,就可以完成多灵活的功能。