




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
从 Socket Api 到 Tdi 驱动 当我想写一个基于进程的流量防火墙 仅显示流量 暂不做限流 我翻开了寒江 阅读上 面的 TDI 驱动一节 然后我就懵了 地址对象和连接对象到底是个啥 为啥 IRP MJ CREATE 会被调用两次 跟我在上层的 socket api 调用有啥联系 为啥要记录地址 对象和连接对象的对应关系呢 于是 我想从 Socket Api 到 TDI 驱动顺一遍 到底它们的 联系是啥 下面的分析基于 ReactOS 0 3 1 源码分析思路结构来源于毛德操老师的 Windows 内核情 景分析 一 一 建立建立 socket socket AF INET SOCK STREAM IPPROTO TCP 该 api 调用了 WSPSocket 该函数由 ws2 32 dll 提供 dll win32 msafd misc Dllmain c 可以看到 注意 ZwCreateFile 的各个参数 其中 Object 参数中指定了要打开的对象名为 DevName 即 Device Afd Endpoint 而 EABuffer 中 则写入了通过 SockGetTdiName 获得的 TransportName 其实呢 这个 TransportName 就是 Device Tcp Device Udp Device RawIp Device Afd Endpoint 是 Afd 驱动创建的设备 我想你应该明白了 ws2 32 dll 是通过操作 Afd 驱动完成各个操作的 为了更好的了解该 Socket 对象中对我们有益的细节 我们会继续查看 Afd 驱动中的相 关内容 Afd 驱动中 AfdDispatch 中调用了 AfdCreateSocket drivers network afd afd Main c 可以看到 该 FileObject 的 FCB 中 TdiDeviceName 被初始化成了通过 EaBuffer 传入的 TransportName 这里需要注意下 因为分析下面的时候还会出现 到此 Socket 的创建完成 并没有创建传说中的地址对象 连接对象 并没有牵涉到 Device Tcp Device Udp Device RawIp 二 绑定二 绑定 socket bind flexSocket sockaddr sockAddr sizeof sockAddr 该 api 调用 WSPBind dll win32 msafd msafd Dllmain c 此处同样的 将调用到 Afd 驱动中的 DeviceIoControl 接口 Drivers network afd afd Main c AfdDispatch AfdBindSocket 可以很清楚的看到 AfdBindSocket 调用了 WarmSocketForBind 并将 FCB 作为参数传入 检 查该函数 Drivers network afd afd bind c 我相信 你肯定激动了 看到没 我们要的地址对象似乎要出现了 起码名字很像 这边调用 TdiOpenAddressFile 传入了 FCB 的 TdiDeviceName 而 TdiDeviceName 我们上面 看过了 就是 Device Tcp Device Udp Device RawIp 之类的 Drivers network afd afd Tdi c 这边我们看到了调用了 TdiOpenDevice 其中 DeviceName 就是 Device Tcp Device Udp 之类的 并且把一个 TRANSPORT ADDRESS 结构体作为 EaInfo 传入了 进入 TdiOpenDevice Drivers network afd afd Tdi c 相信看到这里你应该明白了 Afd 驱动通过 ZwCreateFile 调用了 Device Tcp Device Udp 这些设备的驱动 他们的驱动就是 tcpip sys 查看该驱动的代码 弄清楚 ZwCreateFile 做了啥 Drivers network tcpip tcpip Main c 进入 TiCreateFileObject Drivers network tcpip tcpip Main c 在 TiCreateFileObject 中调用了 FileOpenAddress 然后将获得的相关信息作为 FsContext2 写入到了 FileObject 中 这里恕我只写出 TiCreateFileObject 的部分 更完整的分析参见第 三部分 这应该就是所谓的创建了地址对象 也就是说 WSPBind 中通过调用 Afd 驱动提供的接口创建了所谓的地址对象 而 Afd 驱动则是通过 ZwCreateFile 调用了 tcpip 驱动 从而创建出所谓的地址对象 我们的 TDI 驱动就是 Attach 到 tcpip 驱动创建的设备对象中截获 IRP MJ CREATE 和 IRP MJ INTERNAL DEVICE CONTROL 等 IRP 进行进程级别的防火墙监控的 其实 TDI 驱动中截获的地址对象的创建就是代表着我们在调用 WSABind 或者 bind 函数 那所谓的连接对象又是在哪儿创建的呢 代表着 socket 操作的啥意思呢 三 三 listen 或或 connect 使用 TCP 通信时 客户端调用 connect 连接到远端主机 服务器端调用 listen 监听连接 调用 accept 接受远端客户的连接 dll win32 msafd misc Dllmain c 跟上面的情况一样 socket api 通过调用 Afd 驱动提供的接口 完成该操作 看 Afd 驱动中的处理接口 AfdDispatch AfdListenSocket Drivers network afd afd listen c 这里你会看到一个极其重要的函数 WarmSocketForConnection 赶紧紧睁双眼 盯紧该 函数 Drivers network Afd Afd Connect c 看这短短的 WarmSocketForConnection 中调用的两个函数 你应该就会感兴趣 貌似 传说中的连接对象要出来了 先来分析 TdiOpenConnectionEndpointFile 看到了 依然是调用 TdiOpenDevice 只不过这次的 EaInfo 部分传递的不一样 但是 DeviceName 都是来自于 FCB TdiDeviceName 你懂了吧 事实上该 DeviceName 就是 Device Tcp Device Udp 等 就是通过 TdiOpenDevice 再次调用了 tcpip 驱动的 IRP MJ CREATE 这次 我们将完整地阅读 tcpip 驱动的 IRP MJ CREATE 的处理函数 TiCreateFileObject Drivers network tcpip tcpip Main c 可以看到 整个 TiCreateFileObject 根据 EaInfo 决定如何初始化 FileObject 的 FsContext2 所谓的 FileOpenAddress 是在初始化其地址对象 而所谓的 FileOpenConnection 则是初 始化其连接对象的内容 再看 WarmSocketForConnection 调用的第二个函数 TdiAssociateAddressFile Drivers network afd afd Tdi c 容易看出来 Afd 驱动中又创建了一个 IRP MJ INTERNAL DEVICE CONTROL 然后调用 tcpip sys 来处理 Drivers network tcpip tcpip Main c 到底为止 应该明白了 在我们调用 listen 时 其实我们通过 Afd 驱动 通过 tcpip sys 的 IRP MJ CREATE 创建了一个连接对象 之后通过 tcpip sys 使用 IRP MJ INTERNAL DEVICE CONTROL 的 TDI ASSOCIATE ADDRESS 将连接对象和先前 bind 时创建的地址对象关联了起来 返回到 AfdListenSocket 函数中 在调用 WarmSocketForConnection 创建并关联连接对象后 又调用了 TdiListen 稍微注意下就 明白 之后又通过 IRP MJ INTERNAL DEVICE CONTROL 的 TDI LISTEN 调用了 tcpip 驱 动进行相应的处理 Connect 的调用与此类似 读者可自行分析 四 四 send 调用调用 send sockfd buf len 0 同样是调用 Afd 驱动 直接看 Afd 驱动是怎么调用 Tcpip 驱动的 AfdDispatch AfdConnectedSocketWriteData Drivers network afd afd Write c 在 AfdConnectedSocketWriteData 中如果是无连接的 直接通过 TdiSendDatagram 发送 通过创建的地址对象即可 如果是有连接的 通过 TdiSend 使用先前创建 的连接对象发送 这里只看 TdiSend 看到这儿 你应该明白了 其实就是调用 tcpip sys 通过 IRP MJ INTERNAL DEVICE CONTROL 的 TDI SEND 而且使用的是连接对象 这下你知道为啥要在我们的 TDI 驱动中关联地址对象和连接对象了吧 如果不关 联 拦截到发送后 你根本不知道它对应的地址端口是多少 因为发送仅仅对连 接对象调用 IRP MJ INTERNAL DEVICE CONTROL 五 五 总结总结 总而言之 socket api 通过 afd 驱动完成功能 而 afd 驱动
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 零售业顾客满意度提升方法与案例
- 中考古诗文复习资料及背诵指导
- 办公设备使用说明书范本
- 民族苗族介绍课件
- 西南科技大学《油画风景技法》2024-2025学年第一学期期末试卷
- 新疆大学《舞弊审计》2024-2025学年第一学期期末试卷
- 大学科研成果转化路径分析报告
- 江苏师范大学科文学院《龙江精神专题》2024-2025学年第一学期期末试卷
- 长春医学高等专科学校《小学教育研究方法基础》2024-2025学年第一学期期末试卷
- 新疆应用职业技术学院《化工安全工程》2024-2025学年第一学期期末试卷
- 枣庄学院《图学基础与计算机绘图》2024-2025学年第一学期期末试卷
- 2025-2030城市矿产开发利用政策支持与商业模式创新报告
- 产品线库存管理与补货预测系统
- 酒店账单-水单-住宿
- 中医门诊病历(共7篇)
- GB/T 4372.1-2014直接法氧化锌化学分析方法第1部分:氧化锌量的测定Na2EDTA滴定法
- 日语动词分类课件 【高效课堂+备课精研】 高考日语一轮复习
- 妇产科学-第十二章-正常分娩课件
- 1【L】系列离心式冷水机组技术手册
- Q∕SY 1753-2014 炼化循环水用缓蚀阻垢剂技术规范
- 压焊方法及设备
评论
0/150
提交评论