首页
社区
课程
招聘
WFP开发学习笔记
发表于: 2016-12-13 15:25 9548

WFP开发学习笔记

2016-12-13 15:25
9548

WFP开发学习笔记:

自己在开发学习过程中得到的经验,供新手参考,老鸟请指点不足之处:

1.如何关联数据(路径、进程ID等)到其他层?
答:使用函数FwpsFlowAssociateContext。

2. FlowContext关联的数据是否可以关联到FWPS_LAYER_*任意层?
答:经过实践测试,发现数据可以关联到TRANSPORT以上层,但不能关联到IPPACKET层(原因未知,微软没有给出明确说明)。

3.TRANSPORT层是否包含了IP头?
答:发送时MDL中部分包含IP头,部分不包含IP头(原因未知,也可能是数据从应用层往下传时,系统还未加上IP头信息)。接收时MDL中都包含有IP头。

4.IPPACKET层是否包含了IP头?
答:发送时OUTBOUND,MDL中全部包含了IP头,MDL的偏移量与数据长度都正确。
    接收时INBOUND,MDL中全部包含了IP头,但MDL的偏移量与数据长度不匹配(原因未知)。且接收时微软默认把IP头给隐藏了(原因未知),可以通过修改偏移量来获取有效IP头。
具体变量为:NetBuffer->DataLength(真实长度),NetBuffer->CurrentMdlOffset(真实偏移地址,如果需要获取IP头,需要前移),Mdl->ByteCount(此数据接收时不准,需根据实际数据长度去获取数据,类似UNICODE_STRING)。

5.接收时MDL中的偏移量与数据长度不匹配该如何调整,获取有效数据?
答:通过函数NdisRetreatNetBufferDataStart 前移偏移地址。
    通过函数NdisAdvanceNetBufferDataStart 还原便宜地址。
通过函数 NdisGetDataBuffer或者自己写获取数据函数。记得需要判断偏移地址CurrentMdlOffset所在的MDL,和实际的数据长度。

6. FWPM_LAYER_ALE_AUTH_CONNECT_V4与FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4的区别。
答:FWPM_LAYER_ALE_AUTH_CONNECT_V4 不带数据包,只是一个发起连接的动作,里面不能进行数据拦截操作。
FWPM_LAYER_ALE_FLOW_ESTABLISHED_V4带有数据包,里面可以进行数据拦截操作。

7.可否修改IP数据包?
答:可以修改IP数据包。修改IP包信息,在IPAPCKET层。修改TCP/UDP包信息,在TRANSPORT层。修改数据包体,在ALE层即可。

8.可否获取整个IP包数据?
答:不能获取MAC包数据,WFP只支持获取IP头以后的数据。后面的WDK版本可能支持获取MAC包数据。

9.新接触WFP该参考哪些资料?
答:参考 D:\WinDDK\7600.16385.1\src\network\trans 目录下的工程,或者参考看雪上面的例子,还有寒江的第15章(入门用)。

10.WFP启动/结束流程图:(图1)

11.FlowContext操作流程和注意事项?
答:要关联Context,注册callout时必须有Deletion回调函数,否则关联会失败。
1.创建Context。2.添加到Context链表。3.关联Context。4.在指定层通过参数UINT64 flowContext获取Context。
5.使用Context。6.Context生命周期结束时,系统会自动调用Deletion回调函数,你需要在此从链表删除并释放内存。7.驱动卸载时,通过执行FwpsFlowRemoveContext,将没有销毁的Context销毁掉。调用FwpsFlowRemoveContext后,删除过程还会出现在Deletion回调函数中(注意)。

12.个人对WFP的简单理解:
注册一组回调函数,所有进出网络数据系统都会调用这组回调函数,你在里面进行逻辑判断,得出结果BLOCK/PERMIT,系统根据你提供的结果进行拦截/放行。

13.WFP常用函数:
FwpsInjectionHandleCreate
FwpsInjectionHandleDestroy
FwpsQueryPacketInjectionState
FwpmEngineOpen
FwpmEngineClose
FwpmTransactionBegin
FwpmTransactionCommit
FwpmTransactionAbort
FwpsCalloutRegister
FwpmCalloutAdd
FwpmSubLayerAdd
FwpmFilterAdd
FwpsCalloutUnregisterById
FwpsFlowAssociateContext
FwpsFlowRemoveContext
MmGetSystemAddressForMdlSafe



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 2
支持
分享
最新回复 (6)
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
是说现在的WDK10还修改不了MAC层是吧
2016-12-16 15:12
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我看到msdn上有注入MAC层数据包的方法,是不是说可以修改MAC层的数据再发送
2016-12-16 15:16
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
哦 看到了 从win8开始支持,可怜我做的是win7 = =
2016-12-16 15:18
0
雪    币: 79
活跃值: (59)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
WIN10应该是支持修改MAC了,不过需要高版本的WFP.如果需要修改MAC,就用NDIS6吧
2017-1-5 12:12
0
雪    币: 212
活跃值: (102)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
有个问题,WFP能不能拦截指定域名的访问呢??因为如果域名使用了CDN,这样总不太好把所有CDN的IP都拦截了。。估计用户很多网站也会访问不了。
2017-1-21 18:41
0
雪    币: 3736
活跃值: (3867)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
回帖收藏!
2018-4-23 15:00
0
游客
登录 | 注册 方可回帖
返回
//