第一部分 Windows网络封包的截获技术 3
第1章 Windows网络协议架构 3
1.1 Windows网络协议的实现 3
1.2 Windows操作系统的总体架构 3
1.3 网络7层协议在Windows中的实现 5
1.4 TCP/IP协议的架构 7
1.5 TCP/IP协议在Windows中的实现 9
第2章 编程环境的构建 10
2.1 硬件需求 10
2.2 软件需求 11
2.3 软件安装 11
2.4 VC6 IDE环境的设置 11
2.5 编译并测试Winsock示例程序 13
2.6 编译并测试DDK示例程序 15
2.6.1 测试驱动程序示例程序 15
2.6.2 编译驱动程序示例程序 16
2.6.3 在VC环境下编译驱动程序 17
第3章 用传输层过滤驱动程序截获网络封包 21
3.1 一个最小化的驱动程序 21
3.1.1 MinDriver.h代码清单 21
3.1.2 MinDriver.c代码清单 22
3.2 过滤驱动程序的特性 23
3.3 传输层过滤驱动程序实例 24
3.3.1 在Packet.h里定义的宏和结构类型 24
3.3.2 FilterTdiDriver入口函数DriverEntry 26
3.3.3 用来绑定过滤驱动程序的函数TCPFilter_Attach 27
3.3.4 卸载驱动程序的函数DriverUnload 30
3.3.5 解除挂接的函数TCPFilter_Detach 32
3.3.6 用来分发IRP请求的函数PacketDispatch 33
3.3.7 IRP处理完成后的回调函数PacketCompletion 37
3.3.8 工程文件Source 38
第4章 用NDIS中间驱动程序截获网络封包 39
4.1 NDIS简介 39
4.2 中间驱动程序的特性 39
4.3 编译、安装和测试xpassthru 41
4.4 xpassthru的架构 43
4.5 xpassthru使用的宏、结构和全局变量 44
4.6 xpassthru的入口函数DriverEntry 47
4.7 注册Miniport设备的函数MPRegisterAsMiniport 49
4.8 注册Protocol设备的函数MPRegisterAsMiniport 50
4.9 Miniport接口函数 52
4.10 Protocol接口函数 54
4.11 发送封包的函数 58
4.11.1 MPSend 58
4.11.2 MPSendOnePacket 59
4.11.3 MPSendPackets 61
4.11.4 PtSendComplete 62
4.11.5 MPTransferData 63
4.11.6 PtTransferDataComplete 64
4.12 接收封包的函数 65
4.12.1 PtReceive 65
4.12.2 PtReceiveComplete 69
4.12.3 PtReceivePacket 70
4.12.4 MPReturnPacket 72
4.13 得到封包属性的函数 73
4.14 source内容清单 75
第5章 Winsock 2 SPI编程技术 77
5.1 Winsock2 SPI基础 77
5.1.1 WinsockAPI与SPI的对应关系 78
5.2 传输服务提供者 79
5.2.1 最小化的基础服务提供者例程 84
5.2.2 最小化的分层服务提供者例程 90
第6章 用Winsock 2 SPI截获网络封包 106
6.1 运行程序 106
6.1.1 建立截获封包的DLL工程 107
6.1.2 建立用来安装的EXE工程 108
6.2 编写安装程序 109
6.2.1 输出调试信息的宏 110
6.2.2 安装程序代码 111
6.2.3 CXInstall类 114
6.2.4 构造完整的安装程序 127
6.3 编写截获TCP/IP封包的DLL程序 129
6.3.1 全局变量 129
6.3.2 DllMain 130
6.3.3 WSPStartup 132
6.3.4 截获的服务提供者函数 135
6.3.5 工程配置文件TcplpDog.Def 148
6.3.6 设置、编译和测试TcplpDog 149
第二部分 Xfilter个人防火墙实例剖析 153
第7章 Xfilter个人防火墙系统设计 153
7.1 Xfilter的核心功能分析 153
7.2 程序工作流程图 155
7.3 Xfilter的主体功能 156
7.4 模块划分 157
7.4.1 模块划分原则 158
7.4.2 模块结构图 158
7.4.3 模块接口定义 162
7.4.4 制定测试方法 163
7.5 控管规则文件结构设计 164
7.5.1 控管规则文件需要存储的内容 164
7.5.2 控管规则文件结构 167
7.5.3 日志文件需要存储的内容 170
7.5.4 日志文件结构 170
7.6 网络命令结构 172
7.7 界面设计 173
7.7.1 制定界面风格 173
7.7.2 界面设计工具选择 173
7.7.3 界面设计文档 174
7.8 选择开发工具和制定编码规则 179
7.8.1 选择开发工具 179
7.8.2 编码规则 180
第8章 Xfilter.dll的封包截获 182
8.1 封包截获相关代码分析 182
8.1.1 Xfilter.dll的入口函数DllMain 182
8.1.2 服务提供者入口函数 184
8.1.3 截获的服务提供者函数 189
8.1.4 与Xfilter.exe的接口函数XfloControl 201
8.1.5 询问是否放行的函数QueryAccess 203
8.2 相关知识点说明 207
8.2.1 在不同的进程间共享数据 207
8.2.2 全局变量的临界操作 208
8.2.3 Win9x与WinNT/2000不同的DLL调用方式 208
8.2.4 在DLL中向进程发送消息完成通信 209
第9章 Xfilter.dll的访问控管 210
9.1 CCheckAcl类的原型 210
9.2 CCheckAcl类的成员变量和函数 212
9.3 对服务提供者函数做管制的函数 213
9.3.1 CheckStartup 213
9.3.2 CheckSocket 214
9.3.3 CheckCloseSocket 215
9.3.4 CheckConnect 216
9.3.5 CheckAccept 217
9.3.6 CheckSend 218
9.3.7 CheckSendTo 219
9.3.8 CheckRecv 220
9.3.9 CheckRecvFrom 221
9.4 封包处理函数 223
9.4.1 InitializeSession 223
9.4.2 CreateSession 224
9.4.3 DeleteSession 225
9.4.4 FindSession 227
9.4.5 SetSession 227
9.4.6 SetSessionEx 229
9.4.7 FinallySession 230
9.4.8 SendSessionToApp 231
9.4.9 GetSessionAndSetSessionNull 232
9.5 管制函数 232
9.5.1 IsLocalIP 232
9.5.2 GetAccessInfo 234
9.5.3 GetAccessFromWorkMode 234
9.5.4 GetAccessFromAcl 235
9.5.5 FindAcl 240
9.5.6 FindTime 240
9.5.7 FindIP 242
9.6 初始化和清理函数 244
9.6.1 CCheckAcl 244
9.6.2 ~CCheckAcl 244
9.6.3 SetWindowsVersion 244
9.7 设置函数 246
9.7.1 IsWin9x 246
9.7.2 SetGuiProcessName 246
9.7.3 SetGuiWnd 247
9.7.4 GetGuiWnd 247
9.7.5 SetWorkMode 247
9.7.6 GetWorkMode 248
9.7.7 SetAcl 248
9.7.8 SetAclToChangedMode 249
9.8 相关知识点说明 250
9.8.1 类的构造函数和析构函数 250
9.8.2 全局变量的定义和使用 251
9.8.3 用指针实现动态数组 251
第10章 Xfilter.dll的协议解析和公用函数分析 252
10.1 典型的协议封包数据 252
10.1.1 HTTP协议包头实例 252
10.1.2 FTP下载/上传文件封包实例 252
10.1.3 SMTP发送邮件封包实例 253
10.1.4 POP3接收邮件封包实例 254
10.2 CProtocolInfo类原型 257
10.3 CProtocolInfo类的成员函数列表 258
10.4 供外部调用的公共函数 258
10.4.1 GetProtocolInfo 258
10.5 类内部调用的私有函数 259
10.5.1 GetFromSend 259
10.5.2 GetFromRecv 260
10.5.3 GetFtp 260
10.5.4 GetHttp 262
10.5.5 GetSmtp 264
10.5.6 GetPop3BySend 265
10.5.7 GetPop3 266
10.6 公共模块CXCommon类 268
10.6.1 CXCommon类的原型 268
10.6.2 CXCommon类的成员函数列表 268
10.6.3 DIPToSIP 269
10.6.4 GetBit 269
10.6.5 SetBit 270
10.6.6 GetAppPath 270
10.6.7 GetPath 272
10.6.8 GetName 272
10.7 生成Xfilte.dll的工程文件(LspServ.def) 273
10.8 小结 274
第11章 Xfilter.exe与Xfilter.dll的接口 275
11.1 建立界面工程 275
11.2 主应用程序类CPropertyApp 277
11.2.1 CPropertyApp类的原型 278
11.2.2 CPropertyApp类的变量 279
11.2.3 初始化函数 280
11.2.4 退出函数 287
11.2.5 菜单函数 291
11.2.6 其他函数 295
11.3 隐藏的主窗口类CMainFrame 298
11.3.1 CMainFrame类的原型 298
11.3.2 CMainFrame类的变量列表 299
11.3.3 CMainFrame类的自定义消息处理函数 300
11.3.4 CMainFrame类使用的线程函数 304
11.3.5 CMainFrame类的其他成员函数 306
11.4 在任务栏上显示图标的类CSystemTray 310
11.4.1 CSvstemTray类的原型 310
11.4.2 CSystemTray类的成员变量 311
11.4.3 CSystemTray类的成员函数 311
11.5 小结 320
第12章 Xfilter.exe的文件操作 321
12.1 控管规则文件操作类CAclFile 321
12.1.1 CAclFile类的原型 321
12.1.2 CAclFile类的成员变量 322
12.1.3 CAclFile类的构造和析构函数 323
12.1.4 CAclFile类的公有函数 324
12.1.5 CAclFile类的私有函数 333
12.2 日志文件操作类CXLogFile 347
12.2.1 CXLogFile类的原型 347
12.2.2 CXLogFile类的成员变量 348
12.2.3 CXLogFile类的构造和析构函数 348
12.2.4 CXLogFile类的公有函数 349
12.2.5 CXLogFile类的私有函数 355
第13章 用户注册和下载网络命令 360
13.1 用户注册窗口类CRegister 360
13.1.1 CRegister类的原型 360
13.1.2 CRegister类的成员变量 362
13.1.3 VC中界面元素对象与变量的绑定 362
13.1.4 CRegister类的成员函数 363
13.2 用户注册和下载网络命令类CHttpRequest 367
13.2.1 CHttpRequest类的原型 368
13.2.2 CHttpRequest类的变量 369
13.2.3 构造和析构函数 369
13.2.4 网络请求函数 370
13.2.5 用户注册函数 377
13.2.6 下载网络命令函数 382
13.3 模拟超级链接类CHyperLink 390
13.3.1 CHyperLink类的原型 390
13.3.2 CHyperLink类的成员变量 391
13.3.3 CHyperLink类的成员函数 392
13.4 可以更改字体颜色的标签类CColorStatic 399
13.4.1 CColorStatic类的原型 399
13.4.2 CColorStatic类的成员变量 399
13.4.3 CColorStatic类的成员函数 399
第14章 Xfilter.exe的属性页界面 401
14.1 属性页总窗口类CMainSheet 401
14.1.1 CMainSheet类的原型 401
14.1.2 CMainSheet类的变量 403
14.1.3 CMainSheet类的成员函数 403
14.2 封包监视窗口类CPacketMonitor 412
14.2.1 CPacketMonitor类的原型 412
14.2.2 CPacketMonitor类的成员变量 414
14.2.3 CPacketMonitor类的成员函数 414
14.3 日志查询窗口类CLogQuery 420
14.3.1 CLogQuery类的原型 420
14.3.2 CLogQuery类的成员变量 422
14.3.3 CLogQuery类的成员函数 422
14.4 控管规则窗口类CAcl 431
14.4.1 CAcl类的原型 432
14.4.2 CAcl类的成员变量 434
14.4.3 CAcl类成员函数 434
14.5 系统设置窗口类CSystemSet 446
14.5.1 CSystemSet类的原型 447
14.5.2 CSystemSet类的成员变量 448
14.5.3 CSystemSet类的成员函数 449
14.6 关于窗口类CAbout 451
14.7 增加欢迎画面 452
第15章 Xfilter.exe的控管规则设置 454
15.1 控管规则设置窗口类CAclSet 454
15.1.1 CAclSet类的原型 454
15.1.2 CAclSet类的成员变量 456
15.1.3 CAclSet类的成员函数 456
15.2 网络/时间设置窗口类CNetTimeSheet 468
15.2.1 CNetTimeSheet类的原型 469
15.2.2 CNetTimeSheet类使用的全局变量 470
15.2.3 CNetTimeSheet类的成员函数 470
15.3 时间设置窗口类CSetTime 475
15.3.1 CSetTime类的原型 475
15.3.2 CSetTime类的成员变量 477
15.3.3 CSetTime类的成员函数 477
15.4 网络设置窗口类CSetNet 486
15.4.1 CSetNet类的原型 486
15.4.2 CSetNet类的成员变量 488
15.4.3 CSetNet类的成员函数 488
15.5 IP地址段设置窗口类CNetIPAria 501
15.5.1 CNetIPAria类的原型 501
15.5.2 CNetIPAria类的成员变量 503
15.5.3 CNetIPAria类的成员函数 503
15.6 小结 504
第16章 联机帮助的实现 505
16.1 帮助文件制作方法简介 505
16.1.1 选择工具 505
16.1.2 制作方法 505
16.2 在帮助文件中使用API主题映射 512
16.3 将帮助文件应用到程序中 514
第17章 打包与测试 516
17.1 安装程序的制作 516
17.2 测试 523
17.3 Xfilter的部分测试文档 524
17.4 小结 532
第三部分 附录 535
附录A 传输服务提供者函数 535
A.1 WSPAccept 535
A.2 WSPAddressToString 537
A.3 WSPAsyncSelect 538
A.4 WSPBind 539
A.5 WSPCancelBlockingCall 540
A.6 WSPCleanup 541
A.7 WSPCloseSocket 541
A.8 WSPConnect 542
A.9 WSPDuplicateSocket 545
A.10 WSPEnumNetworkEvents 546
A.11 WSPEventSelect 547
A.12 WSPGetOverlappedResult 547
A.13 WSPGetPeerName 549
A.14 WSPGetQOSByName 550
A.15 WSPGetSockName 551
A.16 WSPGetSockOpt 552
A.17 WSPIoctl 553
A.18 WSPJoinLeaf 555
A.19 WSPListen 557
A.20 WSPRecv 559
A.21 WSPRecvDisconnect 561
A.22 WSPRecvFrom 562
A.23 WSPSelect 565
A.24 WSPSend 567
A.25 WSPSendDisconnect 569
A.26 WSPSendTo 570
A.27 WSPSetSockOpt 574
A.28 WSPShutdown 575
A.29 WSPSocket 576
A.30 WSPStartup 578
A.31 WSPStringToAddress 579
附录B Xfilter宏代码 581
B.1 最大值代码 581
B.2 网络命令代码 581
B.3 用户注册代码 581
B.4 日志文件相关代码 582
B.5 自定义消息代码 582
B.6 控管规则文件相关代码 582
B.7 错误代码 583
B.8 控制代码 584
B.9 访问权限控制代码 585
B.10 其他控管规则的相关代码 585
附录C Xfilter结构类型 587
C.1 Internet结构类型 587
C.1.1 XUSER_INFO 587
C.1.2 XNET_COMMAND_HEADER 588
C.2 控管规则结构类型 589
C.2.1 XACL_HEADER 589
C.2.2 XACL 591
C.2.3 XACL_IP 591
C.2.4 XACL_TIME 592
C.2.5 XACL_FILE 592
C.3 封包结构类型 593
C.3.1 SESSION 593
C.3.2 QUERY_SESSION 594
C.4 控制结构类型 594
C.4.1 XFILTER_IO_CONTROL 594
C.5 日志文件结构类型 595
C.5.1 LOG_HEADER 595
C.5.2 LOG_FIND 595
附录D Xfilter全局变量 597
D.1 Xfilter.dll使用的全局变量列表 597
D.2 Xfilter.exe使用的全局变量列表 598