WFP 原理
(WIN7 32位开发驱动: X86的纯净版的KEY:
HTXFV-FH8YX-VCY69-JJGBK-7R6XP)
数据流处理: (入站和出站都是一样)
1. 一个包进入到了协议栈
2. 协议栈找到并发现一个shim(垫片),应该就是很多的sublayer注册的地方。
3. 该shim(垫片)调用该特定的sublayer层注册的Classfication分类进行处理。
4. 在分类处理期间,过滤器开始工作,进行条件匹配,如果条件匹配上,那么就开始调用对应的callout
5. 如果过滤器的结果是匹配的,调用对应的callout的处理函数,classfyFn()
6. 垫片执行最终的过滤决定(permit还是deny)
WFP的架构图:
TCP流量包分析: (PC基本上的场景都是客户端,所以只是针对客户端进行分析)
1. TCP链接建立
- bind: FWPM_LAYER_ALE_BIND_REDIRECT_V4 (Windows 7 / Windows Server 2008 R2 only)
- bind: FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V4
- connect: FWPM_LAYER_ALE_CONNECT_REDIRECT_V4 (Windows 7 / Windows Server 2008 R2 only) ---链接重定向
- connect: FWPM_LAYER_ALE_AUTH_CONNECT_V4 ----链接授权,允不允许连接
- SYN: FWPM_LAYER_OUTBOUND_TRANSPORT_V4 ----发送SYN
- SYN: FWPM_LAYER_OUTBOUND_IPPACKET_V4 ---IP层的SYN
- SYN-ACK: FWPM_LAYER_INBOUND_IPPACKET_V4
- SYN-ACK: FWPM_LAYER_INBOUND_TRANSPORT_V4
- FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4 ----链接建立
- ACK: FWPM_LAYER_OUTBOUND_TRANSPORT_V4
- ACK: FWPM_LAYER_OUTBOUND_IPPACKET_V4
2. TCP的数据流的传输
Client (sender)
- send
- data: FWPM_LAYER_STREAM_V4 ---数据层
- TCP segments: FWPM_LAYER_OUTBOUND_TRANSPORT_V4
- IP datagrams: FWPM_LAYER_OUTBOUND_IPPACKET_V4
WFP开发之路:
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/network/windows-filtering-platform-callout-drivers2
大致就是: 先学习WFP架构,学习windows架构和驱动,选择windows的驱动模式(用户还是内核),驱动编译,github的驱动示例,开发,编译,测试,调试,创建驱动包,给包签名然后发布等等.
WFP简介:
- Callout驱动的目的,可以进行深度检查,可以决定哪些数据阻止,哪些允许,哪些可以传递到下一个过滤器,或者病毒厂商,可以匹配病毒特征。
- 可以进行包的修改和重新注入到网络的包头。NAT地址转换,就是修改头进行转换。(DDProxy就可以直接修改UDP头)
- 可以进行流量内容修改,可以删除或者替换特定的单词。
- 流量日志,用于网络监控产品。
WFP中的Callout:
Callout驱动提供额外的过滤函数,通过注册一个或者多个callout在一个filterEngine中实现。
参考:
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/network/windows-filtering-platform-callout-drivers2
https://msdn.microsoft.com/en-us/library/windows/desktop/aa363977(v=vs.85).aspx