使用windows filter platform(wfp)开发TCP重定向的方法

原创 2014年11月20日 10:32:53

项目的需求背景:

早先的lsp模型做的TCP重定向功能,由于某些不知名的原因(懒得去排查了),会和其他相同的lsp模型开发的软件有冲突,也不支持ie11,所以决定使用微软新的winsock驱动模型wfp来实现TCP的重定向,为了加深理解和记忆,也和其他朋友分享心得,将开发流程记于此。

TCP的重定向功能需要将将要重定向的ip规则先添加到wfp驱动中,定义结构体如下:

typedef struct _tagTcpRule 
{
	unsigned long	NetbyteStartIP;
	unsigned long	NetbyteEndIP;
	unsigned short	NetbyteStartPort;
	unsigned short	NetbyteEndPort;
	int		ResID;
}TcpRule,*PTcpRule;

typedef struct _tagTcpMultiRule 
{
	TcpRule			MutltiRule[TCPRULES_BUFFER_LENGTH];
	unsigned long		RulesCount;
	unsigned long		RulesCapacity;
}TcpMultiRule,*PTcpMultiRule;

这个用来保存将要添加的ip和端口,同时也用于应用层和驱动层传输数据。在驱动层,定义如下结构体保存数据:

typedef struct _tagIPPortList 
{
	LIST_ENTRY	listEntry;
	UINT32 NetbyteStartIP;
	UINT32 NetbyteEndIP;
	UINT16 NetbyteStartPort;
	UINT16 NetbyteEndPort;
}IPPortList ,*PIPPortList ;

///应用程序向驱动写入数据时,存放于此
typedef struct _tagMULTI_TUNNEL_RULES_LIST 
{
	KSPIN_LOCK	RulesListLock;
	size_t		RulesCapacity;
	IPPortList 	MultiRules;
}MULTI_TUNNEL_RULES_LIST,*PMULTI_TUNNEL_RULES_LIST;

下面介绍wfp驱动层的开发流程,参考http://msdn.microsoft.com/en-us/library/windows/hardware/ff571005(v=vs.85).aspx点击打开链接

首先,自然是DriverEntry的开发,这个就是wdf驱动的一般流程,不再重复。

这里简单的把wfp的一些驱动函数写一下:

FwpsInjectionHandleCreate
FwpsInjectionHandleDestroy
FwpmEngineOpen
FwpmTransactionBegin
FwpmSubLayerAdd
FwpmTransactionCommit
FwpmTransactionAbort
FwpmEngineClose
FwpsCalloutUnregisterById
FwpmFilterAdd
FwpsCalloutRegister
FwpmCalloutAdd
FwpsQueryPacketInjectionState
详细说明在MSDN上都可以查到。下面重点说一下如何将TCP重定向:

1.注册FWPS_CALLOUT的classifyFn,这里直接是win7的版本,在MSDN上可以看到。layerKey设置为FWPM_LAYER_ALE_CONNECT_REDIRECT_V4,调用FwpsCalloutRegister等一系列的函数注册,然后调用FwpmFilterAdd添加要重定向或拦截的ip,端口,即完成规则的添加,之后当有数据连接到指定的ip时,就会调用classifyFn这里指定的函数。

2.FWPS_CONNECT_REQUEST这个结构体的解析,详细流程最好的就是我上面给的那个链接,win7和win8上要调用不同的函数,顺序不同,否则会失败。

3.在我的项目中,我将规则里的TCP重定向到了本地的service,所以ip指定为127.0.0.1,端口也是指向本地端口,这里要注意的是,按照微软的说法,重定向到本地服务时,还要指定服务的进程id,即

<span style="white-space:pre">	</span>if(INETADDR_ISANY((PSOCKADDR)&(pConnectRequest->localAddressAndPort)))
	{
		INETADDR_SETLOOPBACK((PSOCKADDR)&(pConnectRequest->remoteAddressAndPort));
	}
	else
	{
		INETADDR_SET_ADDRESS((PSOCKADDR)&(pConnectRequest->remoteAddressAndPort),
			INETADDR_ADDRESS((PSOCKADDR)&(pConnectRequest->localAddressAndPort)));
	}
	INETADDR_SET_PORT((PSOCKADDR)&pConnectRequest->remoteAddressAndPort,
		htons(SSL_PORT));
	if (ulServicePid)
	{
		pConnectRequest->localRedirectTargetPID = ulServicePid;
	}
至此,完成TCP的重定向,后面的数据转发不需要干涉,交由服务和应用进行。

这里简单的说一下,驱动层如何获取应用层通过DeviceIoControl传来的数据,注册WDF_IO_QUEUE_CONFIG的EvtIoDeviceControl,然后WdfIoQueueCreate创建队列,使用WdfRequestRetrieveInputMemory,WdfMemoryGetBuffer获取buffer里传来的数据,如果是应用层从驱动层读数据,则用WdfRequestRetrieveOutputBuffer获取缓冲区,成功后还需要调用WdfRequestCompleteWithInformation,否则应用层获取不到数据。

以上就是一个完整的wfp驱动重定向TCP的实现。只要添加了规则,本例程还可以重定向DNS的连接。
欢迎交流探讨!



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

问题描述:使用WFP重定向了TCP链接到本地localhost后,为了能够告诉应用层原始链接的地址和端口,需要修改数据包,即在三次握手后插入一个自定义包。在实现这个小小功能时,遇到了不少问题,走了很多...
  • lxf20054658
  • lxf20054658
  • 2015年12月28日 10:58
  • 3517

wfp网络过滤框架总结(一)-主要翻译msdn ---发文于2013-11-24

By feivirus 一。基本术语定义 callout 为扩展wfp性能提供的一个功能,由一系列call function和一个guid key组成,wfp内置了几个callouts...
  • feivirus
  • feivirus
  • 2016年01月15日 22:40
  • 2609

Windows驱动_WFP之一WFP是什么

每天进步一点点,一步一步来,慢慢的就会有从量变到质变的过程。我应该勇于去接受挑战,这个世界,没有人会同情弱者,只会去赞美强者,羡慕强者。适者生存。如果你不想被世界淘汰。那就赶紧去淘汰别人,淘汰你身边的...
  • Z18_28_19
  • Z18_28_19
  • 2013年10月10日 21:36
  • 15091

选择路由+重定向还是LSP

不可否认,路由+重定向和LSP二者都是将数据包导向某一个主机的方式,不同之处路由的方式并不修改协议头,对协议抓包器是透明的,但是LSP却修改了目的地址,抓包器可以很轻易的发现,本质上说,LSP在本地就...
  • dog250
  • dog250
  • 2010年08月28日 18:22
  • 3235

IP地址重定向

Lninux: sudo bash -c 'echo xxx.xxx.xxx.xxx yourAddressName>> /etc/hosts' windows: echo xxx.xxx...
  • sunnyorcloudy
  • sunnyorcloudy
  • 2015年04月16日 20:10
  • 574

Windows 筛选平台 (WFP)

原文路径::http://msdn.microsoft.com/zh-cn/library/windows/hardware/gg463267.aspx 引用于微软官方 Windo...
  • Tinna_zhang
  • Tinna_zhang
  • 2013年10月14日 11:55
  • 6915

通过windows中间层过滤驱动修改接收数据包的内容

在windows过滤驱动中修改数据包内容,达到骗过上传软件的目的。
  • airsurfish2014
  • airsurfish2014
  • 2015年08月09日 21:44
  • 698

WFP 驱动环境搭建(WIN10)和编译

网易博客迁移,不知道为什么封禁了帐号,先迁移部分博客过来到csdn (吐槽:网易莫名其妙的封禁了博客帐号,也不告知是什么原因! 所以这种云上的或者外部网站的,真的不好,哪天你的大量心血就没了!:( ...
  • jimk1983
  • jimk1983
  • 2017年10月19日 14:13
  • 313

Windows驱动_WFP之四WFP代码基本流程的剖析

总说程序员是孤独的,因为,大部分的时间都在和机器打交道。大部分的时间都在自言自语。我的内心需要足够的强大。这种强大时建立的自信的基础上的。而自信又是建立在实力基础上的。实力又是建立在积累的基础上。积累...
  • Z18_28_19
  • Z18_28_19
  • 2013年10月23日 21:22
  • 7711

WFP开发学习笔记

WFP开发学习笔记: 自己在开发学习过程中得到的经验,供新手参考,老鸟请指点不足之处: 1.如何关联数据(路径、进程ID等)到其他层? 答:使用函数FwpsFlowAssociateCo...
  • wzsy
  • wzsy
  • 2017年01月06日 15:05
  • 902
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用windows filter platform(wfp)开发TCP重定向的方法
举报原因:
原因补充:

(最多只允许输入30个字)