SOCKS5发展及现状:
网络发展到今天,SOCKS5也历经了几次大的修改。
现在SOCKS5通过特殊方法,可以实现以下功能:
1.局部指定进程使用SOCKS5访问网络。
2.全局访问网络。也就是让电脑上所有流量都走SOCKS5.
3.网络加速功能,就是玩国外的一些游戏的时候,网络卡,可以使用SOCKS5加速。
4.可以让每个进程不同IP,即在电脑上多开游戏或者多开模拟器,或者其它进程等,可以让每个进程不同外网IP来访问网络。
最初象我们,08年研究的时候,那个时候用HOOK API,也就是HOOK CONNECT WSACONNECT来拦截网络,然后使用SOCKS5转发出去,实现上述的4项功能。
后来一些游戏啊,一些网络应用程序自己构造了一些API,如NP保护的游戏,这类应用使用HOOK API就不行了。所以在10年左右,就开始使用了LSP来拦截WSPAccept,
WSPAddressToString,
WSPAsyncSelect,
WSPBind,
WSPCancelBlockingCall,
WSPCleanup,
WSPCloseSocket,
WSPConnect,
WSPDuplicateSocket,
WSPEnumNetworkEvents,
WSPEventSelect,
WSPGetOverlappedResult,
WSPGetPeerName,
WSPGetSockName,
WSPGetSockOpt,
WSPGetQOSByName,
WSPIoctl,
WSPJoinLeaf,
WSPListen,
WSPRecv,
WSPRecvDisconnect,
WSPRecvFrom,
WSPSelect,
WSPSend,
WSPSendDisconnect,
WSPSendTo,
WSPSetSockOpt,
WSPShutdown,
WSPSocket,
WSPStringToAddress等,然后根据规则用SOCKS5代理协议转发网络。LSP相对来讲,当时是应用层里比较好的拦截网络方式,同样也实现了以上4种功能。
截止到目前,因为大部分游戏或者网络应用都会检测自己进程是否被注入,是否读写了内存。因为HOOK API及LSP,都是要给进程加载一个DLL,所以这两种方法已经不适合现在的环境。现在都是用驱动WFP TDI或者NDIS来拦截网络数据,然后应用层与驱动通信,通过规则用SOCKS5来交换网络数据,实现上述的4种功能或者其它功能。
本人研究网络多年,希望结交志同道合的朋友。博客里已经有一个文章写有详细的原理及实现的成品软件及部分代码。
可以参考https://blog.csdn.net/QQ1289671197/article/details/102532889
下面介绍SOCKS5详细原理:
解释一下为什么它被称之为SOCKS。其实该协议设计之初是为了让有权限的用户可以穿过过防火墙的限制,使得高权限用户可以访问一般用户不能访问的外部资源。当时设计者考虑到几乎所有使用TCP/IP通信的应用软件都使用socket(套接字,实际上是一组应用程序接口)完成底层的数据通信。为了方便软件开发者使用该协议,协议设计者就刻意对应了几组socket编程最经典的操作,并且将协议定名为SOCKS。
最先被广泛使用的SOCKS协议是其第四版本,就是SOCKS4。IE和一些其他应用程序直接用“Socks”表示SOCKS4协议。该版本支持TCP的connect(作为客户端连接)和listen(打开一个监听端口),不支持UDP协议。SOCKS4A对SOCKS4作了一点增强,即允许客户端将域名发送给SOCKS服务器,让SOCKS服务器进行域名解析。
SOCKS5是第五版,相对第四版作了大幅度的增强。首先,它增加了对UDP协议的支持;其次,它可以支持多种用户身份验证方式和通信加密方式;最后,修改了SOCKS服务器进行域名解析的方法,使其更加优雅。经过这次脱胎换骨的升级,SOCKS5于1996年被IETF确认为标准通信协议,RFC编号为1928。经过10余年的时间,大量的网络应用程序都支持SOCKS5代理。
SOCKS5虽然可以支持多种用户身份验证方式,但是应用程序真正实现的一般也只有两种:不验证和用户名密码验证。所以大多数应用程序SOCKS5代理设置也只有用户名/密码这一种可选验证方法。另外,尽管从SOCKS4开始,就支持打开TCP监听端口,但是直到SOCKS5,也只允许这个端口接收一个客户端连接。因此网络服务提供者(如http服务器)不能使用SOCKS。实际上,很多SOCKS服务器的实现也不支持打开TCP监听端口。
虽然说设计SOCKS协议的初衷是在保证网络隔离的情况下,提高部分人员的网络访问权限,但是国内似乎很少有组织机构这样使用。一般情况下,大家都会使用更新的网络安全技术来达到相同的目的,人们找到了SOCKS协议新的用途——突破网络通信限制,这和该协议的初衷实际上正好相反。比如某些网游的部分服务器设置为只接收部分地区的IP地址的连接。为了突破这种限制,可以找一个该地区的SOCKS5代理服务器,然后用PSD接管网游客户端,通过SOCKS5代理服务器连接游戏服务器。这样游戏服务器就会认为该客户端位于本地区,从而允许进行游戏。还有一种情况是:防火墙仅允许部分端口(如http的80端口)通信,那么可以利用SOCKS5协议和一个打开80端口监听的SOCKS5服务器连接,从而可以连接公网上其他端口的服务器。利用一些额外的技术手段,甚至可以骗过内部的http代理服务器,这时在使用内网http代理上网的环境下也可以不受限制的使用网络服务,这称之为SOCKS over HTTP。
当然,使用代理服务器后,将不可避免的出现通信延迟,所以应该尽量选择同网络(指网通/ 电信),距离近的服务器。
sock5代理的工作程序是:
1.需要向代理方服务器发出请求信息。
2.代理方应答
3.需要代理方接到应答后发送向代理方发送目的ip和端口
4.代理方与目的连接
5.代理方将需要代理方发出的信息传到目的方,将目的方发出的信息传到需要代理方。代理完成。
由于网上的信息传输都是运用tcp或udp进行的,所以使用socks5代理可以办到网上所能办到的一切,而且不舆目的方会查到你的ip,既安全又方便 sock5支持UDP和TCP,但两种代理是有区别的,以下分类说明
如何用代理TCP协议
1.向服务器的1080端口建立tcp连接。
2.向服务器发送 05 01 00 (此为16进制码,以下同)
3.如果接到 05 00 则是可以代理
4.发送 05 01 00 01 + 目的地址(4字节) + 目的端口(2字节),目的地址和端口都是16进制码(不是字符串!!)。 例202.103.190.27 -7201 则发送的信息为:05 01 00 01 CA 67 BE 1B 1C 21 (CA=202 67=103 BE=190 1B=27 1C21=7201)
5.接受服务器返回的自身地址和端口,连接完成
6.以后操作和直接与目的方进行TCP连接相同。
如何用代理UDP连接
1.向服务器的1080端口建立udp连接
2.向服务器发送 05 01 00
3.如果接到 05 00 则是可以代理
4.发送 05 03 00 01 00 00 00 00 + 本地UDP端口(2字节)
5.服务器返回 05 00 00 01 +服务器地址+端口
6.需要申请方发送 00 00 00 01 +目的地址IP(4字节)+目的端口 +所要发送的信息
7.当有数据报返回时 向需要代理方发出00 00 00 01 +来源地址IP(4字节)+来源端口 +接受的信息
注:此为不需要密码的代理协议,只是socks5的一部分,完整协议请RFC1928