




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
分类号 分类号 TP311 1TP311 1 U U D D C C D10621 408 2007 5914 0D10621 408 2007 5914 0 密密 级 公级 公 开开 编编 号 号 20030320502003032050 成成 都都 信信 息息 工工 程程 学学 院院 学学 位位 论论 文文 基于基于 WindowsWindows 平台下的个人防火墙设计平台下的个人防火墙设计 论文作者姓名 论文作者姓名 李涵李涵 申请学位专业 申请学位专业 网络工程网络工程 申请学位类别 申请学位类别 工学学士工学学士 指指导导教教师师姓姓名名 职职称称 刘嘉勇 教授 刘嘉勇 教授 论文提交日期 论文提交日期 20072007 年年 6 6 月月 5 5 日日 基于基于 WindowsWindows 平台下的个人防火墙设计平台下的个人防火墙设计 摘摘 要要 网络安全问题长期威胁着网络终端用户 需要有有效的安全工具解决这个 问题 个人防火墙就是其中的一种常用的安全工具 为了实现个人防火墙软件 选用 VC 6 0 开发工具 软件系统主要包括两项工程 一是核心模块设计 即 DLL 工程 实现了封包截获 管制动作和协议封包的解析任务 主要利用 Winsock 2 SPI 技术实现网络封包截获 之后利用控管规则对过往封包进行合 法性检查和过滤 方法是首先利用 Winsock 2 SPI 技术建立 winsock 钩子 用 它来截获 winsock 的调用 然后作出相应动作处理 动作处理需通过控管规则 的检查后 确定 socket 连接是否允许通过 其中控管规则由用户层设置 二是 用户模块设计 即 EXE 工程 实现用户界面和负责与 DLL 模块的通信 提供了 3 个主要界面 即封包监视 控管规则 控管规则设置 最后通过测试和应用 基本解决了终端用户的网络连接安全问题 关键词 关键词 过滤 动态连接库 Winsock 2 SPI 网络封包 协议封包 The Design of the Personal Firewall Based on Windows Abstract The terminal users of network are always threaten by the problems of security of network so we need a effective tool to solve this problem The personal firewall is one of the common tools of security VC is selected to implement the personal firewall The system has two projects mainly One of the projects is the design of core module which can be called the project of DLL This project implements behaviors of management and the analysis of packets of protocols The technology of Winsock 2 SPI is used to capture of pakcets of network After that then the checking and filtering of the packets are done using the rules of control and management At the beginning the control rules build up the Hook of winsock which is used to capture the tranfer of winsock and then it implements relative behaviors The link of socket will be or not get through checking by the rules of control and management The rules of control and management are set by the layer of user Then we should design the module of user which can be called the project of exe It implements the interface of user and the module of communication with DLL It provides three main interfaces they are the watching of filtering packet the rules of control and management and the setting of rules of control and management Finally it has solved the requirement of security of terminal users after the final testing and application Key words Filter DLL Winsock 2 SPI Network packets Protocol packets 目录目录 论文总页数 25 页 1引言 1 1 1课题背景与意义 1 1 2设计实现的主体功能 1 1 3本课题的研究方法 1 2WINSOCK 2 SPI 编程技术 2 2 1WINSOCK 2 SPI 基础 2 2 2传输服务提供者 2 3开发平台与开发工具 2 4系统设计与模块划分 3 4 1本课题要实现的具体功能 3 4 2程序工作流程图 3 4 3模块划分 4 4 3 1模块划分原则 4 4 3 2模块结构 4 4 3 3模块接口定义 5 4 4控管规则文件结构设计 6 4 4 1控管规则文件需要存储的内容 7 4 4 2控管规则文件结构 8 4 5界面设计 8 4 5 1制定界面风格 8 4 5 2界面设计文档 8 4 6编码规则 12 5核心功能的代码实现 12 5 1DLL 的封包截获 12 5 2DLL 的访问控管 16 5 2 1对服务提供者函数做管制的函数 16 5 2 2封包处理函数 17 5 2 3管制函数 17 5 2 4设置函数 20 6测试 21 结 论 22 参考文献 22 致 谢 24 声 明 25 第 1 页 共 25 页 1 1 引言引言 1 11 1课题背景与意义课题背景与意义 目前 随着网络向各个领域的扩展 网络安全的重要性日益被人们所认知 ISP 提供商担心网络被攻击 因为这种事情发生太频繁 使用网上交易的用户 担心帐户密码被盗 因为窃取密码的工具比比皆是 软件公司担心源代码泄露 就连微软也没逃脱厄运 种种现象都表明网络安全越来越重要 这种事情随时 都可能发生在我们自己身上 这也正是网络安全快速发展的原因 所以防火墙 和防病毒软件格外的重要 也被现在的人们强烈的需要 1 21 2设计实现的主体功能设计实现的主体功能 现在防火墙的花样与种类繁多 让人眼花缭乱 但是防火墙的主要功能是 防止外部网络的攻击以达到保护主机的目的 我认为哪些未知的网络 IP 可能对 主机产生攻击可能我们都不知道 只要试验过才知道 所以现在防火墙一般与 防病毒软件配合使用 这样才能安全的保护主机 实现的主要的核心功能如下定义 1 根据应用程序访问规则可对应用程序连网动作进行过滤 2 对应用程序访问规则具有自学习功能 3 可实时监控 监视网络活动 1 31 3本课题的研究方法本课题的研究方法 本课题由两大模块构成 分别为 DLL 模块和 EXE 模块 首先利用 Winsock 2 SPI 技术建立 winsock 钩子用来截获 winsock 调用从 而拦截 TCP IP 封包 并做相应处理 然后设置控管规则访问控制 通过控管规 则的检查认证 确定 socket 连接是否允许通过 最后是 TCP IP 的封包分析 利用 TIP IP 的封包结构分析截获的数据 提取需要的数据 这些封装在 DLL 里 面 EXE 模块主要是用户页面的制作 这里介绍与 DLL 通信的地方 EXE 中与 DLL 直接通信的小模块主要有两个 一个是完成应用程序初始化的类 CPropertyApp 它继承自 CWinApp 是 EXE 的入口 其实里面封装了 WinMain 函 数 另一个是主窗口模块 CMainFrame 这个主窗口并不是 EXE 显示出来的那个 属性页窗口 而是一个隐藏的窗口 它继承自 CMrameWnd 是一个无模式窗口 他隐藏显示 充当接受机 用来接受 DLL 及其他模块发送过来的消息 然后对 消息进行相应的处理 每一个连网的程序连网之前都会建立一个 Socket 连接 这时钩子程序就会 起作用 把截获的底层服务进行 过滤 及先调用自定义的函数再转给下层服 务提供者函数 我就是在这一层实现封包过滤的 把规则与功能写到这一层 第 2 页 共 25 页 这一层的实现是本课题的核心 2 2 W WINSOCKINSOCK 2 2 SPISPI 编程技术编程技术 Winsock 2 是 Windows Sockets 的 2 0 版本 在此之前的版本是 1 1 与 1 1 版本相比 2 0 版本引入了一种新的叫做 SPI 的编程接口 利用这种技术可以 在 Socket 中插入一曾层 从而可以完成诸如扩展 TCP IP 协议栈 网络安全控 制等功能 所以这是一个非常强大而且有用的接口 下面介绍这种编程技术 2 12 1 W WINSOCKINSOCK 2 2 SPISPI 基础基础 Winsock 是为上层应用程序提供的一种标准网络接口 上层应用程序不用 关心 Winsock 实现的细节 它为上层应用程序提供透明的服务 Winsock 2 引入的一个新的功能就是打破服务提供者的透明 让开发者可 以编写自己的服务提供者接口程序 即 SPI 程序 SPI 以动态链接库的形式存 在 它工作在应用层 为上层 API 调用接口函数 Winsock 2 是一个接口 不 是一个协议 作为接口 它只能发现和利用底层传输协议完成通信 自己编写的 SPI 程序安装到系统之后 所有的 Winsock 请求都会发送到这 个程序并由它完成网络调用 由于系统提供的 SPI 已经可以完成网络传输功能 所以自己编写的 SPI 没有必要重新编写这部分功能 一般可以直接调用系统函 数完成网络传输 这样工作的效果就是 钩子程序 Winsock 2 SPI 除了有完成网络传输的传输服务提供者 还有提供友好名 称服务的名字空间服务提供者 传输服务提供者能够提供建立通信 传输数据 流量控制和错误控制等服务 名字空间服务提供者把一个网络协议的地址属性 和一个或多个用户友好名称关联起来 这样可以起用与协议无关的名字解析方 案 2 2 传输服务提供者传输服务提供者 传输服务提供者又分为基础服务提供者和分层服务提供者 基础服务提供 者和分层服务提供者都开放相同的 SPI 接口 所不同的是基础服务提供者位于 提供者的最底层 所以编写基础服务提供者和分层服务提供者基本相同 但安 装是却需要将基础服务提供者安装在服务提供者加载顺序链的最底端 而分层 服务提供者则根据需要分布在顺序链的中间 3 3 开发平台与开发工具开发平台与开发工具 开发平台如题说明 以 Windows 平台为主 重点讨论开发工具的选择 根据不同的工程选择不同的开发工具 可以有效地提高工作效率 不同的 开发工具各有各的优点同时又各有各的不足 在开发中要扬长避短 目前常用的 Windows 开发工具有 VS 5 0 6 0 VS net 包括 VB BC VFP VJ C 等一组开发工具 delphi C Builder JBuilder PB 第 3 页 共 25 页 等 在这些开发工具里面 VFP 和 PB 一般用来专门开发数据库系统 它们具有 灵活的数据库接口 VB 和 Delphi 既可以方便地做出复杂的数据库管理系统 又能轻松地完成 操作系统级的任务 最优秀的是很容易做出漂亮的界面 VC 和 Borland C 着重于系统编程 它们开放接口较多 也最为灵活 而 且编译出的程序体积较小 所以比较适合做系统工具类软件 缺点是短时间不 容易掌握 其中 Borland 使用的 VCL 类库是为 Delphi 准备的 并不是真正用 C 实现的 VJ Jbuilder 和 Java 语言主要面向互联网应用 最大的优势是跨平台 本课题为防火墙软件 较多的使用系统接口 而且界面简单 另外 防火 墙主要传播渠道是互联网 这就要求体积应尽量的小 安装尽量方便 所以选 择 VC 为开发工具 4 4 系统设计与模块划分系统设计与模块划分 4 1 本课题要实现的具体功能本课题要实现的具体功能 本设计实现的具体功能如下 1 封包监视 1 提供封包监视页面 2 提供清空监视列表 停止 开始监视及停止 开始滚动功能 2 控管规则设置 1 手工添加 删除及修改控管规则 2 自学习添加控管规则 3 控管规则中目的网络 IP 地址段的设置 4 提供控管规则设置页面 3 封包过滤 1 DLL 给出设置工作模式和设置控管规则的接口函数 工作模式分为 3 种形式 放行所有 拒绝所有和过滤 2 DLL 根据工作模式和控管规则对过往封包进行过滤 3 DLL 将通过的网络封包通知 EXE 取走 4 2 程序工作流程图程序工作流程图 Winsock 2 SPI 是一个 DLL 程序 它工作在 API 和 DRIVER 之间 为上层应 用程序提供服务 EXE 与 DLL 构成软件的主题 也是编写软件的主要工作 流 程图如图 1 所示 第 4 页 共 25 页 模块1 1 1 控管规则 输入界面接口 模块1 1 2 封包监 视界面接口 模块1 3 读写控管 规则 模块1 4 设置控管 规则 模块1 5 设置工作 模式 控管规则文件 cfg 模块2 2 控 管规则 模块2 3 工 作模式 用户界面 EXE 模块1 2 安装 Winsock 2SPI DLL 模块 2 1 封 包 过 滤 模块1 1 用户界面接口 图 1 防火墙工作流程图 4 3 模块划分模块划分 4 3 14 3 1模块划分原则模块划分原则 模块划分是系统分析中非常重要的一部分 下面是模块划分时的基本原则 1 独立性 让模块直接内的关系减到最少 理想的状态就是模块之间没 有关系 但这种情况不符合现实 既然是同一个工程 模块之间自然都会存在 一定的联系 只要想办法让模块之间的关系尽量简单就可以了 2 接口简单化 让模块之间的接口尽量单纯 简单 易用 即让公用函 数和公用变量尽量地少 3 分层处理 吸取 Windows 操作系统对模块做分层处理的经验 建立一 些中间模块 让两端的模块来完成相互调用的透明化 4 容易合并 容易将划分的模块进行合并 例如将一个工程的各个功能 模块分别设计成可执行文件 然后用一个总模块将这些模块关联起来组成一个 工程 这种情况下 对模块独立性要求较高 模块之间几乎没有任何关系 5 可测试性 尽量使每个模块都可以单独进行测试 2 上面的 5 条是参考原则 既然是参考原则就不会完全执行 完全按照一个 教条去执行真的很困难 只要在做模块划分的时候能经常记起这些原则 然后 稍加注意就 OK 了 另外 在这 5 条原则中 第一条是根本 能把这一条做好 下面的一些就容易实现了 在做模块划分时一定要始终贯穿独立性的思想 4 3 24 3 2模块结构模块结构 根据 4 1 节的功能定义和 4 2 节的工作流程图 需要对模块做进一步细化 模块 1 1 用户界面接口 第 5 页 共 25 页 得出更详细的模块结构 这些模块结构是编程的蓝本 在编写代码的过程中 就要以这些结构为指导 1 模块 1 1 用户界面 4 5 节详细说明 2 模块 1 2 EXE 的安装模块 建立 CXInstall 类 C 源文件 Install h 和 Install cpp 安装函数 InstallProvider 和卸载函数 RemoveProvider 3 模块 1 3 EXE 读写控管规则模块 建立 CAclFile 类 C 源文件 File h 和 File cpp 读控管规则文件 ReadAcl 保存控管规则文件 SaveAcl 增加一 条控管规则 AddAcl 和删除一条控管规则 DelAcl 4 模块 1 4 EXE 设置 DLL 的控管规则模块 设置控管规则单独的函数 调用模块 1 3 读写控管规则模块得到控管规则数据 调用 DLL 的函数 FloControl 设置 DLL 的控管规则 5 模块 1 5 EXE 设置 DLL 的工作模式 设置工作模式单独的函数 调用 模块 1 3 读写控管规则模块得到控管规则数据 调用 DLL 的函数 FloControl 设 置 DLL 的工作模式 6 模块 2 1 DLL 封包过滤模块 有分为 3 块 2 1 1 一组 Winsock 2SPI 钩子函数 C 源文件 TcpipDog h 和 TcpipDog cpp 模块 2 1 2 根据控管规则判 断是否可以通行的类 CCheckAcl C 源文件 CheckAcl h 和 CheckAcl cpp 模 块 2 1 3 对网络数据包进行分析的类 CProtocolInfo C 源文件 ProtocolInfo h 和 ProtocolInfo cpp 模块 2 1 1 服务提供者函数模块 入口函数 WSPSartup 发送询问消 息到 EXE 由 EXE 提供询问界面函数 QueryAccess 截获的 8 个服务提供者函数 设置工作模式 控管规则等设备工作接口函数 FloControl 模块 2 1 2 访问控管模块 通过检查工作模式和控管规则得到是否放 行的函数 GerAccessInfo 模块 2 1 3 协议解析模块 得到协议信息处理函数 GetProtocolInfo 7 模块 2 2 DLL 更改控管规则模块 设置 DLL 控管规则数据 SetAcl 设 置控管规则 m Aclfile 设置工作模式 m iWorkMode 8 模块 2 3 DLL 更改工作模式模块 设置 DLL 工作模式函数 SetWorkMode 4 3 34 3 3模块接口定义模块接口定义 模块之间接口有 3 种方式 1 函数接口 函数接口是最常用而且独立性和封装性最好的接口方式 函数之间通过参 第 6 页 共 25 页 数传递进行模块之间的通信 处理过程保持相互独立 函数处理完成把处理结 果返回到调用模块 如果每个函数都有单独的接口 那么 函数多了 接口也 就多了 也就越来越复杂了 C 利用类的饿概念解决这个问题 类可以将一组 函数和变量封装起来 这样就将许许多多的函数转化成一个对象的形式 外部 模块使用这个类的实例来引用封装在里面的成员函数个变量 把功能相似 相 关的函数分成一组 然后封装在一起 使接口间的关系清晰了很多 类的成员 函数和成员变量有公有和私有之分 对于公有函数和变量 外部模块可以直接 调用 对于私有函数和变量 外部模块则不能直接调用 利用这种特性 可以 把一些只在类里面使用的函数定义为私有函数 把外部模块需要直接调用的函 数定义为公有函数 类似于 DLL 的导出函数 Export 这样 模块之间的直接 接触就会进一步减小 独立性更进一步增加 2 全局变量接口 全局变量接口是一种不提倡的方式 虽然它使用起来确实很过瘾 全局变 量多了非常容易出问题 任何地方都可能会对全局变量进行赋值 变量的可控 性大大降低 不知道什么时候变量的值就被莫名其妙地改掉了 当然 只要不 被那些模块执行的先后顺序和循环语句弄昏头 还是可以使用全局变量的 虽 然不提倡使用 但是有些地方使用全局变量与是不可避免的 而且有时候可以 减少很多麻烦 使用全局变量的时候需要注意一点 读取变量的多少和位置对 程序稳定性的影响并不很大 关键是尽量让赋值的地方单一 改变变量的次数 和位置应尽量得到控制 3 Windows 消息接口 Windows 消息接口是一种特殊的接口形式 它是基于 Windows 操作系统的 消息机制 这种接口形式适合于应用程序之间 应用程序是相对独立的模块 如果这两个模块需要通信 则消息接口就是一种理想型的选择 这种接口类似 于函数接口 只不过通过操作系统的消息机制来中转一下 Windows 消息接口 也是一种接口方式 特别是 DLL 和 EXE 之间经常用到 在 DLL 与 EXE 之间通信 使用消息是一种优势 多个应用程序虽然调用同一个 DLL 但是它们都拥有独 立的模块副本 这时候如果这些模块副本都需要让同一个应用程序做一件事时 就不好处理 因为 DLL 的重要性和应用程序保护机制导致这些模块副本无法直 接调用同一个应用程序的执行模块 这时候就可以通过消息的方式来解决 发 送消息是基于窗口句柄的 只要得到这个窗口句柄 不同的 DLL 副本都向同一 个窗口句柄发送消息 自然所有的消息都可以被同一个应用程序接收 以上 3 种接口方式以函数接口为优先进行考虑 以增强模块的独立性和可 读性 第 7 页 共 25 页 4 4 控管规则文件结构设计控管规则文件结构设计 控管规则文件用来存储控管规则数据 命名为 acl cfg 该数据文件为二 进制文件 4 4 14 4 1控管规则文件需要存储的内容控管规则文件需要存储的内容 控管规则文件需要存储的内容如下 1 系统设置 2 控管设置 3 控管规则附加数据 授权访问的远端网络 IP 地址记录 1 控管规则记录结构控管规则记录结构 控管规则记录结构说明 1 规则编号字段是控管规则的唯一性编号 保留字段 没有使用 2 应用程序名称及路径字段用来保持应用程序的名称和路径 3 远端网络类型 数值的含义如下 0 表示所有网络 1 局域网 2 约束的网络 自定义 3 信任的网络 自定义 4 自定义的网络 自定义 4 管制动作 数值的含义如下 0 放行 1 拒绝 5 进出方向 数值的含义如下 0 出 1 入 2 双向 6 服务类型 数值的含义如下 0 全部 1 TCP 端口为任意 可编辑 2 UDP 端口为任意 可编辑 3 FTP 端口为 21 不可编辑 4 TELNET 端口为 23 不可编辑 5 HTTP 端口为任意 可编辑 6 NNTP 端口为 119 不可编辑 7 POP3 端口为 110 不可编辑 第 8 页 共 25 页 8 SMTP 端口为 25 不可编辑 7 服务端口 数值的含义如下 0 表示全部 其他值 表示端口值 2 2 授权访问的远端授权访问的远端 IPIP 地址记录结构地址记录结构 授权访问的远端网络 IP 地址结构如表 1 所示 表 1 授权访问的远端网络 IP 地址段记录结构 字段 类型 长度 开始 IP 无符号长整型 4 结束 IP无符号长整型 4 4 4 24 4 2控管规则文件结构控管规则文件结构 根据需要存储的内容将控管规则文件划分为 3 段 文件头用来存储系统设置 IP 地址范围记录和控管规则记录的地址偏移量 及其他信息 IP 地址范围记录存储区用来存储 IP 地址范围记录 控管规则记 录存储区用来存储控管规则记录 1 1 控管规则结构控管规则结构 控管规则结构如表 2 所示 表 2 控管规则记录结构表 08162432404856 控管规则编号应用程序路径和名称 远端网络动作方向服务类型端口 2 IP 地址结构地址结构 IP 地址段记录结构如表 3 所示 表 3 IP 地址段记录结构表 08162432404856 开始 IP 地址结束 IP 地址 开始 IP 地址结束 IP 地址 4 5 界面设计界面设计 4 5 14 5 1制定界面风格制定界面风格 界面上反映的功能有 封包监视 控管规则设置 这是两个平行的功能 所以选用 Windows 的属性页 4 5 24 5 2界面设计文档界面设计文档 界面设计如下所示 第 9 页 共 25 页 1 1 封包监视界面封包监视界面 封包监视界面用来显示截获的网络封包 每个网络封包的具体内容根据实 际需要而定 如图 2 图 2 封包监视界面 封包的字段有 1 应用程序路径和名称 2 管制动作 放行或拒绝 3 访问起始 结束时间 4 使用网络协议 5 进 出流量 6 本地和远端 IP 地址 端口 7 备注信息 封包监视界面实时接收 DLL 发送过来的网络封包并立刻显示 在封包监视界面上设计了几个附加按钮 停止 开始滚动 用来设置监视 列表是否自动滚动 开始 停止监视 用来设置是否实时监视 清除 按钮 用来清除当前列表 这些功能按钮方面操作 2 2 控管规则界面控管规则界面 控管规则界面用来显示和设置控管规则 如图 3 需要说明的是 应用程 第 10 页 共 25 页 序设置的优先级高于控管规则设置 只是在应用程序设置为询问时 下面的控 管规则设置才有效 图 3 控管规则界面 控管规则的设计目的是为了制订对网络访问的控制 所以控管规则的字段 可以决定防火墙防范的严密性和灵活程度 控管规则的记录结构为 应用程序 远端网络 管制动作 进出方向 协议类型 使用端口 控管规则界面给出了 增加 删除 修改 3 个功能按钮用来对控管 规则进行不同的操作 其中选择增加和修改时都会弹出控管规则设置界面 1 控管规则设置界面 控管规则设置界面是用来设置控管规则的各个字段 如图 4 在 应用程 序 栏输入或选择要进行控管的应用程序的完整路径和文件名 远端网络 用 IP 地址范围表示 用来定义网络类型的 IP 地址范围 本 软件工划分为 5 个类型 所有网络 局域网 受约束的网络 信任的网络和自 第 11 页 共 25 页 定义网络 动作 用来确定符合这一条控管规则的网络访问动作是放行还是拒绝 方向 用来确定这一条控管规则适合于网络访问的连接方向 本机向远 端服务器发出连接请求就是出 远端主机向本机发出连接请求则为进 类型 是控管规则约定的协议类型 端口 是协议所使用的端口 图 4 控管规则设置界面 2 网络设置界面 网络设置界面用来对各种网络类型的 IP 地址段进行设置 如图 5 在上 节有关于远端网络类型的介绍 在这个界面上提供对 IP 地址段的增加 修改和 删除功能 第 12 页 共 25 页 图 5 网络设置界面 4 6 编码规则编码规则 变量命名规则如下 变量采用代表中文意思的英文单词或单词组合 变量一般不用缩写 用英文单词全称 较长的更为习惯的缩写 自定义全局变量用 m 开头 自定义过程变量不用 m 开头 变量的前缀用变量类型的第一个字母标志变量类型 如 指针类型在前 面多加一个字母 P 如果是对象 前缀用对象的名称 第一个字母大写 变量中有多个单词时 单词的第一个字母大写 其余用小写 有了自己的编码规则后 不会出现自己的弄不清楚自己定义的函数之类的 是什么意思 不知道函数是干什么的 以至于思维混乱 5 5 核心功能的代码实现核心功能的代码实现 本课题的核心功能实现封装在 DLL 里面 下面分析 DLL 的主要内容 5 1 DLLDLL 的封包截获的封包截获 BOOL WINAPI DllMain 是 DLL 的入口函数 系统调用时的标准接口 做一 些初始化工作 主要工作是得到调用这个程序的进程路径和名称并设置 DLL 调 用次数的计数器 WSPStartup 是 Windows Sockets 应用程序调用 SPI 的初始化函数 是服务 提供者的标准入口函数 这里的工作是根据 lpProtocolInfo 找出已经被替换的 服务提供者路径 然后加载 并利用被替换服务提供者的 WSPStartup 得到 30 个服务函数指针 需要先保存这些函数指针 然后将 lpProcTable 结构中的 30 第 13 页 共 25 页 个服务函数指针都设置成自己的 这样 相应的函数请求会首先经过我们自己 的函数 然后用这些函数可以做适当的处理 再调用原来的 将请求转发 完 成整个通信 int WSPAPI WSPStartup WORDwVersionRequested LPWSPDATAlpWSPData LPWSAPROTOCOL INFOWlpProtocolInfo WSPUPCALLTABLEupcallTable LPWSPPROC TABLElpProcTable ODS T WSPStartup if m CheckAcl m bIsWin9x TCHARsLibraryPath 512 LPWSPSTARTUP WSPStartupFunc NULL HMODULEhLibraryHandle NULL INT ErrorCode 0 if GetHookProvider lpProtocolInfo sLibraryPath hLibraryHandle LoadLibrary sLibraryPath NULL WSPStartupFunc LPWSPSTARTUP GetP rocAddress hLibraryHandle WSPStartup NULL return WSAEPROVIDERFAILEDINIT if ErrorCode WSPStartupFunc wVersionRequested lpWSPData lpProtoc olInfo upcallTable lpProcTable ERROR SUCCESS return ErrorCode if lpProcTable lpWSPAccept lpProcTable lpWSPAddressToString lpProcTable lpWSPAsyncSelect lpProcTable lpWSPBind lpProcTable lpWSPCancelBlockingCall lpProcTable lpWSPCleanup lpProcTable lpWSPCloseSocket 第 14 页 共 25 页 lpProcTable lpWSPConnect lpProcTable lpWSPDuplicateSocket lpProcTable lpWSPEnumNetworkEvents lpProcTable lpWSPEventSelect lpProcTable lpWSPGetOverlappedResult lpProcTable lpWSPGetPeerName lpProcTable lpWSPGetSockName lpProcTable lpWSPGetSockOpt lpProcTable lpWSPGetQOSByName lpProcTable lpWSPIoctl lpProcTable lpWSPJoinLeaf lpProcTable lpWSPListen lpProcTable lpWSPRecv lpProcTable lpWSPRecvDisconnect lpProcTable lpWSPRecvFrom lpProcTable lpWSPSelect lpProcTable lpWSPSend lpProcTable lpWSPSendDisconnect lpProcTable lpWSPSendTo lpProcTable lpWSPSetSockOpt lpProcTable lpWSPShutdown lpProcTable lpWSPSocket lpProcTable lpWSPStringToAddress return WSAEINVALIDPROCTABLE EnterCriticalSection NextProcTable lpProcTable lpProcTable lpWSPSocket WSPSocket lpProcTable lpWSPCloseSocket WSPCloseSocket lpProcTable lpWSPConnect WSPConnect lpProcTable lpWSPAccept WSPAccept lpProcTable lpWSPSend WSPSend lpProcTable lpWSPSendTo WSPSendTo lpProcTable lpWSPRecv WSPRecv lpProcTable lpWSPRecvFrom WSPRecvFrom 第 15 页 共 25 页 以上是我们截获并要用自己定义的函数 LeaveCriticalSection return 0 XfIoControl 是供 EXE 调用的 用来设置 DLL 的配置信息和得到 DLL 的反 馈信息 这个函数为 EXE 提供接口 EXE 通过这个函数来设置工作模式 或得 到截获的网络封包信息 QueryAccess 是在应用程序提交连网请求时 如果发现控管规则中没有关 于这个应用程序的控管规则 并且工作模式为询问 则向拥护发出询问 是否 让这个程序通行 GetHookProvider 用来读取注册表得到系统的 SPI 的 DLL 路径和文件信息 这个信息是安装时自己写入的 根据 pProtocolInfo 信息取出自己保存的 已 经被本程序替换的服务提供者路径 GetRightEntryIdItem 是供 GetHookProvider 调用的扩展函数 用来得 到保存系统服务提供者路径的注册表键名 及得到已经被本程序替换的服务提 供者的 dwCatalogEntryId XfShutdown 调用系统服务提供者函数 WSPShutdown 关闭一个 Socket 连接 并设置相应的错误代码 截获的服务提供者函数 过滤 WSPSocket WSPSocket 是用来创建 Socket 的函数 首先调用底层函 数得到新创建的 Socket 然后设置新建 Socket 的协议信息 并调用自定义函 数 CheckSocket 为这个 Socket 建立 Session 然后保存相应的信息 过滤 WSPCloseSocket 转发之前首先调用自定义函数 CheckCloseSocket 删除相应的 Session 过滤 WSPConnect 当一个 Socket 建立连接后调用这个函数 转发之前先 调用访问控制函数 CheckConnect 检查是否放行 如果不放行 返回错误 如 果放行 调用底层 WSPConnect 函数进行转发 过滤 WSPAccept 用来接受一个连接请求 首先调用底层函数 然后对连 接的合法性进行检查 如果不允许通过 关闭这个连接 过滤 WSPSend 这个函数用来发送面向连接的数据 先检查是否允许通过 然后进行转发 过滤 WSPSendTo 这个函数用来发送面向无连接的数据 先检查是否允许 通过 然后进行转发 过滤 WSPRecv 这个函数用来接收面向连接的数据 首先判断是不是重叠 第 16 页 共 25 页 操作并且设置回调函数 如果设置 则用自定义函数 AddOverlapped 保存参数 信息 然后用自己的回调函数代替原来的并转发 转发后根据返回值判断操作 是否成功 如果成功 则调用控管函数对操作的合法性进行判断 否则直接返 回 过滤 WSPRecvFrom 这个函数用来接收面向连接的数据 首先判断是不是 重叠操作并且设置回调函数 如果设置 则用自定义函数 AddOverlapped 保存 参数信息 然后用自己的回调函数代替原来的并转发 转发后根据返回值判断 操作是否成功 如果成功 则调用控管函数对操作的合法性进行判断 否则直 接返回 5 2 DLLDLL 的访问控管的访问控管 编写一个 CCheckAcl 它封装了一组对访问权限进行控制的函数 访问权 限主要是由控管规则设置决定 另外还封装了一组网络封包操作函数 下面是 一些主要函数及相应代码 5 2 15 2 1对服务提供者函数做管制的函数对服务提供者函数做管制的函数 CheckStartup 应用程序连网前的访问控制权限 在服务提供者函数 WSPStartup 中对访问权限进行控制 WSPStartup 是 Winsock 2 SPI 入口函数 每个应用程序连网时调用且仅调用一次这个函数 CheckSocket 检查 WSPSocket 函数 Socket 用来创建 Socket 在 Socket 创建时没有必要进行控管 所以仅仅用来创建 Session 并保存协议信息 CheckCloseSocket WSPCloseSocket 函数的预处理函数 用来删除相应的 Session CheckConnet 检查连接是否合法 在服务提供者函数 WSPConnet 调用系统 WSPConnet 函数建立之前 用 CheckConnet 调用 SetSession 填充一些网络封包 信息 然后调用 GetAccessInfo 判断这个连接是否被允许通过 CheckAccept 检查是否允许接受这个 Socket 连接 在服务提供者函数 WSPAccept 调用系统函数 WSPAccept 接受一个 Socket 连接后 用 CheckAccept 调用 SetSession 设置网络封包信息 然后调用 GetAccessInfo 检查这个 Socket 连接是否允许通过 CheckSend 在发送面向连接的数据前检查是否放行 在服务提供者函数 WSPSend 调用系统函数 WSPSend 发送数据前 用 CheckSend 调用 SetSessionEx 和 GetProtocolInfo 设置网络封包信息 然后调用 GetAccessInfo 检查是否允 许这个发送操作通过 CheckSendTo 在发送面向连接的数据前检查是否放行 在服务提供者函数 WSPSendTo 调用系统函数 WSPSendTo 发送数据前 用 CheckSendTo 调用 第 17 页 共 25 页 SetSessionEx 和 GetProtocolInfo 设置网络封包信息 然后调用 GetAccessInfo 检查是否允许这个发送操作通过 CheckRecv 在接收面向连接的数据时检查是否放行 在服务提供者函数 WSPRecv 调用系统函数 WSPRecv 发送数据后 用 CheckRecv 调用 SetSessionEx 和 GetProtocolInfo 设置网络封包信息 然后调用 GetAccessInfo 检查是否允 许这个接收操作通过 CheckRecvFrom 在接收面向连接的数据时检查是否放行 在服务提供者函 数 WSPRecvFrom 调用系统函数 WSPRecvFrom 发送数据后 用 CheckRecvFrom 调用 SetSessionEx 和 GetProtocolInfo 设置网络封包信息 然后调用 GetAccessInfo 检查是否允许这个接收操作通过 5 2 25 2 2封包处理函数封包处理函数 InitializeSession 对网络封包记录进行初始化 CreateSession 创建一个新的网络封包记录 根据参数 s 和 nProtocol 得 出协议信息 并将时间和应用程序信息一并写进这个新建的网络封包记录里 DeleteSession 从已有的网络封包记录中删除一条 在删除之前首先调用 SendSessionToApp 函数 将需要删除的记录发送给 EXE FinallySession 将所有没有结束的网络封包记录全部发送到 EXE 中 有 EXE 显示在封包监视界面上 SendSessionToApp 将传递过来的网络封包记录保存到进程间的共享变量里 然后通过消息告诉 EXE 从变量中取出封包 GetSessionAndSetSessionNullEXE 用来得到封包数据并在得到后将缓冲区 清空 5 2 35 2 3管制函数管制函数 IsLocalIP 判断 IP 地址是否为本机 IP 同时判断本次调用 DLL 的应用程 序是否为需要放行的超级进程 GetAccessInfo 得到访问权限信息 调用 GetAccessFromAcl 扩展函数进 一步得到访问的权限信息 GetAccessFromWorkMode 从工作模式判断是否放行 GetAccessFromAcl 用网络封包记录和控管规则进行对比 得到连接的访 问权限 这个函数首先检查网络封包记录的完整性 如果数据不完整则直接放 行 然后判断目的地址是否为本机 或应用进程是否为超级进程 如果是则放 行 否则利用控管规则继续判断 如图 6 所示 第 18 页 共 25 页 开始 调用DLL的进程名是否为空 调用进程是否为系统进程 目的IP是否本地IP 检查工作模式 在控管规则中查找是否有关于这个进程调用的规则 检查这条控管规则的进出方向和当前连接的方向是否相同 检查这条控管规则的协议和当前连接的是否相同 检查这条控管规则的IP和当前连接的目的IP是否相同 检查这条控管规则的Action是否为PASS 检查这条控管规则的端口和当前连接的端口是否相同 返回 PASS 结束 返回 PASS 返回 PASS 返回 PASS 返回 PASS 是否第一次查找 上一个找到的控管规则的 Action是否为PASS 返回 QUERY 返回 DENY 返回 PASS 返回 DENY 返回 DENY 否 否 否 Query 有 相同 相同 相同 相同 是 是 是 是 Pass All Deny All 没有 是 否 是 否 否 不相同 图 6 控管规则比对流程图 int CCheckAcl GetAccessFromAcl SESSION mSession 第 19 页 共 25 页 下面的判断语句表示 如果控管规则文件无效 进程名无效 是本机 IP 或是超级进程 则返回放行动作 if tcscmp m AclFile mAclHeader sSignature XF INVALID PRO CESS 0 tcscmp m sGuiPathName m sProcessName 0 IsLocalI P intiRet 下面 5 行表示 从工作模式判断是否放行 if iRet GetAccessFromWorkMode XF FILTER return iRet BOOLIsOne TRUE DWORDiIndex 0 BYTEbAction ACL ACTION PASS 下面的代码表示 没有匹配的控管规则 执行询问 有完全匹配的控管规则 按照控管规则的控管动作返回 没有完全匹配和控管规则但是有与进程匹配的控管规则 按最后一条与进程匹配的控管规则的管制动作取反 COMPARE if IsOne iIndex iIndex FindAcl m sProcessName iIndex if iIndex m AclFile mAclHeader ulAclCount if IsOne if m
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-江苏-江苏经济岗位工一级(高级技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-江苏-江苏堤灌维护工一级(高级技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-江苏-江苏不动产测绘员三级(高级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-广西-广西行政岗位工二级(技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-广西-广西水工闸门运行工五级(初级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-广东-广东造林管护工五级(初级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-广东-广东水生产处理工三级(高级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-广东-广东放射技术员五级(初级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-广东-广东仓库管理员三级(高级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-安徽-安徽下水道养护工二级(技师)历年参考题库典型考点含答案解析
- XXX加油站风险分级管控台账
- 甘12J8 屋面标准图集
- 购买设备合同
- GB/T 28288-2012足部防护足趾保护包头和防刺穿垫
- GB/T 19666-2019阻燃和耐火电线电缆或光缆通则
- GA/T 1241-2015法庭科学四甲基联苯胺显现血手印技术规范
- 小学和初中科学教学衔接
- 《循证医学》治疗性研究证据的评价和应用
- “李可中医药学术流派论治厥阴病”-课件
- 通用技术作品设计报告
- JJF 1847-2020 电子天平校准规范-(高清现行)
评论
0/150
提交评论