NDIS TCP 本地发包转向到本地端口的问题

MikeCheers 2019-08-25 06:22:23
嗨,大家好,驱动新人,驱零三个月,请多指教。

小弟最近碰到一个问题,在IM Filter中,想要把本机发往服务器的流量重定向到本机的指定端口,经过处理后,再进行后续操作。
设置了Package的Flag为NDIS_FLAGS_LOOPBACK_ONLY,修改了包的Mac, Ip, Port,重新作了CheckSum,可以看到本地也收到了这个包,是一个SYN包,但是系统却没有再发响应包,不知为何。望大神指点一二。

本机Socket:192.168.18.41:1274,目标服务器:192.168.18.3:80,想要转向的监听:192.168.18.41:43210

17:26:03>OnSend>原始包>PakFlag: [0082] 00-0C-29-FD-30-CD:192.168.18.41:1274 --> 14-DA-E9-77-34-9F:192.168.18.3:80
17:26:03>OnSend>重打包>PakFlag: [0102] 00-0C-29-FD-30-CD:192.168.18.41:1274 --> 00-0C-29-FD-30-CD:192.168.18.41:43210

17:26:03>OnRecv>原始包>PakFlag: [0100] 00-0C-29-FD-30-CD:192.168.18.41:1274 --> 00-0C-29-FD-30-CD:192.168.18.41:43210
17:26:03>OnRecv>重打包>PakFlag: [0002] 00-0C-29-FD-30-CD:192.168.18.41:1274 --> 00-0C-29-FD-30-CD:192.168.18.41:43210
---------------------------------------------------------------------------------------
17:26:06>OnSend>原始包>PakFlag: [0082] 00-0C-29-FD-30-CD:192.168.18.41:1274 --> 14-DA-E9-77-34-9F:192.168.18.3:80
17:26:06>OnSend>重打包>PakFlag: [0102] 00-0C-29-FD-30-CD:192.168.18.41:1274 --> 00-0C-29-FD-30-CD:192.168.18.41:43210
17:26:06>OnRecv>原始包>PakFlag: [0100] 00-0C-29-FD-30-CD:192.168.18.41:1274 --> 00-0C-29-FD-30-CD:192.168.18.41:43210
17:26:06>OnRecv>重打包>PakFlag: [0002] 00-0C-29-FD-30-CD:192.168.18.41:1274 --> 00-0C-29-FD-30-CD:192.168.18.41:43210

这里,是TCP握手的第一个SYN包的发送和接收;
第一、二行,是发送前后对比,第三、四行是接收前后对比。
第五六七八行,就TCP的超时重发。

PakFlag: 0x0002是 NDIS_PROTOCOL_ID_TCP_IP
PakFlag: 0x0082是 NDIS_PROTOCOL_ID_TCP_IP | NDIS_FLAGS_DONT_LOOPBACK
PakFlag: 0x0100是 NDIS_FLAGS_IS_LOOPBACK_PACKET
PakFlag: 0x0102是 NDIS_PROTOCOL_ID_TCP_IP | NDIS_FLAGS_IS_LOOPBACK_PACKET

我之前实验过,如果是在其他机器上,建立43210端口的监听,这种转向,是没问题的,建立TCP连接,发送和回复数据都没有问题;
可是,在本机建立监听,就不行了。可能还是回环的机制我没有弄明白。
大家能不能帮我看看,是什么问题么?提供思路,不胜感激。
...全文
183 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
MikeCheers 2019-08-26
  • 打赏
  • 举报
回复
引用 1 楼 weixin_42111809 的回复:
调通就好.很6
多亏你的耐心帮忙。
下面来总结一下心得,留作记录吧:

本来在不同的机器上,测试没有问题,合并到一台,就不行了,思索了半天,不得其解,最后还是在与@weixin_42111809神聊中,扩开了思路,特此感谢。废话不说,简要说说实现的要点。

前提:本机Socket:192.168.18.41:1274,目标服务器:192.168.18.3:80,自定义监听:192.168.18.41:43210

要把本机Socket发送给目标服务器的数据包,先转发给自定义监听,分几个步骤:
1/ 本机Socket --Send--> 目标服务器:
1.1/ 要把目的的MAC和IP和端口修改为自定义监听的MAC和IP和端口 (这一步是通用的,无论是想要转到本机端口还是其他机器上)
1.2/ 把Package的Flags设置为 NDIS_FLAGS_IS_LOOPBACK_PACKET(否则,在本机是收不到这个包的)
1.3/ 重新计算CheckSum
1.4/ 发送给下层NIC
2/ 中间驱动 --Recv--> 本机Socket发送包
2.1/ 要将来源MAC和IP修改为目标服务器的MAC和IP,注意,这里没有修改端口,因为这时,端口是本机Socket的端口,保留着挺好,本身它就是一个变化的值,否则还得找地方做记录。
2.2/ 把Package的Flags设置为 NDIS_PROTOCOL_ID_TCP_IP(否则,TCP/IP会丢弃回环包)
2.3/ 重新计算CheckSum
2.4/ 发送给上层协议(也就是走到自定义监听去了,当然,TCP的SYN包、ACK包不会走那么远……)
注意,这时,就伪装成了目标服务器要与自定义监听建立连接了;
3/ 自定义监听 --Send--> 目标服务器:
3.1/ 要把目的的MAC和IP修改为本机的MAC和IP,注意这里不修改端口,因为2.1的保留,这时有用了。
3.2/ 把Package的Flags设置为 NDIS_FLAGS_IS_LOOPBACK_PACKET(否则,在本机是收不到这个包的)
3.3/ 重新计算CheckSum
3.4/ 发送给下层NIC
4/ 中间驱动 --Recv--> 自定义监听发送包
4.1/ 要将来源MAC和IP和端口修改回目标服务器的MAC和IP和端口。
4.2/ 把Package的Flags设置为 NDIS_PROTOCOL_ID_TCP_IP(否则,TCP/IP会丢弃回环包)
4.3/ 重新计算CheckSum
4.4/ 发送给上层协议(也就是走到本机Socket去了,当然,TCP的SYN包、ACK包不会走那么远……)

就这样反复这四步,TCP的通讯就建立起来了~
weixin_42111809 2019-08-26
  • 打赏
  • 举报
回复
调通就好.很6

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧