<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=84393&amp;view=findpost&amp;p=1831061</guid>
        <pubDate>Thu, 10 Jan 2008 16:03:27 +0000</pubDate>
        <title>Socks 5 Server</title>
        <link>https://forum.sources.ru/index.php?showtopic=84393&amp;view=findpost&amp;p=1831061</link>
        <description><![CDATA[shsh: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">//#define UNIX 1</div><div class="code_line">#define WIN32 1</div><div class="code_line">// #define AUTH_ON 1</div><div class="code_line">&nbsp;</div><div class="code_line">#define BUFF_SIZE 1024</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef AUTH_ON</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;const char AuthLogin[] = &quot;login&quot;;</div><div class="code_line">&nbsp;&nbsp;const char AuthPass[] = &quot;pass&quot;;</div><div class="code_line">&nbsp;&nbsp;#define SOCKS5_METHOD 0x02 &nbsp; &nbsp; &nbsp;</div><div class="code_line">#else</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;#define SOCKS5_METHOD 0x00 &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef UNIX</div><div class="code_line">&nbsp;</div><div class="code_line">#include &quot;sys/types.h&quot;</div><div class="code_line">#include &quot;sys/socket.h&quot;</div><div class="code_line">#include &quot;netinet/in.h&quot;</div><div class="code_line">#include &quot;netdb.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">typedef int SOCKET;</div><div class="code_line">typedef int bool;</div><div class="code_line">typedef int __stdcall;</div><div class="code_line">&nbsp;</div><div class="code_line">#define SOCKET_ERROR -1</div><div class="code_line">#define INVALID_SOCKET -1</div><div class="code_line">&nbsp;</div><div class="code_line">#define false 0</div><div class="code_line">#define true 1</div><div class="code_line">&nbsp;</div><div class="code_line">#define SD_BOTH SHUT_RDWR</div><div class="code_line">&nbsp;</div><div class="code_line">#define _malloc malloc</div><div class="code_line">#define closesocket close</div><div class="code_line">&nbsp;</div><div class="code_line">void create_thread(void* func, void* param)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int ThrId;</div><div class="code_line">&nbsp;&nbsp;pthread_create(&amp;ThrId, 0, func, param);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef WIN32</div><div class="code_line">&nbsp;</div><div class="code_line">#include &quot;winsock.h&quot;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">typedef UINT in_addr_t;</div><div class="code_line">&nbsp;</div><div class="code_line">#define strcmp lstrcmp</div><div class="code_line">#define free GlobalFree</div><div class="code_line">&nbsp;</div><div class="code_line">void create_thread(void* func, void* param)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, param, 0, NULL);</div><div class="code_line">}</div><div class="code_line">&nbsp;&nbsp;</div><div class="code_line">char* _malloc(int BuffSize)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;return (char*)GlobalAlloc(GMEM_FIXED, BuffSize);</div><div class="code_line">}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">void bzero(void* lpBuff, int BuffSize)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;_asm</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;xor eax, eax</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov ecx, BuffSize</div><div class="code_line">&nbsp;&nbsp; &nbsp;mov edi, lpBuff</div><div class="code_line">&nbsp;&nbsp; &nbsp;cld</div><div class="code_line">&nbsp;&nbsp; &nbsp;rep stosb</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#define SOCKS_VERSION 0x05</div><div class="code_line">#define SOCKS_SUCCESS 0x00</div><div class="code_line">#define SOCKS_FAILURE 0x01</div><div class="code_line">#define SOCKS_CONNECTION_REFUSED 0x05</div><div class="code_line">#define SOCKS_CMD_NOT_SUPPORTED 0x07</div><div class="code_line">&nbsp;</div><div class="code_line">typedef struct</div><div class="code_line">{</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;char* _ConnectStruct;</div><div class="code_line">&nbsp;&nbsp;SOCKET From;</div><div class="code_line">&nbsp;&nbsp;SOCKET To;</div><div class="code_line">&nbsp;&nbsp;char Buff[BUFF_SIZE];</div><div class="code_line">&nbsp;&nbsp;char* Error;</div><div class="code_line">&nbsp;</div><div class="code_line">} SOCKSPIPE;</div><div class="code_line">&nbsp;</div><div class="code_line">typedef SOCKSPIPE* LPSOCKSPIPE;</div><div class="code_line">&nbsp;</div><div class="code_line">typedef struct _CONNECTSTRUCT</div><div class="code_line">{</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;SOCKSPIPE FromStruct;</div><div class="code_line">&nbsp;&nbsp;SOCKSPIPE ToStruct;</div><div class="code_line">&nbsp;&nbsp;char Error;</div><div class="code_line">&nbsp;</div><div class="code_line">} CONNECTSTRUCT;</div><div class="code_line">&nbsp;</div><div class="code_line">typedef CONNECTSTRUCT* LPCONNECTSTRUCT;</div><div class="code_line">&nbsp;</div><div class="code_line">LPCONNECTSTRUCT CreateConnectStruct(SOCKET From, SOCKET To)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;LPCONNECTSTRUCT Result = (LPCONNECTSTRUCT)_malloc(sizeof(CONNECTSTRUCT));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Result-&#62;FromStruct._ConnectStruct = (char*)Result;</div><div class="code_line">&nbsp;&nbsp;Result-&#62;FromStruct.From = From;</div><div class="code_line">&nbsp;&nbsp;Result-&#62;FromStruct.To = To;</div><div class="code_line">&nbsp;&nbsp;Result-&#62;FromStruct.Error = &amp;(Result-&#62;Error);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Result-&#62;ToStruct._ConnectStruct = (char*)Result;</div><div class="code_line">&nbsp;&nbsp;Result-&#62;ToStruct.From = To;</div><div class="code_line">&nbsp;&nbsp;Result-&#62;ToStruct.To = From;</div><div class="code_line">&nbsp;&nbsp;Result-&#62;ToStruct.Error = &amp;(Result-&#62;Error);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Result-&#62;Error = 0x00;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return Result;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">bool swrite(SOCKET s, char* Buff, int buff_size)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int bytes;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;while(buff_size &#62; 0)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;bytes = send(s, Buff, buff_size, 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if((bytes == 0)||(bytes == SOCKET_ERROR))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;&nbsp; &nbsp;buff_size -= bytes;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Buff += bytes;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return true;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">bool sread(SOCKET s, char* Buff, int buff_size)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int bytes;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;while(buff_size &#62; 0)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;bytes = recv(s, Buff, buff_size, 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if((bytes == 0)||(bytes == SOCKET_ERROR))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;buff_size -= bytes;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Buff += bytes;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return true;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">__stdcall SocksPipe(LPSOCKSPIPE PipeStruct)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;int bytes;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;do</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;bytes = recv(PipeStruct-&#62;From, PipeStruct-&#62;Buff, BUFF_SIZE, 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if((bytes == 0) || (bytes == SOCKET_ERROR))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(*(PipeStruct-&#62;Error) &amp; 0x01)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;*(PipeStruct-&#62;Error) |= 0x02;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(!swrite(PipeStruct-&#62;To, PipeStruct-&#62;Buff, bytes))</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;*(PipeStruct-&#62;Error) |= 0x02;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;while(!(*(PipeStruct-&#62;Error) &amp; 0x01));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if(*(PipeStruct-&#62;Error) &amp; 0x01)</div><div class="code_line">&nbsp;&nbsp; &nbsp;*(PipeStruct-&#62;Error) |= 0x02;</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;*(PipeStruct-&#62;Error) |= 0x01;</div><div class="code_line">&nbsp;&nbsp; &nbsp;shutdown(PipeStruct-&#62;From, 2);</div><div class="code_line">&nbsp;&nbsp; &nbsp;shutdown(PipeStruct-&#62;To, 2);</div><div class="code_line">&nbsp;&nbsp; &nbsp;closesocket(PipeStruct-&#62;From);</div><div class="code_line">&nbsp;&nbsp; &nbsp;closesocket(PipeStruct-&#62;To);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while(!(*(PipeStruct-&#62;Error) &amp; 0x02))</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;#ifdef UNIX</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;sleep(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;#endif</div><div class="code_line">&nbsp;&nbsp; &nbsp;#ifdef WIN32</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Sleep(1000);</div><div class="code_line">&nbsp;&nbsp; &nbsp;#endif</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;free(PipeStruct-&#62;_ConnectStruct);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">bool Socks5SendCode(SOCKET s, char Code, char* TempBuff, char* ip, char* port)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;*(int*)TempBuff = 0x1000000 | (Code &#60;&#60; 8) | SOCKS_VERSION;</div><div class="code_line">&nbsp;&nbsp;*(int*)(TempBuff + 4) = *(int*)ip;</div><div class="code_line">&nbsp;&nbsp;*(short*)(TempBuff + 8) = *(short*)port;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return swrite(s, TempBuff, 10);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">SOCKET Socks5ServConnect(SOCKET s, char* TempBuff, char* ip, u_short port)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;struct sockaddr_in saddr;</div><div class="code_line">&nbsp;&nbsp;SOCKET Redir = socket(AF_INET, SOCK_STREAM, 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if(Redir == INVALID_SOCKET)</div><div class="code_line">&nbsp;&nbsp; &nbsp;Socks5SendCode(s, SOCKS_FAILURE, TempBuff, ip, (char*)&amp;port);</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;bzero(&amp;saddr, sizeof(struct sockaddr_in));</div><div class="code_line">&nbsp;&nbsp; &nbsp;saddr.sin_family = AF_INET;</div><div class="code_line">&nbsp;&nbsp; &nbsp;saddr.sin_addr.s_addr = *(in_addr_t*)ip;</div><div class="code_line">&nbsp;&nbsp; &nbsp;saddr.sin_port = port;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(connect(Redir, (struct sockaddr*)&amp;saddr, sizeof(struct sockaddr_in)) == -1)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Socks5SendCode(s, SOCKS_CONNECTION_REFUSED, TempBuff, ip, (char*)&amp;port);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;closesocket(Redir);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Redir = INVALID_SOCKET;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;return Redir;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">bool Socks5CmdIsSupported(SOCKET s, char cmd, char* TempBuff, char* ip, char* port)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;if(cmd != 0x01) // 0x02 - bind; 0x03 - udp associate</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;Socks5SendCode(s, SOCKS_CMD_NOT_SUPPORTED, TempBuff, ip, port);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return true;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">bool Socks5GetCmd(SOCKET s, char* TempBuff, char* cmd, char* ip, char* port)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;struct hostent* hp;</div><div class="code_line">&nbsp;&nbsp;char DnLen;</div><div class="code_line">&nbsp;&nbsp;char AddrType;</div><div class="code_line">&nbsp;&nbsp;char Tmp[5];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if(!sread(s, TempBuff, 4))</div><div class="code_line">&nbsp;&nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if((TempBuff[0] != SOCKS_VERSION)||(TempBuff[2] != 0x00))</div><div class="code_line">&nbsp;&nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;*cmd = TempBuff[1];</div><div class="code_line">&nbsp;&nbsp;AddrType = TempBuff[3];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;switch(AddrType)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;case 0x01: // ip v4</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(!sread(s, ip, 4))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;case 0x03: // domain name</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(!sread(s, &amp;DnLen, 1))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(DnLen == 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(!sread(s, TempBuff, DnLen))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;TempBuff[DnLen] = 0x00;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;hp = gethostbyname(TempBuff);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(((int)hp == -1)||((int)hp == 0))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if(!sread(s, port, 2))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(int*)(&amp;Tmp) = 0x03000405;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(char*)(&amp;Tmp + 4) = DnLen;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if(swrite(s, Tmp, 5))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(swrite(s, TempBuff, DnLen))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;swrite(s, port, 2);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;*(int*)ip = *(int*)hp-&#62;h_addr;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;case 0x04: &nbsp;// ip v6, not supported</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;*(int*)(&amp;Tmp) = 0x04000805;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(sread(s, TempBuff, 16))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if(sread(s, port, 2))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(swrite(s, Tmp, 4))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(swrite(s, TempBuff, 16))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;swrite(s, port, 2);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;default:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return sread(s, port, 2);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef AUTH_ON</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;bool Socks5Auth(SOCKET s, char* TempBuff)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;char Login[256];</div><div class="code_line">&nbsp;&nbsp; &nbsp;char LoginLen;</div><div class="code_line">&nbsp;&nbsp; &nbsp;char PassLen;</div><div class="code_line">&nbsp;&nbsp; &nbsp;char Status = &#39;\xFF&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(!sread(s, TempBuff, 2))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;LoginLen = TempBuff[1];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if((TempBuff[0] != 0x01)||(LoginLen == 0))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(!sread(s, Login, LoginLen+1))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;PassLen = Login[LoginLen];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(!PassLen)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Login[LoginLen] = 0x00;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(!sread(s, TempBuff, PassLen))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TempBuff[PassLen] = 0x00;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if((strcmp(AuthLogin, Login) == 0)&amp;&amp;(strcmp(AuthPass, TempBuff) == 0))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Status = 0x00;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;*(short*)TempBuff = (Status &#60;&#60; 8) | 0x01;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(!swrite(s, TempBuff, 2))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return (Status == 0x00);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">bool Socks5Accept(SOCKET s, char* TempBuff)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;char MethodsCount;</div><div class="code_line">&nbsp;&nbsp;char Cmd = &#39;\xFF&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if(!sread(s, TempBuff, 2))</div><div class="code_line">&nbsp;&nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;MethodsCount = TempBuff[1];</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if((TempBuff[0] != SOCKS_VERSION)||(MethodsCount == 0))</div><div class="code_line">&nbsp;&nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if(!sread(s, TempBuff, MethodsCount))</div><div class="code_line">&nbsp;&nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;do</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;MethodsCount--;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(TempBuff[MethodsCount] == SOCKS5_METHOD)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Cmd = TempBuff[MethodsCount];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;&nbsp;while(MethodsCount &#62; 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;*(short*)TempBuff = (Cmd &#60;&#60; 8) | SOCKS_VERSION;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if(!swrite(s, TempBuff, 2))</div><div class="code_line">&nbsp;&nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef AUTH_ON</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return (Cmd == 0xFF) ? false : Socks5Auth(s, TempBuff);</div><div class="code_line">#else</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return (Cmd != 0xFF);</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">__stdcall AcceptThread(SOCKET s)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;SOCKET Redir;</div><div class="code_line">&nbsp;&nbsp;LPCONNECTSTRUCT ConnectStruct;</div><div class="code_line">&nbsp;&nbsp;char TempBuff[256];</div><div class="code_line">&nbsp;&nbsp;char cmd;</div><div class="code_line">&nbsp;&nbsp;char ip[4];</div><div class="code_line">&nbsp;&nbsp;u_short port;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if(Socks5Accept(s, TempBuff))</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(Socks5GetCmd(s, TempBuff, &amp;cmd, ip, (char*)&amp;port))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(Socks5CmdIsSupported(s, cmd, TempBuff, ip, (char*)&amp;port))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Redir = Socks5ServConnect(s, TempBuff, ip, port);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if(Redir != INVALID_SOCKET)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(Socks5SendCode(s, SOCKS_SUCCESS, TempBuff, ip, (char*)&amp;port))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ConnectStruct = CreateConnectStruct(s, Redir);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create_thread(&amp;SocksPipe, &amp;(ConnectStruct-&#62;ToStruct));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SocksPipe(&amp;(ConnectStruct-&#62;FromStruct));</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;closesocket(Redir);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;closesocket(s);</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">DWORD WINAPI Socks(LPVOID)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp;SOCKET s, accepted;</div><div class="code_line">&nbsp;&nbsp;struct sockaddr_in saddr;</div><div class="code_line">&nbsp;&nbsp;int saddr_size = sizeof(struct sockaddr_in);</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef WIN32</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;WSADATA WSA;</div><div class="code_line">&nbsp;&nbsp;if(WSAStartup(MAKEWORD(2, 2), &amp;WSA) != 0)</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">&nbsp;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;s = socket(AF_INET, SOCK_STREAM, 0);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;if(s != INVALID_SOCKET)</div><div class="code_line">&nbsp;&nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp;bzero(&amp;saddr, sizeof(struct sockaddr_in));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;saddr.sin_family = AF_INET;</div><div class="code_line">&nbsp;&nbsp; &nbsp;saddr.sin_port = htons(socks_port);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(bind(s, (struct sockaddr*)&amp;saddr, sizeof(struct sockaddr_in)) != SOCKET_ERROR)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if(listen(s, 0) != SOCKET_ERROR)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for(;;)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;accepted = accept(s, (struct sockaddr*)&amp;saddr, &amp;saddr_size);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(accepted != INVALID_SOCKET)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;create_thread(&amp;AcceptThread, (void*)accepted);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;closesocket(s);</div><div class="code_line">&nbsp;&nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef WIN32</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;WSACleanup();</div><div class="code_line">&nbsp;&nbsp;ExitProcess(0);</div><div class="code_line">&nbsp;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;return 0;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>shsh</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=84393&amp;view=findpost&amp;p=621514</guid>
        <pubDate>Wed, 23 Feb 2005 15:44:16 +0000</pubDate>
        <title>Socks 5 Server</title>
        <link>https://forum.sources.ru/index.php?showtopic=84393&amp;view=findpost&amp;p=621514</link>
        <description><![CDATA[Maz: Socks4 не подходит - устарело уже и UDP не тянет  :( <br><br>teslapat, если для тебя проблемы нет заделился бы сорцами  :D]]></description>
        <author>Maz</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=84393&amp;view=findpost&amp;p=621350</guid>
        <pubDate>Wed, 23 Feb 2005 13:07:33 +0000</pubDate>
        <title>Socks 5 Server</title>
        <link>https://forum.sources.ru/index.php?showtopic=84393&amp;view=findpost&amp;p=621350</link>
        <description><![CDATA[SimBiOd: Вот <a class='tag-url' href='http://www.xakep.ru/post/18884/socks-4.zip' target='_blank'>тут</a> есть исходник для Socks 4.  :D]]></description>
        <author>SimBiOd</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=84393&amp;view=findpost&amp;p=621210</guid>
        <pubDate>Wed, 23 Feb 2005 09:54:59 +0000</pubDate>
        <title>Socks 5 Server</title>
        <link>https://forum.sources.ru/index.php?showtopic=84393&amp;view=findpost&amp;p=621210</link>
        <description><![CDATA[teslapat: А в чем проблема?]]></description>
        <author>teslapat</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=84393&amp;view=findpost&amp;p=620993</guid>
        <pubDate>Wed, 23 Feb 2005 00:13:12 +0000</pubDate>
        <title>Socks 5 Server</title>
        <link>https://forum.sources.ru/index.php?showtopic=84393&amp;view=findpost&amp;p=620993</link>
        <description><![CDATA[Maz: Никто не поможет исходником Socks 5 сервера на VC++?  :wall: <br>Буду очень признателен]]></description>
        <author>Maz</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	