首页
论坛
课程
招聘
[求助]WFP数据流层tcp数据拦截问题
2022-8-4 10:35 6040

[求助]WFP数据流层tcp数据拦截问题

2022-8-4 10:35
6040

我做了一个关于tcp数据采集和篡改的项目,用了WFP的过滤框架注册了Stream层(FWPM_LAYER_STREAM_V4)回调,在回调中需要将tcp send数据拦截并传给应用层做业务处理,应用层会根据业务需求通知过滤驱动如果处理这包数据(放行、阻止或篡改)。
开发过程中我发现在stream层回调中 中断级别是dispatch,这导致我不能在过程中以wait方式与应用层交互,只能在处理中保存tcp send数据并设置阻止标志让本次回调通过,应用层业务处理后再通过inject stream的方式将篡改的数据重新注入流,这在tcp长连接是没问题的,但有些程序会是短连接,send数据后立刻断连,导致后注入的流无法发送。
请问大家有类似经历吗,请指导一下给些建议,多谢


看雪2022 KCTF 秋季赛 防守篇规则,征题截止日期11月12日!(iPhone 14等你拿!)

收藏
点赞1
打赏
分享
最新回复 (11)
雪    币: 63
活跃值: 活跃值 (157)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
opq哲哥 活跃值 2022-8-4 10:37
2
0
我尝试过注册FWPM_LAYER_ALE_ENDPOINT_CLOSURE_V4层回调,pend 关闭节点,但这一点用处都没有
雪    币: 224
活跃值: 活跃值 (1219)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_0xC05StackOver 活跃值 2022-8-4 19:51
3
1
你用微软的inject方案试一下 我记得IRQL Dispatch级别的问题应该需要直接drop这个包并把它reinject到协议栈中,等他再来的时候不是高IRQL级别才能完整处理,微软的WDK代码中有这个案例
雪    币: 63
活跃值: 活跃值 (157)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
opq哲哥 活跃值 2022-8-5 10:18
4
0
wx_0xC05StackOver 你用微软的inject方案试一下 我记得IRQL Dispatch级别的问题应该需要直接drop这个包并把它reinject到协议栈中,等他再来的时候不是高IRQL级别才能完整处理,微软的WDK代码中 ...
我很感兴趣这个方案,但却找不到相关资料,有没有详细点的资料发我下,真的非常感谢
雪    币: 63
活跃值: 活跃值 (157)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
opq哲哥 活跃值 2022-8-5 12:00
5
0
wx_0xC05StackOver 你用微软的inject方案试一下 我记得IRQL Dispatch级别的问题应该需要直接drop这个包并把它reinject到协议栈中,等他再来的时候不是高IRQL级别才能完整处理,微软的WDK代码中 ...
我找到了相关资料和例子,这个例子是在传输层上挂的,有没有在stream层的方案
雪    币: 224
活跃值: 活跃值 (1219)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wx_0xC05StackOver 活跃值 2022-8-5 14:24
6
0
opq哲哥 我找到了相关资料和例子,这个例子是在传输层上挂的,有没有在stream层的方案
要不这样 你去抄Wireshark的方案,wireshark用了npcap的驱动也是WFP的 他这里肯定有你要的东西 应为wireshark也是把数据回发到ring3的 https://npcap.com/dist/npcap-1.70.zip 这是npcap 1.7的sourcecode
雪    币: 63
活跃值: 活跃值 (157)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
opq哲哥 活跃值 2022-8-5 15:00
7
0
wx_0xC05StackOver 要不这样 你去抄Wireshark的方案,wireshark用了npcap的驱动也是WFP的 他这里肯定有你要的东西 应为wireshark也是把数据回发到ring3的 https://npcap.c ...
非常感谢,我这就看下
雪    币: 63
活跃值: 活跃值 (157)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
opq哲哥 活跃值 2022-8-5 16:34
8
0
其实还是有短连接的问题,程序tcp send后立刻close,后注入的不论是stream或packet都无法正常发送了
雪    币: 63
活跃值: 活跃值 (157)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
opq哲哥 活跃值 2022-8-9 15:29
9
2
解决了,在stream callout里面引用net buffer list,这样可以阻止tcp close释放资源,并且我们inject stream也都可以正常发送,最后释放引用就好
雪    币: 153
活跃值: 活跃值 (105)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
三杨 活跃值 2022-9-14 13:38
10
0
opq哲哥 解决了,在stream callout里面引用net buffer list,这样可以阻止tcp close释放资源,并且我们inject stream也都可以正常发送,最后释放引用就好
请问在FWPM_LAYER_STREAM_V4, 如何将修改过的数据重新注入,有推荐的网页或git项目吗? 谢谢
雪    币: 11352
活跃值: 活跃值 (8020)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
一半人生 活跃值 5 2022-10-12 08:59
11
0


opq哲哥 解决了,在stream callout里面引用net buffer list,这样可以阻止tcp close释放资源,并且我们inject stream也都可以正常发送,最后释放引用就好

WFP中所指NetBufferList回调中第三个参数?

FWPS_STREAM_CALLOUT_IO_PACKET* streamPacket;    
FWPS_STREAM_DATA* streamData;
streamPacket = (FWPS_STREAM_CALLOUT_IO_PACKET*) packet;
streamData = streamPacket->streamData;

// 改包或者需要重注
streamPacket->streamAction = FWPS_STREAM_ACTION_NONE;
streamPacket->countBytesRequired = 0;
streamPacket->countBytesEnforced = streamData->dataLength;
classifyOut->actionType = FWP_ACTION_BLOCK;
classifyOut->flags |= FWPS_CLASSIFY_OUT_FLAG_ABSORB;
classifyOut->rights &= ~FWPS_RIGHT_ACTION_WRITE;
最后于 2022-10-12 09:01 被一半人生编辑 ,原因:
雪    币: 11352
活跃值: 活跃值 (8020)
能力值: ( LV12,RANK:312 )
在线值:
发帖
回帖
粉丝
一半人生 活跃值 5 2022-10-12 09:04
12
0
三杨 请问在FWPM_LAYER_STREAM_V4, 如何将修改过的数据重新注入,有推荐的网页或git项目吗? 谢谢
https://bbs.pediy.com/thread-268515.htm 评论区中的资源Netfilter SDK有你需要的过滤
游客
登录 | 注册 方可回帖
返回