Windows防火墙之NDIS HOOK和TDI HOOK

1、TDI HOOK

 TDI Client利用TDI接口,向TDI Server发送IRP(I/O Request Packet)请求包,来获得TDI Server提供的服务。因此,可以利用分层驱动原理[5],在TDI ClientTDI Server驱动之间加一层过滤驱动-FilterDriver.sys。对于TCP/IP协议而言,在Windows网络协议体系结构中是由Tcpip.sys驱动实现的。Tcpip.sys创建了几个设备对象,/Device/RawIp/Device/Udp/Device/Tcp/Device/Ip /Device/MULTICAST来接收TDI ClientIRP请求包。所以,我们可以在这些设备对象上挂接自己的设备对象,当TDI ClientTDI Server发送IRP包时,该IRP包首先被我们的设备对象截获并交由我们的过滤驱动FilterDriver.sys处理,如果允许这个IRP包下发就放行,否则,在我们的过滤驱动FilterDriver.sys中请求I/O管理器完成该IRP请求。TDI HOOK后结构示意图如下图:

Windows防火墙之NDIS HOOK和TDI HOOK_第1张图片

2、NDIS HOOK

 NDIS HOOK 就是通过自定义的回调例程替换NDIS wrapper 的相应函数,使得系统调用被截获的一种系统监视机制。常见实现NDIS hook 的方法是修改NDIS. sys 的导出表(export table),这种方法需要在操作系统重启后才可以生效[ 1 ]。我们提出的是一种注册假协议(fake protocol)的方法,它没有重启限制,不仅加快了开发调试,还可以方便防火墙的使用。

 Windows NT 系统内核中,所有已注册的网络协议都是通过一个单向链表来维护的。链表的节点结构为NDIS_PROTOCOL_BLOCKNDIS_PROTOCOL_CHARACTERISTICS地址就在这个结构中,NDIS_PROTOCOL_CHARACTERISTICS中保存了收包函数地址和注册网络协议时所指定的各种信息,如支持协议即插即用的回调函数地址等。每个协议驱动都对应一个NDIS_OPEN_BLOCK 结构的单向链表来维护其所绑定的适配器信息,协议驱动发送的回调函数地址就保存在这个结构中,我们只需替换这些地址就可以控制数据包的发送和接收。当驱动程序调用NdisRegisterProtocol注册新协议时,NDIS总会把新注册的协议插入协议链表的表头并返回链首指针,这样只要注册一个新的协议,就可以通过返回的链首指针来遍历系统中所有已注册的协议,进而挂接数据包的发送和接收函数。NDIS HOOK后的示意图如图4

 

Windows防火墙之NDIS HOOK和TDI HOOK_第2张图片

 

Windows防火墙之NDIS HOOK和TDI HOOK_第3张图片

 

 

 基于TDI HOOKNDIS HOOK防火墙特点

   利用TDI HOOKNDIS HOOK技术实现的主机防火墙具有以下特点:

1可以监控某个具体的进程访问网络的行为;

2可以截获进出主机的所有底层的数据包,安全性更高,不容易被绕过;

3安装更方便,无需重起系统就生效;

4编程接口简单,思路清晰,性能比较稳定;

 基于TDI-HOOKNDIS-HOOK技术的主机防火墙的实现过程

  主机防火墙的驱动程序-AigisNet.sys,实现了基于TDI HOOKNDIS HOOK技术的主机防火墙的主要功能。AigisNet.sys由三个模块组成,分别是初始化模块、过滤模块和交互模块。防火墙的整个实现过程基本上是在驱动加载之后,初始化模块先进行初始化操作。初始化成功后,过滤模块被激活,在过滤模块中,截获网络行为并与预先的规则进行匹配,如果匹配结果是允许,则允许这个网络行为发生;如果匹配结果是拒绝,则拒绝这个网络行为发生;如果匹配结果是询问,则交由交互模块处理。在交互模块中,将弹出对话框来告诉用户进程访问网络的相关信息。具体每个模块的实现过程如下:

1) 初始化模块实现过程:

(1) AigisNet.sys驱动加载后,创建三个设备对象挂接在 /Device/Tcp/Device/Udp/Device/Ip上,完成TDI HOOK

(2) 注册新协议,获得协议链首地址,然后遍历协议链对收发包函数进行勾挂,完成NDIS HOOK;

(3) 创建系统线程和队列(需要延迟交互的内容放入队列,系统线程负责维护队列)

2) 过滤模块实现过程: 

(1) TDI层主要在分发例程中,截获副功能函数代码是TDI_CONNECTIRPIRP包时,对该进程主动连出进行过滤;

(2) TDI层主要在分发例程中,截获副功能函数代码是TDI_SET_EVNET_HANDLERIRP包时,对进程打开本地端口行为进行过滤并记录下进程信息和端口信息;

(3) TDI层主要在分发例程中,截获副功能函数代码是TDI_SEND_DATAGRAIRP包时,对进程发送UDP数据包行为进行过滤;

(4) TDI层主要在分发例程中,截获副功能函数代码是TDI_RECEIVE_DATAGRAMIRP包时,对进程接收UDP数据包行为进行过滤;

(5) NDIS层的被HOOK的收发包函数中,对与收到包的TCP标志位位SYN的包进行判断,如果该包的目地端口是TDI层记录的端口则进行过滤,否则放行;

3) 交互模块实现过程:

(1) 在被HOOKTDINDIS函数中,当IRQLPASSIVE_LEVEL时,调用用户态注册的函数进行交互,同时调用KeWaitForSingleObject函数进行等待,等到用户做出响应后,程序继续往下走;

(2) 在被HOOKTDINDIS函数中,当IRQLDISPATCH_LEVEL时,把需要延迟交互的信息放入系统队列,唤醒系统线程进行处理,同时返回STATUS_PENDING;

系统线程唤醒后,取出队列中的队头信息,进行交互;

 

 

你可能感兴趣的:(windows,网络,server,网络协议,防火墙,hook)