导航:首页 > 净水问答 > tdi和ndis驱动过滤之我见

tdi和ndis驱动过滤之我见

发布时间:2023-11-08 07:12:38

Ⅰ 数据防泄露的技术变革

透明加密技术是近年来针对企业数据保密需求应运而生的一种数据加密技术。所谓透明,是指对使用者来说是透明的,感觉不到加密存在,当使用者在打开或编辑指定文件时,系统将自动对加密的数据进行解密,让使用者看到的是明文。保存数据的时候,系统自动对数据进行加密,保存的是密文。而没有权限的人,无法读取保密数据,从而达到数据保密的效果。

自WindowsNT问世以来,微软提出的分层的概念,使透明加密有了实现的可能。自上而下,

应用软件,应用层APIhook(俗称钩子), 文件过滤驱动,卷过滤驱动,磁盘过滤驱动,另外还有网络过滤驱动,各种设备过滤驱动。其中应用软件和应用层apihook在应用层(R3), 从文件过滤驱动开始,属于内核层(R0).

数据透明加密技术,目前为止,发展了3代,分别为

第一代APIHOOK应用层透明加密技术;

第二代文件过滤驱动层(内核)加密技术;

第三代内核级纵深加密技术

第一代:APIHOOK应用层透明加密技术

应用层透明加密技术俗称钩子透明加密技术。这种技术起源于win98时代,后来随着windows2000而流行起来。就是将上述两种技术(应用层API和Hook)组合而成的。通过windows的钩子技术,监控应用程序对文件的打开和保存,当打开文件时,先将密文转换后再让程序读入内存,保证程序读到的是明文,而在保存时,又将内存中的明文加密后再写入到磁盘中。应用层APIHOOK加密技术,特点是实现简单,缺点是可靠性差,速度超级慢,因为需要临时文件,也容易破解。但由于直接对文件加密直观感觉非常好,对于当初空白的市场来讲,这一旗号确实打动了不少企业。

第二代:文件过滤驱动加密技术

驱动加密技术是基于windows的文件系统(过滤)驱动技术,起源于WindowsNT发布之后,其工作在windows的内核层,处于应用层APIHook的下面,卷过滤和磁盘过滤的上面。设计思想是建立当应用程序(进程)和文件格式(后缀名)进行关联,当用户操作某种后缀文件时对该文件进行加密解密操作,从而达到加密的效果。

内核层文件过滤驱动技术,分IFS和Minifilter2类。IFS出现较早,Minfilter出现在xp以后。两者的区别可以理解为VC++和MFC的区别,IFS很多事情需要自己处理,而Minifilter是微软提供了很多成熟库,直接用。由于windows文件保存的时候,存在缓存,并不是立即写入文件,所以根据是否处理了双缓bug,后来做了些细分,但本质还是一样,都是问题的修正版本而已。但由于工作在受windows保护的内核层,运行速度比APIHOOK加密速度快,解决了很多问题和风险。

文件过滤驱动技术实现相对简单,但稳定性一直不太理想。

第三代:内核级纵深沙盒加密技术

之所以叫内核级纵深沙盒加密技术,主要原因是使用了磁盘过滤驱动技术,卷过滤驱动技术,文件过滤驱动技术,网络过滤驱动(NDIS/TDI)技术等一系列内核级驱动技术,从上到下,纵深防御加密。该技术也起源于WindowsNT之后,但由于技术复杂,开发要求高,公开资料少,而发展较慢。但随着微软公布了部分Windows源代码之后,此技术开始逐渐成熟。内核级沙盒加密,是当使用者操作涉密数据的时候,对其存储过程进行控制,对其结果进行加密保存,每个模块只做自己最擅长的那块,所以非常稳定。加密的沙盒是个容器,把涉密软件,文件扔到容器中加密。而这个容器是透明的,使用者感觉不到它的存在。,

第三代透明加密技术的特点是,涉密数据使用前,先初始化涉密沙盒,沙盒加密一旦成功,之后所有的数据都是数据实体,不针对文件个体,所以无数据破损等问题。特点是速度快,稳定。

第一代,第二代本质都是采用的针对单个文件实体进行加密,如a.txt内容为1234, 加密后变成@#$%% +标记。@#$%%是把原文1234进行加密之后的密文。而标记的用途是用来区分一个a.txt文件是否是已经被加密。当系统遇到一个文件的时候,首先判断这个标记是否存在,如果存在,表明是被系统加密过的,则走解密读取流程,如果不是加密的,就无需解密,直接显示给使用者,只是当保存的时候,再进行加密,使其成文密文+标记。

这就带来一个巨大的风险 :如果是一个较大文件,加密过程中发生异常,标记没加上,那么下次读这个文件的时候,因为没有读到表记,而采用原文读取,然后再加密,那么这个文件就彻底毁坏了。这个现象在第一代APIHOOK透明加密技术的产品中特别明显,在第二代文件过滤驱动产品中,因为速度变快了,使文件破损发生概率减低了很多,但并没有本质解决这个问题。

另外, 由于是进程和文件后缀名进行关联,也造成了一个缺陷 :很多编程类软件,复杂制图软件的编译,晒图等操作,都是很多进程同时操作某个文件,这个时候进行进程和文件关联显然太牵强了,因为进程太多了。即使进行关联,多个进程交替访问文件,加密解密混在一起,极容易造成异常。所以才会出现VC等环境下如不能编译,调试等。

其他方面,版本管理无法对比,服务器上存放的是密文(服务器存密文,是个极大的风险,目前没有哪家大企业敢这么做,毕竟太依赖加密软件,持续性没有了),大文件速度慢等,一系列问题,无法解决。

而第三代内核纵深加密技术是在前者2个基础之上发展而来的,每个过滤层都只做自己最擅长的事情,所以特别稳定,速度快,性能可靠,不存在第一代和第二代的问题。由于内核级纵深透明加密技术要求高,涉及技术领域广,极其复杂,开发周期长,所以国内的能做开发的厂商不多。目前, 深信达公司推出的SDC机密数据保密系统, 给人一眼前一亮的感觉,其产品是第三代透明加密保密技术的典型产品,其产品主要特点是:

1)采用了磁盘过滤,卷过滤,文件过滤,网络过滤等一系列纵深内核加密技术,采用沙盒加密,和文件类型和软件无关,沙盒是个容器。

2)在操作涉密数据的同时,不影响上外网,QQ,MSN等。

3)保密彻底,包括网络上传,邮件发送,另存,复制粘贴,屏幕截取等,特别是屏幕保密,做得非常炫。

4)服务上存放的是明文,客户端存放的是密文,文件上传服务器自动解密,到达客户端自动加密。服务器上明文,减少了业务连续性对加密软件的依赖。

5)不但可以针对普通文档图纸数据进行保密需求,同时更是研发性质的软件公司( 游戏 ,通讯,嵌入式,各种BS/CS应用系统)源代码保密首选。

Ⅱ 寒江独钓:Windows内核安全编程的图书目录

第1章 内核上机指导 1
Windows内核编程的动手有点麻烦,并不是仅仅安装一个独立的软件(比如VC)之后就可以安然地开始编写代码,然后运行了。需要下载开发包、配置开发环境、准备调试工具,可能还需要一些小工具协同工作。这一步拦住了不少的初学者。本章以详细图文攻略,来引导读者完成这一麻烦的步骤。
1.1 下载和使用WDK 2
1.1.1 下载安装WDK 2
1.1.2 编写第一个C文件 3
1.1.3 编译一个工程 5
1.2 安装与运行 6
1.2.1 下载一个安装工具 6
1.2.2 运行与查看输出信息 7
1.2.3 在虚拟机中运行 9
1.3 调试内核模块 9
1.3.1 下载和安装WinDbg 9
1.3.2 设置Windows XP调试执行 10
1.3.3 设置Vista调试执行 11
1.3.4 设置VMWare的管道虚拟串口 11
1.3.5 设置Windows内核符号表 13
1.3.6 实战调试first 14
练习题 16
第2章 内核编程环境及其特殊性 17
编写过驱动程序的读者可能会很熟悉这一切,但是对只从事过应用程序的读者而言,要理解内核编程环境的特殊性,就很需要一些功夫和悟性了。在应用程序中,多线程的情况已经带来了一定理解的困难;而内核代码呢?几乎无时无刻不运行在多线程之下。它从哪里开始?从哪里结束?它在什么进程内运行?这些问题一言难尽。
2.1 内核编程的环境 18
2.1.1 隔离的应用程序 18
2.1.2 共享的内核空间 19
2.1.3 无处不在的内核模块 20
2.2 数据类型 21
2.2.1 基本数据类型 21
2.2.2 返回状态 22
2.2.3 字符串 23
2.3 重要的数据结构 23
2.3.1 驱动对象 23
2.3.2 设备对象 25
2.3.3 请求 26
2.4 函数调用 28
2.4.1 查阅帮助 28
2.4.2 帮助中有的几类函数 30
2.4.3 帮助中没有的函数 32
2.5 Windows的驱动开发模型 32
2.6 WDK编程中的特殊点 33
2.6.1 内核编程的主要调用源 33
2.6.2 函数的多线程安全性 34
2.6.3 代码的中断级 36
2.6.4 WDK中出现的特殊代码 37
练习题 38
第3章 串口的过滤 40
在安全软件的开发中,串口驱动的应用并不常见。但是本书以串口驱动作为第一个介绍的实例。为何?仅仅是因为串口简单。从简单的例子入手,可以为读者带来稍许轻松的感受。
3.1 过滤的概念 41
3.1.1 设备绑定的内核API之一 41
3.1.2 设备绑定的内核API之二 43
3.1.3 生成过滤设备并绑定 43
3.1.4 从名字获得设备对象 45
3.1.5 绑定所有串口 46
3.2 获得实际数据 47
3.2.1 请求的区分 47
3.2.2 请求的结局 48
3.2.3 写请求的数据 49
3.3 完整的代码 50
3.3.1 完整的分发函数 50
3.3.2 如何动态卸载 52
3.3.3 完整的代码 53
本章的示例代码 53
练习题 54
第4章 键盘的过滤 56
键盘是很重要的输入设备!这是因为我们用键盘录入信息、用键盘输入密码,甚至用键盘编程,也用键盘著书立说。对于黑客来说,使用庞大的计算机资源去破解那些坚不可摧的加密算法,哪如偷偷地记下用户用键盘输入的密钥更加简单呢?本章专注于键盘的保护。
4.1 技术原理 57
4.1.1 预备知识 57
4.1.2 Windows中从击键到内核 58
4.1.3 键盘硬件原理 60
4.2 键盘过滤的框架 61
4.2.1 找到所有的键盘设备 61
4.2.2 应用设备扩展 64
4.2.3 键盘过滤模块的DriverEntry 65
4.2.4 键盘过滤模块的动态卸载 66
4.3 键盘过滤的请求处理 68
4.3.1 通常的处理 68
4.3.2 PNP的处理 69
4.3.3 读的处理 70
4.3.4 读完成的处理 71
4.4 从请求中打印出按键信息 72
4.4.1 从缓冲区中获得KEYBOARD_INPUT_DATA 72
4.4.2 从KEYBOARD_INPUT_DATA中得到键 73
4.4.3 从MakeCode到实际字符 74
4.5 Hook分发函数 75
4.5.1 获得类驱动对象 76
4.5.2 修改类驱动的分发函数指针 77
4.5.3 类驱动之下的端口驱动 78
4.5.4 端口驱动和类驱动之间的协作机制 79
4.5.5 找到关键的回调函数的条件 80
4.5.6 定义常数和数据结构 80
4.5.7 打开两种键盘端口驱动寻找设备 81
4.5.8 搜索在KbdClass类驱动中的地址 83
4.6 Hook键盘中断反过滤 86
4.6.1 中断:IRQ和INT 86
4.6.2 如何修改IDT 87
4.6.3 替换IDT中的跳转地址 88
4.6.4 QQ的PS/2反过滤措施 90
4.7 利用IOAPIC重定位中断处理函数 90
4.7.1 什么是IOAPIC 90
4.7.2 如何访问IOAPIC 91
4.7.3 编程修改IOAPIC重定位表 92
4.7.4 插入新的中断处理 93
4.7.5 驱动入口和卸载的实现 95
4.8 直接用端口操作键盘 96
4.8.1 读取键盘数据和命令端口 96
4.8.2 p2cUserFilter的最终实现 97
本章的示例代码 98
练习题 99
第5章 磁盘的虚拟 100
CPU是计算机的核心,但是它不保存信息。如果它被窃,我们可以简单地购买一个新的。但是如果装满了机密信息的硬盘被窃了,那可就不是买一个新的就能弥补得了的。本章介绍硬盘内核魔术:虚拟硬盘。虚拟硬盘可以不被盗窃者利用吗?良好的设计可以做到这一点。
5.1 虚拟的磁盘 101
5.2 一个具体的例子 101
5.3 入口函数 102
5.3.1 入口函数的定义 102
5.3.2 Ramdisk驱动的入口函数 103
5.4 EvtDriverDeviceAdd函数 104
5.4.1 EvtDriverDeviceAdd的定义 104
5.4.2 局部变量的声明 105
5.4.3 磁盘设备的创建 105
5.4.4 如何处理发往设备的请求 107
5.4.5 用户配置的初始化 108
5.4.6 链接给应用程序 110
5.4.7 小结 111
5.5 FAT12/16磁盘卷初始化 111
5.5.1 磁盘卷结构简介 111
5.5.2 Ramdisk对磁盘的初始化 113
5.6 驱动中的请求处理 119
5.6.1 请求的处理 119
5.6.2 读/写请求 120
5.6.3 DeviceIoControl请求 122
5.7 Ramdisk的编译和安装 124
5.7.1 编译 124
5.7.2 安装 125
5.7.3 对安装的深入探究 125
练习题 126
第6章 磁盘过滤 127
很多网吧的老板、公司的IT管理部门以及读者自己都很厌恶硬盘总是被病毒和木马搞得一团糟。一些简单的还原软件可以搞定这个问题:重启之后,对硬盘的修改都奇迹般地消失了。这是怎么实现的呢?本章告诉您答案。
6.1 磁盘过滤驱动的概念 128
6.1.1 设备过滤和类过滤 128
6.1.2 磁盘设备和磁盘卷设备过滤驱动 128
6.1.3 注册表和磁盘卷设备过滤驱动 129
6.2 具有还原功能的磁盘卷过滤驱动 129
6.2.1 简介 129
6.2.2 基本思想 130
6.3 驱动分析 130
6.3.1 DriverEntry函数 130
6.3.2 AddDevice函数 132
6.3.3 PnP请求的处理 136
6.3.4 Power请求的处理 140
6.3.5 DeviceIoControl请求的处理 140
6.3.6 bitmap的作用和分析 144
6.3.7 boot驱动完成回调函数和稀疏文件 150
6.3.8 读/写请求的处理 152
6.3.9 示例代码 160
6.3.10 练习题 161
第7章 文件系统的过滤与监控 162
硬盘是硬盘,而文件系统是文件系统,可是有的人总是把它们当做一回事。其实硬盘很简单,硬盘就是一个很简单的保存信息的盒子;而复杂的是文件系统,它很精妙地把简单的数据组织成复杂的文件。作为信息安全的专家,我们当然不能让文件系统脱离我们的控制之外。
7.1 文件系统的设备对象 163
7.1.1 控制设备与卷设备 163
7.1.2 生成自己的一个控制设备 165
7.2 文件系统的分发函数 166
7.2.1 普通的分发函数 166
7.2.2 文件过滤的快速IO分发函数 167
7.2.3 快速IO分发函数的一个实现 169
7.2.4 快速IO分发函数逐个简介 170
7.3 设备的绑定前期工作 172
7.3.1 动态地选择绑定函数 172
7.3.2 注册文件系统变动回调 173
7.3.3 文件系统变动回调的一个实现 175
7.3.4 文件系统识别器 176
7.4 文件系统控制设备的绑定 177
7.4.1 生成文件系统控制设备的过滤设备 177
7.4.2 绑定文件系统控制设备 178
7.4.3 利用文件系统控制请求 180
7.5 文件系统卷设备的绑定 183
7.5.1 从IRP中获得VPB指针 183
7.5.2 设置完成函数并等待IRP完成 184
7.5.3 卷挂载IRP完成后的工作 187
7.5.4 完成函数的相应实现 190
7.5.5 绑定卷的实现 191
7.6 读/写操作的过滤 193
7.6.1 设置一个读处理函数 193
7.6.2 设备对象的区分处理 194
7.6.3 解析读请求中的文件信息 195
7.6.4 读请求的完成 198
7.7 其他操作的过滤 202
7.7.1 文件对象的生存周期 202
7.7.2 文件的打开与关闭 203
7.7.3 文件的删除 205
7.8 路径过滤的实现 206
7.8.1 取得文件路径的3种情况 206
7.8.2 打开成功后获取路径 207
7.8.3 在其他时刻获得文件路径 209
7.8.4 在打开请求完成之前获得路径名 209
7.8.5 把短名转换为长名 211
7.9 把sfilter编译成静态库 212
7.9.1 如何方便地使用sfilter 212
7.9.2 初始化回调、卸载回调和绑定回调 213
7.9.3 绑定与回调 215
7.9.4 插入请求回调 216
7.9.5 如何利用sfilter.lib 218
本章的示例代码 221
练习题 221
第8章 文件系统透明加密 223
如何阻止企业的机密文件被主动泄密,但是又不用关闭网络、禁止U盘等手段重重束缚大家?很多迹象表明,文件系统透明加密是最优的选择。既然从前一章读者已经学会了控制文件系统,那么现在,该是我们摩拳擦掌,用它来保护我们的机密信息的时候了。
8.1 文件透明加密的应用 224
8.1.1 防止企业信息泄密 224
8.1.2 文件透明加密防止企业信息泄密 224
8.1.3 文件透明加密软件的例子 225
8.2 区分进程 226
8.2.1 机密进程与普通进程 226
8.2.2 找到进程名字的位置 227
8.2.3 得到当前进程的名字 228
8.3 内存映射与文件缓冲 229
8.3.1 记事本的内存映射文件 229
8.3.2 Windows的文件缓冲 230
8.3.3 文件缓冲:明文还是密文的选择 232
8.3.4 清除文件缓冲 233
8.4 加密标识 236
8.4.1 保存在文件外、文件头还是文件尾 236
8.4.2 隐藏文件头的大小 237
8.4.3 隐藏文件头的设置偏移 239
8.4.4 隐藏文件头的读/写偏移 240
8.5 文件加密表 241
8.5.1 何时进行加密操作 241
8.5.2 文件控制块与文件对象 242
8.5.3 文件加密表的数据结构与初始化 243
8.5.4 文件加密表的操作:查询 244
8.5.5 文件加密表的操作:添加 245
8.5.6 文件加密表的操作:删除 246
8.6 文件打开处理 248
8.6.1 直接发送IRP进行查询与设置操作 248
8.6.2 直接发送IRP进行读/写操作 250
8.6.3 文件的非重入打开 252
8.6.4 文件的打开预处理 255
8.7 读写加密/解密 260
8.7.1 在读取时进行解密 260
8.7.2 分配与释放MDL 261
8.7.3 写请求加密 262
8.8 crypt_file的组装 265
8.8.1 crypt_file的初始化 265
8.8.2 crypt_file的IRP预处理 266
8.8.3 crypt_file的IRP后处理 269
本章的示例代码 272
练习题 272
第9章 文件系统微过滤驱动 273
从来都不原地踏步的微软,早就准备好了下一代的文件系统过滤的框架、文档、代码例子。虽然本书的前两章的范例在Windows 7上都还可以正常运行,但是如果不学习一下最新的接口,读者一定会觉得不自在。但是读者可以放心,在前面学习的基础上,了解新的接口是易如反掌的。
9.1 文件系统微过滤驱动简介 274
9.1.1 文件系统微过滤驱动的由来 274
9.1.2 Minifilter的优点与不足 275
9.2 Minifilter的编程框架 275
9.2.1 微文件系统过滤的注册 276
9.2.2 微过滤器的数据结构 277
9.2.3 卸载回调函数 280
9.2.4 预操作回调函数 281
9.2.5 后操作回调函数 284
9.2.6 其他回调函数 285
9.3 Minifilter如何与应用程序通信 288
9.3.1 建立通信端口的方法 288
9.3.2 在用户态通过DLL使用通信端口的范例 290
9.4 Minifilter的安装与加载 292
9.4.1 安装Minifilter的INF文件 293
9.4.2 启动安装完成的Minifilter 294
本章的示例代码 295
练习题 295
第10章 网络传输层过滤 296
笔者常常使用防火墙,它们看上去真的很神奇。如果怀疑自己的机器上有见不得人的进程打开了网络端口盗走机密信息,防火墙将提醒您,虽然防火墙并不知道它是否是一个木马。这是怎么做到的?本章为您揭晓谜底。
10.1 TDI概要 297
10.1.1 为何选择TDI 297
10.1.2 从socket到Windows内核 297
10.1.3 TDI过滤的代码例子 299
10.2 TDI的过滤框架 299
10.2.1 绑定TDI的设备 299
10.2.2 唯一的分发函数 300
10.2.3 过滤框架的实现 302
10.2.4 主要过滤的请求类型 304
10.3 生成请求:获取地址 305
10.3.1 过滤生成请求 305
10.3.2 准备解析IP地址与端口 307
10.3.3 获取生成的IP地址和端口 308
10.3.4 连接终端的生成与相关信息的保存 310
10.4 控制请求 311
10.4.1 TDI_ASSOCIATE_ADDRESS的过滤 311
10.4.2 TDI_CONNECT的过滤 313
10.4.3 其他的次功能号 314
10.4.4 设置事件的过滤 316
10.4.5 TDI_EVENT_CONNECT类型的设置事件的过滤 318
10.4.6 直接获取发送函数的过滤 320
10.4.7 清理请求的过滤 322
10.5 本书例子tdifw.lib的应用 323
10.5.1 tdifw库的回调接口 323
10.5.2 tdifw库的使用例子 325
本章的示例代码 326
练习题 327
第11章 NDIS协议驱动 328
网络的连接只是外表而已,实际上,最终它们变成了一个个在网线上往返的网络包。高明的黑客是不会去用Socket来生成连接的。把黑暗的信息隐藏在单个的数据包里,你还可以发现它们吗?本章介绍的NDIS协议驱动,是Windows网络抓包工具的基础。
11.1 以太网包和网络驱动架构 329
11.1.1 以太网包和协议驱动 329
11.1.2 NDIS网络驱动 330
11.2 协议驱动的DriverEntry 331
11.2.1 生成控制设备 331
11.2.2 注册协议 333
11.3 协议与网卡的绑定 335
11.3.1 协议与网卡的绑定概念 335
11.3.2 绑定回调处理的实现 335
11.3.3 协议绑定网卡的API 338
11.3.4 解决绑定竞争问题 339
11.3.5 分配接收和发送的包池与缓冲池 340
11.3.6 OID请求的发送和请求完成回调 342
11.3.7 ndisprotCreateBinding的最终实现 345
11.4 绑定的解除 351
11.4.1 解除绑定使用的API 351
11.4.2 ndisprotShutdownBinding的实现 353
11.5 在用户态操作协议驱动 356
11.5.1 协议的收包与发包 356
11.5.2 在用户态编程打开设备 357
11.5.3 用DeviceIoControl发送控制请求 358
11.5.4 用WriteFile发送数据包 360
11.5.5 用ReadFile发送数据包 362
11.6 在内核态完成功能的实现 363
11.6.1 请求的分发与实现 363
11.6.2 等待设备绑定完成与指定设备名 364
11.6.3 指派设备的完成 365
11.6.4 处理读请求 368
11.6.5 处理写请求 370
11.7 协议驱动的接收回调 374
11.7.1 和接收包有关的回调函数 374
11.7.2 ReceiveHandler的实现 376
11.7.3 TransferDataCompleteHandler的实现 380
11.7.4 ReceivePacketHandler的实现 381
11.7.5 接收数据包的入队 383
11.7.6 接收数据包的出队和读请求的完成 385
本章的示例代码 388
练习题 389
第12章 NDIS小端口驱动 390
如果厌烦了漏洞百出的以太网,还有什么可以充当我的网络接口吗?当然,一切能通信的设备,皆有替代以太网的潜质。即使您不愿意修改无数通过TCP接口编程的应用程序,我们依然可以用其他通信设备来虚拟网卡。本章介绍小端口驱动来虚拟网卡的技术。
12.1 小端口驱动的应用与概述 391
12.1.1 小端口驱动的应用 391
12.1.2 小端口驱动的实例 392
12.1.3 小端口驱动的运作与编程概述 393
12.2 小端口驱动的初始化 393
12.2.1 小端口驱动的DriverEntry 393
12.2.2 小端口驱动的适配器结构 396
12.2.3 配置信息的读取 397
12.2.4 设置小端口适配器上下文 398
12.2.5 MPInitialize的实现 399
12.2.6 MPHalt的实现 402
12.3 打开ndisprot设备 403
12.3.1 I/O目标 403
12.3.2 给IO目标发送DeviceIoControl请求 404
12.3.3 打开ndisprot接口并完成配置设备 406
12.4 使用ndisprot发送包 409
12.4.1 小端口驱动的发包接口 409
12.4.2 发送控制块(TCB) 409
12.4.3 遍历包组并填写TCB 412
12.4.4 写请求的构建与发送 415
12.5 使用ndisprot接收包 417
12.5.1 提交数据包的内核API 417
12.5.2 从接收控制块(RCB)提交包 418
12.5.3 对ndisprot读请求的完成函数 420
12.5.4 读请求的发送 422
12.5.5 用于读包的WDF工作任务 424
12.5.6 ndisedge读工作任务的生成与入列 426
12.6 其他的特征回调函数的实现 428
12.6.1 包的归还 428
12.6.2 OID查询处理的直接完成 429
12.6.3 OID设置处理 432
本章的示例代码 433
练习题 434
第13章 NDIS中间层驱动 435
当我们不满足于抓包和发包,而试图控制本机上流入和流出的所有数据包的时候,NDIS中间层驱动是最终的选择。防火墙的功能在这里得到加强:我们不再满足于看到连接、端口、对方IP地址,而是要看到每一个数据包的原始结构。本章介绍NDIS中间层驱动。
13.1 NDIS中间层驱动概述 436
13.1.1 Windows网络架构总结 436
13.1.2 NDIS中间层驱动简介 437
13.1.3 NDIS中间层驱动的应用 438
13.1.4 NDIS包描述符结构深究 439
13.2 中间层驱动的入口与绑定 442
13.2.1 中间层驱动的入口函数 442
13.2.2 动态绑定NIC设备 443
13.2.3 小端口初始化(MpInitialize) 445
13.3 中间层驱动发送数据包 447
13.3.1 发送数据包原理 447
13.3.2 包描述符“重利用” 448
13.3.3 包描述符“重申请” 451
13.3.4 发送数据包的异步完成 453
13.4 中间层驱动接收数据包 455
13.4.1 接收数据包概述 455
13.4.2 用PtReceive接收数据包 456
13.4.3 用PtReceivePacket接收 461
13.4.4 对包进行过滤 463
13.5 中间层驱动程序查询和设置 466
13.5.1 查询请求的处理 466
13.5.2 设置请求的处理 468
13.6 NDIS句柄 470
13.6.1 不可见的结构指针 470
13.6.2 常见的NDIS句柄 471
13.6.3 NDIS句柄误用问题 473
13.6.4 一种解决方案 475
13.7 生成普通控制设备 476
13.7.1 在中间层驱动中添加普通设备 476
13.7.2 使用传统方法来生成控制设备 478
本章的示例代码 483
练习题 483
附录A 如何使用本书的源码光盘 485

Ⅲ 遇到流氓软件应该怎么解决

预防 防范流氓软件第一步,就是要有安全的上网意识,不要轻易登陆不了解的网站,因为这样很有可能会中网页脚本病毒,从而使系统中上流氓软件。不要随便下载不熟悉的软件,如果用户不了解这些软件,当这些软件中捆绑一些流氓软件时,用户也无法察觉。安装软件时应仔细阅读软件附带的用户协议及使用说明,有些软件在安装的过程中会以不引起用户注意的方式提示用户要安装流氓软件,这时如果用户不认真看提示的话,就会安装上流氓软件,由于这是用户自己选择的,因此,用户不会受到保护。 在安装操作系统后,应该先上网给系统打补丁,补住一些已知漏洞,这样能够避免利用已知漏洞的流氓软件的驻留。如果用户使用IE浏览器上网,则应该将浏览器的安全级别调到中高级别,或者在自定义里,将ACTIVEX控件、脚本程序都禁止执行,这样能够防止一些隐藏在网页中的流氓软件的入侵。判断 第二步,判断自己是否已经中了流氓软件。这要根据流氓软件的中招症状来看。一般地,浏览器首页被无故修改、总是弹出广告窗口、CPU的资源被大量占用、系统变得很慢、浏览器经常崩溃、或出现找不到某个DLL文件的提示框,这些是流氓软件最常见的现象,如果发现计算机中出现这些现象,则很有可能是中了流氓软件,就要采取相应的措施,而如果出现CPU的资源被大量占用,系统变得很慢这样的情况,则很有可能是中了多种流氓软件的原因,更应该尽快进行相应处理。 确诊自己中了流氓软件 氓软件无论多么复杂,它们的传播流程几乎是一样的,都是会通过软件捆绑或网页下载先进入到计算机的一个临时目录里,一般是是系统的根目录或者系统默认的临时目录,然后将自己激活,这时流氓软件进入内存中正常运行。当流氓软件正常运行时,为了下一次能够自动运行,它们往往会修改注册表的自启动项,从而达到自动启动的目的。然后流氓软件会将自己拷贝到系统目录隐藏起来,然后将临时的安装文件删除,最后jian听系统端口,进行各种各样的流氓行为。 如果用户喜欢下载安装一些小的工具软件,或者去一些小的网站上浏览网页,虽然计算机没有出现上述现象,但是也有可能中流氓软件,这时也应该关注一下计算机,看是否真正中招,这时就可以按照流氓软件的这个传播链去一一排查。首先利用一些第三方的内存查看工具,看看内存中是否有一些可疑的进程或线程,这需要用户对系统中的进程或一些常用软件的进程有所了解,这样才有可能看出问题。其次,用户在查看进程的过程中应该看看这些进程的路径,如果有一些进程的路径不是正常的安装目录,而是系统的临时目录,那八成是流氓软件。 另外,用户还要看看注册表里(开始菜单的运行框里键入REGEDIT)的自启动项(HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run)里是否有一些用户不认识的程序键值,这些很可能就是流氓软件建立的。行动 确诊自己中了流氓软件,清除就相对比较简单了。对于已知的流氓软件,建议用户用专门的清除工具进行清除。 在这里不建议用 户自己手工清除流氓软件,因为流氓软件越来越复杂,已经不再是那种简单的删除多个文件就能解决的了,很多流氓软件在进入系统之前,就对系统进行了修改和关联,当用户擅自删除流氓软件文件时,系统无法回复到最初的那个状态,而导致流氓软件虽然清除了,但系统也总是出现各种错误。而专业的清除工具往往已经考虑到这一点,能够帮助用户完全恢复系统。 如果在一些特殊场合用户需要手动清除流氓软件时,则按照流氓软件的传播链条,按照先删除内存的进程,再删除注册表中的键值,最后再删除流氓软件体,将系统配置修改为默认属性 这样一个过程进行处理。

Ⅳ 个人防火墙的数据类型

用户态(user-mode)和内核态(kernel-mode)。
1)用户态(user-mode)。
在用户态下进行网络数据包的拦截有三种方法:WinsockLayeredServiceProvider(LSP)、Windows2000包过滤接口、替换系统自带的WINSOCK动态连接库。在用户态下
进行数据包拦截最致命的缺点就是只能在Winsock层次上进行,而对于网络协议栈中底层协议的数据包无法进行处理。因此,这些方法并不适合个人防火墙。
2)内核态(kernel-mode)。
a)TDI过滤驱动程序(TDIFilterDriver)。当应用程序要发送或接收网络数据包的时候,都是通过与协议驱动所提供的接口来进行的。协议驱动提供了一套系统预定义的标准接口来和应用程序之间进行交互。因此,只需要开发一个过滤驱动来截获这些交互的接口,就可以实现网络数据包的拦截。在Windows2000/NT下,ip,tcp,udp是在一个驱动程序里实现的,叫做tcp.sys,这个驱动程序创建了5个设备:DeviceRawIp,DeviceUdp,DeviceTcp,DeviceIp,DeviceMULTICAST。应用程序所有的网络数据操作都是通过这些设备进行的。因此,我们只需要开发一个过滤驱动来截获这些交互的接口,就可以实现网络数据包的拦截。另外,TDI层的网络数据拦截还可以得到操作网络数据包的进程详细信息,这也是个人防火墙的一个重要功能。但是,TDI传输驱动程序有一个缺陷,TDIFilterdriver属于Upperdriver,位于TcpIP.sys之上,这就意味着由TcpIP.sys接收并处理的数据包不会传送到上层,从而无法过滤某些接收的数据包,例如ICMP包。ICMP的应答包直接由TcpIP.sys生成并回应,而上面的过滤驱动程序全然不知。另外,该方法需要在系统核心层编写驱动程序,需要编写人员对Windows操作核心层的工作机制非常熟悉,同时,驱动程序对代码质量要求非常高,稍有不慎就会使系统崩溃,
b)Win2kFilter-HookDriver。这是从Windows2000开始系统所提供的一种驱动程序,该驱动程序主要是利用Ipfiltdrv.sys所提供的功能来拦截网络数据包。Filter-HookDriver的结构非常简单,易于实现。但是正因为其结构过于简单,并且依赖于Ipfiltdrv.sys,Microsoft并不推荐使用Filter-HookDriver。
c)NDISHookDriver。该方法在Windows2000/xp下是非公开的,因此这种方法对平台的依赖性比较大,需要在程序中判断不同的操作系统版本而使用不同的方法。
d)NDIS中间层驱动程序(NDISIntermediateDriver)。NDIS()是Microsoft和3Com公司开发的网络驱动程序接口规范的简称,它支持如下三种类型的网络驱动程序:微端口驱动程序、中间层驱动程序(IntermediateDriver)和协议驱动程序。其中中间层驱动介于协议层驱动和小端口驱动之间,其功能非常强大,可以提供多种服务,能够截获所有的网络数据包(以太帧),过滤微端口驱动程序,实现特定的协议或其他诸如数据包加密、认证等功能。综上所述,在NDIS中间层进行网络数据包截获的方法结构规范,功能强大,该技术极其适合个人防火墙所采用。
中间层驱动程序(NDIS)的内部结构
NDIS支持3种驱动:微端口驱动,中间层驱动和协议驱动。
1) 微端口驱动。就是网卡驱动,它负责管理网卡,包括通
过网卡发送和接受数据,它也为上层驱动提供接口。
2) 中间层驱动。它通常位于微端口驱动和传输协议驱动之间,是基于链路层和网络层之间的驱动,由于中间层驱动在驱动层次中的中间层位置,它必须与其上层的协议和下层的微端口驱动通信,并且导出两种协议的函数。虽然中间层驱动导出MINIPORTXX函数,但它并不真正的管理物理网卡,而是导出一个或者多个虚拟适配器,上层协议可以绑定到上面。对于协议驱动来说,中间层导出的虚拟适配器看起来像一个物理网卡,当它向这个虚拟适配器发送封包或者请求时,中间层驱动将这些封包和请求传播到下层微端口驱动;当下层微端口驱动向上指示接收封包或者状态时,中间层驱动向上到绑定虚拟适配器上的协议驱动。中间层驱动的主要作用就是过滤封包,其优点是能够截获所有的网络数据包。
3) 协议驱动,即网络协议。它位于NDIS体系的最高层,经常用作实现传输协议堆栈的传输驱动中的最底层驱动。传输协议驱动申请封包,从发送应用程序将数据复制到封包中,通过调用NDIS函数将这些封包发送到下层驱动。协议驱动也是提供了一个协议接口来接收来自下层驱动的封包。传输协议驱动将收到的封包传递给相应的客户应用程序。在下层,协议驱动与中间层微端口驱动交互。协议驱动调用NDISXX函数发送封包,读取和设置下层驱动维护的信息,使用操作系统服务。协议驱动也要导出一系列的入口点,NDIS调用它来指示封包的接受,指示下层驱动的状态,或者是和其他协议驱动的通信。
中间层内部的工作流程
1) 中间层对数据包的管理
中间层驱动程序从高层驱动程序接收数据包描述符,并在网络上发送,该包描述符与一个或多个链式数据缓冲区相关联。中间层驱动程序能够对数据进行重新打包,并使用新的数据包描述符进行数据传输,也可以直接将数据包传递给低层驱动程序,如果驱动程序下边界面向无连接,可调用NdisSend或NdisSendPackets函数完成该功能,如果驱动程序下边界是面向连接的,可调用NdisCoSendPackets函数完成此项功能。中间层驱动程序也可以进行一些操作改变链式缓冲区的内容,或者调整内入数据包相对于其他发送任务的发送次序或发送定时。但是,即使中间层驱动程序只是向下层传递上层引入的数据报,例如,仅仅只是对数据包进行计数,也必须分配新的数据包描述符,并且要管理部分或者全部新的包结构。
每一个中间层驱动程序都必须分配自己的包描述符来代替高层的数据包描述符。如果中间层驱动程序要把数据包从一种格式转化为另一种格式,也必须分配缓冲区描述符来映射用于复制转配数据的缓冲区,该缓冲区由中间层驱动程序进行分配。如果有与复制的包描述符相关的OOB数据,那么可以将这些数据复制到与包描述符(中间层驱动程序分配的)相关的新OOB数据块,其过程是,首先,用NDIS_OOB_DATA_FROM_PACKET宏获取OOB数据区的指针,然后,调用disMoveMemory将其内容移入与新包描述符相关的OOB数据区。该驱动程序也能够用NDIS_GET_PACKET_XXX或NDIS_SET_PACKET_XXX宏从与老的包描述符相关的OOB数据区中,读取相关的内容,并写入与新包描述符相关的OOB数据区。
包描述符通过调用以下NDIS函数进行分配
a)调用NdisAllocatePacketPool或者NdisAllocatePacketPoolEx,为固定尺寸包描述符(由呼叫器指定数量)分配并初始化一组非可分页池。
b)调用NdisAllocatePacket函数,从NdisAllocatePacketPool(Ex)已经分配的池中分配包描述符。根据中间层驱动程序目的的不同,驱动程序能够对引入包描述符连接的缓冲区进行重新打包。例如,中间层驱动程序可以在接下来的情况下分配包缓冲池、对引入包数据重新打包.如果中间层驱动程序从高层协议驱动程序接收到的数据缓冲区,比低层介质能够发送的单个缓冲区更大,那么中间层驱动程序必须将引入的数据缓冲分割成更小的、满足低层发送要求的数据缓冲。中间层驱动程序在将发送任务转交低层驱动程序之前,可以通过压缩或加密数据方式来改变内入数据包的长度。调用以下NDIS函数分配上面所要求的缓冲区:
NdisAllocateBufferPool获取用于分配缓冲区描述符的句柄;
NdisAllocateMemory或NdisAllocateMemoryWithTag分配缓冲区;
c)调用NdisAllocateBuffer分配和设置缓冲区描述符,映射由NdisAllocateMemory(WithTag)分配的缓冲区,并链接到NdisAllocatePacket分配的包描述符上。驱动程序可以通过调用NdisChainBufferAtBack或NdisChainBufferAtFront函数,将缓冲区描述符和包描述符进行链接。调用NdisAllocateMemory(WithTag)返回的虚拟地址和缓冲区长度,将被传递给NdisAllocateBuffer函数来初始化其所映射的缓冲区描述符。符合典型要求的包描述符能够在驱动程序初始化时根据要求进行分配,也可以通过ProtocolBindAdapter函数调用来实现。如果必要或者出于性能方面的考虑,中间层驱动程序开发者可以在初始化阶段,分配一定数量的包描述符和由缓冲区描述符映射的缓冲区,这样,就为ProtocolReceive复制内入数据(将向高层驱动程序指示)预先分配了资源,也为MiniportSend或MiniportSendPackets向相邻低层驱动程序传递引入的发送数据包,准备了可用的描述符和缓冲区。如果在中间层驱动程序复制接收/发送数据到一个或多个缓冲区时,最末的一个缓冲的实际数据长度比缓冲区的长度小,那么,中间层驱动程序将调用NdisAdjustBufferLength把该缓冲区描述符调节到数据的实际长度。当该包返回到中间层驱动程序时,应再次调用该函数将其长度调节到完整缓冲区的实际尺寸。
2)下边界面向无连接的中间层驱动程序的工作流程
通过ProtocolReceivePacket函数,从低层NIC驱动程序以完整数据包形式接收内入数据,该数据包由NDIS_PACKET类型的包描述符指定,也能够通过将内入数据指示给ProtocolReceive函数,并将数据复制到中间层驱动程序提供的数据包中。下边界面向连接的中间层驱动程序总是用ProtocolCoReceivePacket函数,从低层NIC驱动程序接收数据作为一个完整的数据包。
在如下情况下,中间层驱动程序能够保持对接收数据包的所有权:当下边界面向无连接的中间层驱动程序向ProtocolReceivePacket函数指示完整数据包时,当下边界面向连接的中间层驱动程序向ProtocolCoReceivePacket函数指示数据包时,其中DIS_PACKET_OOB_DATA的Status成员设置为除NDIS_STATUS_RESOURCES以外的任何值。在这些情况下,中间层驱动程序能够保持对该包描述符和其所描述的资源的所有权,直到所接收数据处理完毕,并调用NdisReturnPackets函数将这些资源返还给低层驱动程序为止。如果ProtocolReceivePacket向高层驱动程序传递其所接收的资源,那么至少应该用中间层驱动程序已经分配的包描述符替代引入包描述符。根据中间层驱动程序目的的不同,当其从低层驱动程序接收完整数据包时,将有几种不同的包管理策略。例如,以下是几种可能的包管理策略:复制缓冲区内容到中间层驱动程序分配的缓冲区中,该缓冲区被映射并链接到一个新的包描述符,向低层驱动程序返回该输入包描述符,然后可以向高层驱动程序指示新的数据包;创建新的包描述符,将缓冲区(与被指示包描述符相关联)链接到新的包描述符,然后将新的包描述符指示给高层驱动程序。当高层驱动程序返回包描述符时,中间层驱动程序必须拆除缓冲区与包描述符间的链接,并将这些缓冲区链接到最初从低层驱动程序接收到的包描述符,最后向低层驱动程序返还最初的包描述符及其所描述的资源。即使下边界面向无连接的中间层驱动程序支持ProtocolReceivePacket函数,它也提供ProtocolReceive函数。当低层驱动程序不释放包描述符所指示资源的所有权时,NDIS将调用ProtocolReceive函数,当这类情况出现时,中间层驱动程序必须复制所接收的数据到它自己的缓冲区中。对于下边界面向连接的中间层驱动程序,当低层驱动程序不释放包描述符所指示资源的所有权时,则将数据包的NDIS_PACKET_OOB_DATA的Status成员设为NDIS_STATUS_RESOURCES,然后驱动程序的ProtocolCoReceivePacket函数必须将接收到数据复制到自己的缓冲区中
5) 中间层驱动过滤数据包的原理
NDIS中间层驱动程序在NDIS中起着转发上层驱动程序送来的数据包,并将其向下层驱动程序发送的接口功能。当中间层驱动程序从下层驱动程序接收到数据包时,它要么调用NdisMXxxIndicateReceive函数,要么调用NdisMindicateReceivePacket函数向上层指示该数据包中间层驱动程序通过调用NDIS打开和建立一个对低层NIC驱动程序或者NDIS中间层驱动程序的绑定。中间层驱动程序提供MiniportSetInformation和MiniportQueryInformation函数来处理高层驱动程序的设置和查询请求,某些情况下,可能还要将这些请求向低层NDIS驱动程序进行传递,如果其下边界是面向无连接的可通过调用NidsRequest实现这一功能,如果其下边界是面向连接的则通过调用NidsCoRequest实现该功能。中间层驱动程序通过调用NDIS提供的函数向网络低层NDIS驱动程序发送数据包。例如,下边界面向无连接的中间层驱动程序必须调用NdisSend或NdisSendPackets来发送数据包或者包数组,而在下边界面向连接的情况下就必须调用NdisCoSendPackets来发送包数组数据包。如果中间层驱动程序是基于非NDISNIC驱动程序的,那么在调用中间层驱动程序的MiniportSend或Miniport(Co)SendPackets函数之后,发送接口对NDIS将是不透明的。NDIS提供了一组隐藏低层操作系统细节的NdisXxx函数和宏。例如,中间层驱动程序可以调用NdisMInitializeTimer来创建同步时钟,可以调用NdisInitializeListHead创建链表。中间层驱动程序使用符合NDIS标准的函数,来提高其在支持Win32接口的微软操作系统上的可移植性。
在防火墙的设计中,最核心的部分应该是数据包的过滤。
其他的功能都是建立在数据包过滤的基础之上,如:入侵检测功能和邮件检测功能都是建立在数据包过滤的基础之上。数据包过滤中主要是IP包头的分析,例如:在以太网中,得到的数据报大致是如下结构,以太帧头14个字节,放在PUCHAR结构数组的第0个元素到第13个元素中,其中前六个字节是目的MAC地址,然后六个字节源MAC地址,然后两个字节是协议类型,通常的协议类型有0x080x00->IP,0x080x06->ARP,0x080x35->RARP,所以,可以通过数组的第12个元素和第13个元素来判断协议类型。过滤规则就是在这个基础之上建立。如果要过滤特定协议,只要在相应的字节读取数据,判断是否符合要过滤的规则就可以了,当然实际的过滤规则要复杂的多的多,比如对指定的端口指定的IP的过滤。

阅读全文

与tdi和ndis驱动过滤之我见相关的资料

热点内容
酒精蒸馏应注意什么 浏览:245
邯郸南污水处理厂技术 浏览:777
鸡蛋皮怎么洗暖瓶水垢 浏览:350
喜客odea咖啡机除垢 浏览:393
新马3空调滤芯怎么安装 浏览:794
超滤膜乙腈 浏览:833
净水机没有回水怎么办 浏览:135
如何降低反渗透膜清洗成本 浏览:692
污水井内支架用什么处理方式 浏览:506
饮水机温控器控制什么 浏览:428
反渗透膜杀菌 浏览:23
补茶几的是什么树脂 浏览:815
工业纯水设备价格多少 浏览:755
沁园牌管道式超滤净水器装法 浏览:528
滤芯安装在什么位置 浏览:549
上海10寸过滤芯多少钱一个 浏览:714
酸洗磷化污水处理设备哪里卖 浏览:851
盼盼树脂门隔音好吗 浏览:203
纳滤反冲洗频率 浏览:437
高透明环氧树脂里放动物 浏览:709