SOCKS5
SOCKS5發(fā)展及現(xiàn)狀:
網(wǎng)絡(luò)發(fā)展到今天,SOCKS5也歷經(jīng)了幾次大的修改。
現(xiàn)在SOCKS5通過特殊方法,可以實現(xiàn)以下功能:
1.局部指定進(jìn)程使用SOCKS5訪問網(wǎng)絡(luò)。
2.全局訪問網(wǎng)絡(luò)。也就是讓電腦上所有流量都走SOCKS5.
3.網(wǎng)絡(luò)加速功能,就是玩國外的一些游戲的時候,網(wǎng)絡(luò)卡,可以使用SOCKS5加速。
4.可以讓每個進(jìn)程不同IP,即在電腦上多開游戲或者多開模擬器,或者其它進(jìn)程等,可以讓每個進(jìn)程不同外網(wǎng)IP來訪問網(wǎng)絡(luò)。
最初象我們,08年研究的時候,那個時候用HOOK API,也就是HOOK CONNECT WSACONNECT來攔截網(wǎng)絡(luò),然后使用SOCKS5轉(zhuǎn)發(fā)出去,實現(xiàn)上述的4項功能。
后來一些游戲啊,一些網(wǎng)絡(luò)應(yīng)用程序自己構(gòu)造了一些API,如NP保護(hù)的游戲,這類應(yīng)用使用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等,然后根據(jù)規(guī)則用SOCKS5代理協(xié)議轉(zhuǎn)發(fā)網(wǎng)絡(luò)。LSP相對來講,當(dāng)時是應(yīng)用層里比較好的攔截網(wǎng)絡(luò)方式,同樣也實現(xiàn)了以上4種功能。
截止到目前,因為大部分游戲或者網(wǎng)絡(luò)應(yīng)用都會檢測自己進(jìn)程是否被注入,是否讀寫了內(nèi)存。因為HOOK API及LSP,都是要給進(jìn)程加載一個DLL,所以這兩種方法已經(jīng)不適合現(xiàn)在的環(huán)境。現(xiàn)在都是用驅(qū)動WFP TDI或者NDIS來攔截網(wǎng)絡(luò)數(shù)據(jù),然后應(yīng)用層與驅(qū)動通信,通過規(guī)則用SOCKS5來交換網(wǎng)絡(luò)數(shù)據(jù),實現(xiàn)上述的4種功能或者其它功能。
本人研究網(wǎng)絡(luò)多年,希望結(jié)交志同道合的朋友。博客里已經(jīng)有一個文章寫有詳細(xì)的原理及實現(xiàn)的成品軟件及部分代碼。
可以參考https://blog.csdn.net/QQ1289671197/article/details/102532889
下面介紹SOCKS5詳細(xì)原理:
解釋一下為什么它被稱之為SOCKS。其實該協(xié)議設(shè)計之初是為了讓有權(quán)限的用戶可以穿過過防火墻的限制,使得高權(quán)限用戶可以訪問一般用戶不能訪問的外部資源。當(dāng)時設(shè)計者考慮到幾乎所有使用TCP/IP通信的應(yīng)用軟件都使用socket(套接字,實際上是一組應(yīng)用程序接口)完成底層的數(shù)據(jù)通信。為了方便軟件開發(fā)者使用該協(xié)議,協(xié)議設(shè)計者就刻意對應(yīng)了幾組socket編程最經(jīng)典的操作,并且將協(xié)議定名為SOCKS。
最先被廣泛使用的SOCKS協(xié)議是其第四版本,就是SOCKS4。IE和一些其他應(yīng)用程序直接用“Socks”表示SOCKS4協(xié)議。該版本支持TCP的connect(作為客戶端連接)和listen(打開一個監(jiān)聽端口),不支持UDP協(xié)議。SOCKS4A對SOCKS4作了一點增強(qiáng),即允許客戶端將域名發(fā)送給SOCKS服務(wù)器,讓SOCKS服務(wù)器進(jìn)行域名解析。
SOCKS5是第五版,相對第四版作了大幅度的增強(qiáng)。首先,它增加了對UDP協(xié)議的支持;其次,它可以支持多種用戶身份驗證方式和通信加密方式;最后,修改了SOCKS服務(wù)器進(jìn)行域名解析的方法,使其更加優(yōu)雅。經(jīng)過這次脫胎換骨的升級,SOCKS5于1996年被IETF確認(rèn)為標(biāo)準(zhǔn)通信協(xié)議,RFC編號為1928。經(jīng)過10余年的時間,大量的網(wǎng)絡(luò)應(yīng)用程序都支持SOCKS5代理。
SOCKS5雖然可以支持多種用戶身份驗證方式,但是應(yīng)用程序真正實現(xiàn)的一般也只有兩種:不驗證和用戶名密碼驗證。所以大多數(shù)應(yīng)用程序SOCKS5代理設(shè)置也只有用戶名/密碼這一種可選驗證方法。另外,盡管從SOCKS4開始,就支持打開TCP監(jiān)聽端口,但是直到SOCKS5,也只允許這個端口接收一個客戶端連接。因此網(wǎng)絡(luò)服務(wù)提供者(如http服務(wù)器)不能使用SOCKS。實際上,很多SOCKS服務(wù)器的實現(xiàn)也不支持打開TCP監(jiān)聽端口。
雖然說設(shè)計SOCKS協(xié)議的初衷是在保證網(wǎng)絡(luò)隔離的情況下,提高部分人員的網(wǎng)絡(luò)訪問權(quán)限,但是國內(nèi)似乎很少有組織機(jī)構(gòu)這樣使用。一般情況下,大家都會使用更新的網(wǎng)絡(luò)安全技術(shù)來達(dá)到相同的目的,人們找到了SOCKS協(xié)議新的用途——突破網(wǎng)絡(luò)通信限制,這和該協(xié)議的初衷實際上正好相反。比如某些網(wǎng)游的部分服務(wù)器設(shè)置為只接收部分地區(qū)的IP地址的連接。為了突破這種限制,可以找一個該地區(qū)的SOCKS5代理服務(wù)器,然后用PSD接管網(wǎng)游客戶端,通過SOCKS5代理服務(wù)器連接游戲服務(wù)器。這樣游戲服務(wù)器就會認(rèn)為該客戶端位于本地區(qū),從而允許進(jìn)行游戲。還有一種情況是:防火墻僅允許部分端口(如http的80端口)通信,那么可以利用SOCKS5協(xié)議和一個打開80端口監(jiān)聽的SOCKS5服務(wù)器連接,從而可以連接公網(wǎng)上其他端口的服務(wù)器。利用一些額外的技術(shù)手段,甚至可以騙過內(nèi)部的http代理服務(wù)器,這時在使用內(nèi)網(wǎng)http代理上網(wǎng)的環(huán)境下也可以不受限制的使用網(wǎng)絡(luò)服務(wù),這稱之為SOCKS over HTTP。
當(dāng)然,使用代理服務(wù)器后,將不可避免的出現(xiàn)通信延遲,所以應(yīng)該盡量選擇同網(wǎng)絡(luò)(指網(wǎng)通/ 電信),距離近的服務(wù)器。
sock5代理的工作程序是:
1.需要向代理方服務(wù)器發(fā)出請求信息。
2.代理方應(yīng)答
3.需要代理方接到應(yīng)答后發(fā)送向代理方發(fā)送目的ip和端口
4.代理方與目的連接
5.代理方將需要代理方發(fā)出的信息傳到目的方,將目的方發(fā)出的信息傳到需要代理方。代理完成。
由于網(wǎng)上的信息傳輸都是運用tcp或udp進(jìn)行的,所以使用socks5代理可以辦到網(wǎng)上所能辦到的一切,而且不輿目的方會查到你的ip,既安全又方便 sock5支持UDP和TCP,但兩種代理是有區(qū)別的,以下分類說明
如何用代理TCP協(xié)議
1.向服務(wù)器的1080端口建立tcp連接。
2.向服務(wù)器發(fā)送 05 01 00 (此為16進(jìn)制碼,以下同)
3.如果接到 05 00 則是可以代理
4.發(fā)送 05 01 00 01 + 目的地址(4字節(jié)) + 目的端口(2字節(jié)),目的地址和端口都是16進(jìn)制碼(不是字符串!!)。 例202.103.190.27 -7201 則發(fā)送的信息為:05 01 00 01 CA 67 BE 1B 1C 21 (CA=202 67=103 BE=190 1B=27 1C21=7201)
5.接受服務(wù)器返回的自身地址和端口,連接完成
6.以后操作和直接與目的方進(jìn)行TCP連接相同。
如何用代理UDP連接
1.向服務(wù)器的1080端口建立udp連接
2.向服務(wù)器發(fā)送 05 01 00
3.如果接到 05 00 則是可以代理
4.發(fā)送 05 03 00 01 00 00 00 00 + 本地UDP端口(2字節(jié))
5.服務(wù)器返回 05 00 00 01 +服務(wù)器地址+端口
6.需要申請方發(fā)送 00 00 00 01 +目的地址IP(4字節(jié))+目的端口 +所要發(fā)送的信息
7.當(dāng)有數(shù)據(jù)報返回時 向需要代理方發(fā)出00 00 00 01 +來源地址IP(4字節(jié))+來源端口 +接受的信息
注:此為不需要密碼的代理協(xié)議,只是socks5的一部分,完整協(xié)議請RFC1928
總結(jié)
- 上一篇: 电气工程学python_浅谈如何学习电气
- 下一篇: 百度地图离线调用(详细教程)