关于Winsock LSP、SPI、NSP、网游加速器那些事

4条评论 2017-08-16 admin

        最近VPN都被封了,无法使用Google,只好自己动手,丰衣足食了。

        一个是基于ifslsp的,支持TCP重定向:DeProxifier1.0

        另外一个是基于nonifslsp的,支持TCP和UDP重定向:DeProxyCap1.0

        有需要的朋友请点击上面的链接下载使用吧。嗯,跟本站所有软件一样,是完全免费的。当然,这种软件杀毒软件是百分之百报毒的,介意的朋友就不要用了。

        关于LSP,也不打算多做介绍了,请自行搜索吧。如果你正在开发LSP和NSP,那么可以往下看看,我会说说里面的几个要点。如果你没有这方面的基础,看了也是没有用的。

一、关于TCP重定向的实现。

        TCP重定向的实现方法有很多,有些方法是先强制把原来的Socket改为阻塞模型(例如:对于消息模型的,先调用WSPAsyncSelect(s, hWnd, 0, 0, err)取消消息映射;对于事件模型的,先调用WSPEventSelect(s, 0, 0, err)取消事件),跟代理服务器握手成功后,再恢复原来的模型;有些方法是使用状态机;而最简单和最流行的方法是:把连接重定向到127.0.0.1本地自己程序监听的端口,由该程序来完成握手。之所以需要考虑这些问题,是因为当connect函数返回后,原来的程序便开始收发数据了,而LSP层还在和代理服务器协商,因为使用的是同一个socket句柄,所以这两个过程的数据收发是可能导致数据混乱的。
        目前基本上所有LSP程序都是使用最后一个方法,因为还有个原因:对于网络游戏,如果你重定向到真正代理服务器,这个过程是可能消耗一定时间的,可能会导致网络游戏认为连接超时而断开连接,把连接重定向到127.0.0.1就没事了。

二、关于UDP重定向的实现。

        UDP的重定向不像TCP仅处理WSPConnect和WSPConnectEX即可,它涉及到数据的收发,对应的两个函数是:WSPSendto和WSPRecvFrom,我们需要在发送的时候将真正的地址加到原数据头,然后将发送地址改为代理服务器的;在接收返回后,从头数据取出真正服务器的IP并去掉该头数据。我们先来看看,如果使用API HOOK是如何处理接收函数的:

        如果需要截获实际接收的数据的话,单纯的通过WSPRecvFrom这个函数是很片面的,需要分几种情况说明:
        1、如果lpOverlapped为nil,那么是阻塞式的,直接在原函数返回后处理即可。
        2、如果lpOverlapped不为nil,且lpCompletionRoutine不为nil,那么需要使用自己的函数替换lpCompletionRoutine;并在调用后执行调用用户原函数。因为这时是完成例程通知模型。
        3、如果lpOverlapped不为nil,且lpCompletionRoutine为nil,并且lpOverlapped的hEvent不为nil,那么需要hook WSAGetOverlappedResult。因为这时是事件通知模型。
        4、如果lpOverlapped不为nil,且lpCompletionRoutine为nil,并且lpOverlapped的hEvent为nil,那么需要hook GetQueuedCompletionStatus,因为这时是完成端口的方式。

        现在的问题在于,LSP并不提供类似GetQueuedCompletionStatus这种API函数的处理,所以如果仅使用LSP,而且是ifslsp模型的话,那么对于非阻塞模型的UDP都是无法解决的事情。幸好微软还提供了一个nonifslsp的框架,里面自带了一个透明代理层。

        这里额外说说一些常识(摘录自网上):“LSP分两种:一种是IFS LSP,一种是non IFS LSP.简单地说, IFS LSP制作简单,可以完成大部分的数据包监听工作; non IFS LSP制作复杂,但是可以进行一些特殊的overlapped I/O操作,如在overlapped初始化完成后,调用WSPSend (WriteFile), WSPSendTo, WSPRecv (ReadFile), WSPRecvFrom, or WSPIoctl之前,对数据进行一些处理工作.LSP相互之间可以叠加,但在non IFS LSP之上不可以叠加IFS LSP.也就是说,如果一个BSP是non IFS,则第三方提供的LSP必须是non IFS,否则无法安装在SPI上.”当然,世事无完美,nonifslsp也存在一些兼容性问题,例如会导致SetFileCompletionNotificationModes函数运行不正确。详见微软介绍:https://support.microsoft.com/en-hk/help/2568167/setfilecompletionnotificationmodes-api-causes-an-i-o-completion-port-n

三、关于NSP重定向的实现。

        NSP重定向DNS虽然都是在NSPLookupServiceNext里面返回域名对应的IP地址,但是实际上也有很多方法。一种是使用UDP自己构造DNS请求包返回IP,然后替换。这个比较消耗时间。另外一种是远程连接模式,例如:当应用程序解释域名www.138soft.com的时候,NSPLookupServiceNext返回127.8.0.0(这个IP是递归的),同时在内存里面添加一个对应的映射记录:www.138soft.com:127.8.0.0,当应用程序连接到127.8.0.0时,127.8.0.0这个连接与远程代理服务器协商,告诉对方连接到www.138soft.com(代理服务器基本上都支持IP重定向和域名重定向),这时候使用的实际上就是代理服务器那边的DNS了。

分类:网络相关

4条评论 发表评论

发表评论

(必填)

(必填), (Hidden)

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

TrackBack URL  |  这篇文章上的评论的RSS feed


近期文章

近期评论

文章归档

分类目录