-
-
[原创]刚开始学习windows驱动,分享自己做的一个小东西的理解
-
发表于:
2015-4-18 00:36
17264
-
[原创]刚开始学习windows驱动,分享自己做的一个小东西的理解
标题:初试 windows 驱动编写之 --- TDI层实现特定TCP/UDP端口的数据加密
前言:此文章中相应叙述,很多是根据自己的理解而写出,如有不准确或者错误之处,希望各位前辈们不吝指出。
一 、windows 网络体系结构及 TDI 简介 :
根据前辈们对MSDN的研究,找到一张相对完整的windows网络体系结构图(出自http://bbs.pediy.com/showthread.php?t=101794):
从图中可以看出,windows的网络结构大致分为五层:
1. 网络应用层 , 提供供用户态程序调用的网络API(包括winsock , rpc 等 )。
2. TDI 客户端层,内核模式的设备驱动程序,用于将上层的API请求转换成IRP,并发送给下层。
3.TDI Transport Provider ,TDI传送者,这部分包含协议驱动程序,即,某个协议(TCP / UDP / IP 等)的具体实现。为上层 TDI Client 提供了5个设备对象,从而使用这些协议 。
4. NDIS (Network Driver Interface Specification ),向上提供接口,供TDI 传输者和网卡驱动调用 。
5. HAL , 硬件抽象层 。
其中,TDI客户端以及TDI传送者之间,通过TDI接口,将上层的请求封装成IRP之后进行通信。
二、TDI层数据加密原理解析 :
TDI层加密,即将一个驱动程序挂接到TDI传输驱动程序Tcpip.sys所创建的三个设备对象之上,截获TDI客户和传输驱动程序之间的IRP通信。解析获取主功能码和次功能码,在对应的Dispatch例程中,可获取通信双方的IP地址,端口号,协议等五元组信息,对这些信息进行验证及筛选,将期望中的数据加密完成后,再将此IRP传递给所挂接的设备 。
具体做法是,在IRP从TDI客户端传送到TDI传送者的过程中,通过HOOK技术,改变程序流程,使IRP先经过HOOK程序,经过处理后,再继续向下传送。TDI HOOK前后程序执行及IRP流动过程如下图(图片出自《基于TDI-HOOK和NDIS-HOOK的主机防火墙研究与实现 ----徐胜 》):
那么,接下来的重点就在于,如何编写并加载自定义的TDI HOOK 驱动,并截取IRP ,从IRP中解析数据,解析数据并重新发送至TDI传输者(特定的协议设备对象)。
三、Windows NT 系列内核程序设计、编译、加载及运行:
在《寒江独钓---windows内核安全编程》一书中,简单地将windows驱动程序模型分为两种 : 将一切能够在windows 2000到vista 上运行的,未调用WDF相关的内核API函数的驱动都称为传统型驱动(包括NT式和WDM),如果调用了WDF(Windows Driver Framework)相关的内核API则称为WDF驱动。
而本文中所涉及到的TDI驱动,属于传统型驱动中的NT式驱动 。
如果应用程序开发时需要使用SDK一样,内核程序开发则使用WDK(Windows Driver Kit),各个版本的wdk都可在msdn上下载得到。
安装过程及环境变量等配置在此不再赘述。
与win32程序的winmain()以及console程序的 main()函数类似,驱动程序为入口为DriverEntry(),NT驱动的hello world版本如下 :
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课