window filter platform (wfp)修改TCP数据包的方法

问题描述:使用WFP重定向了TCP链接到本地localhost后,为了能够告诉应用层原始链接的地址和端口,需要修改数据包,即在三次握手后插入一个自定义包。在实现这个小小功能时,遇到了不少问题,走了很多弯路,希望在此记录一下,以备不时之需,也希望能够对有需要的朋友有所帮忙,因为WFP驱动,基本没有中文资料,所有的资料和问题都需要亲自到MSDN找,也是大费周折。
很显然,TCP的重定向,参考了MSDN的资料后(tcp重定向之MSDN资料),很快的实现了重定向到本地服务进程,但是要让服务进程知道原始链接的地址和端口,我一开始是在FWPM_LAYER_OUTBOUND_TRANSPORT_V4这一层去设置ClassiFy回调函数,因为按照数据传输流程,在这一层,数据包已经包含了TCP头,所以要想在这里改变数据包,十分困难,需要自行维护SYN和ACK计数,这基本是出力不讨好的事,很容易出错。经历了两周的不同方法的尝试,最后在FWPM_LAYER_STREAM_V4这一层设置回调函数,成功的改变了数据包的内容,之所以能成功,是因为这一层,数据包还没有进行任何的tcp或者ip组包,这就不需要自己去维护SYN和ACK计数,十分方便,只要判断好streamFlag是FWPS_STREAM_FLAG_SEND还是FWPS_STREAM_FLAG_RECV就可以控制数据了。就这么一个简简单单的问题,我曾在MSDN发帖相问,也没人愿意解答,所以就只能自己摸索,这里因为商业的事情,就不再贴代码了,不过已经将解决类似问题的方法给了出来。
此外,很有必要了解一下WFP分层模型的数据传输流程(tcp数据传输流程)。在国内,因为不能再方便的使用谷歌搜索,用百度基本无法搜索这些技术问题,所以推荐使用必应搜索,搜英文关键词,或者直接到MSDN搜索关键词或者相关的WFP的API,基本都能找到要找的东西。
因为我的职业规划是先成为一名架构师,也希望在大数据这方面有所作为,所以不想再从事驱动或者纯PC客户端软件的开发。如果有架构师或者大数据这方面的牛人,还希望能够指点一二。如果牛人你希望能够方便的交流,可以加群——496187602(本群宗旨:阅好书,乐分享,善交流,施仁义,绘人生,追梦!),不愿意交流,不愿意分享者勿扰!

猜你喜欢

转载自blog.csdn.net/lxf20054658/article/details/50417568
今日推荐