тут ктото сокс 5 сервер спрашивал , вот нате

Тема в разделе "LANGS.C", создана пользователем shsh, 9 янв 2008.

  1. shsh

    shsh Member

    Публикаций:
    0
    Регистрация:
    3 янв 2008
    Сообщения:
    69
    почти полноценный сокс 4/5 сервер

    Код (Text):
    1. typedef struct tag_SOCKS4_REQUEST{
    2.     unsigned char   ucVersion;
    3.     unsigned char   ucCommand;
    4.     WORD            wDestPort;
    5.     DWORD           dwDestIp;
    6. } SOCKS4_REQUEST;
    7.  
    8.  
    9. typedef struct tag_SOCKS5_REQUEST{
    10.     unsigned char   ucVersion;
    11.     unsigned char   ucCommand;
    12.     unsigned char   ucRzv;
    13.     unsigned char   ucAtyp;
    14.     DWORD           dwDestIp;
    15.     WORD            wDestPort;
    16.  
    17. } SOCKS5_REQUEST;
    18.  
    19. struct socks5_method_request
    20. {
    21.     unsigned char version;
    22.     unsigned char nmethods ;
    23.     unsigned char methods[255];
    24. };
    25.  
    26. typedef struct tag_socks5_method_response
    27. {
    28.     unsigned char version;
    29.     unsigned char method;
    30. } socks5_method_response;
    31.  
    32.  
    33. void FlushRecvBufferUntil(SOCKET s, char condition){
    34.     int iReceiveRes; char cDummy;
    35.     do iReceiveRes = frecv(s, &cDummy, sizeof(cDummy), 0);
    36.     while (iReceiveRes != SOCKET_ERROR && iReceiveRes != 0 && cDummy != condition);
    37. }
    38.  
    39. DWORD WINAPI SocksHandlerTreadProc(LPVOID pParam){
    40.     SOCKET s = (SOCKET)pParam;
    41.     SOCKET tunnelSock = 0;
    42.  
    43.     _try {
    44.         int iConnectResult = 0, iReceiveRes = 0, iSocketsSet = 0;
    45.  
    46.         SOCKS4_REQUEST socks4Request, socks4Response;
    47.         SOCKS5_REQUEST socks5Request, socks5Response;
    48.         SOCKADDR_IN remoteAddr = {0};
    49.         fd_set fds_read;
    50.         FD_ZERO(&fds_read);
    51.         FD_SET(s, &fds_read);
    52.         TIMEVAL tv = {0};
    53.         tv.tv_sec = 30;
    54.         char cSocksVersion = 0;
    55.         int iSelectResult = select(0, &fds_read, NULL, NULL, &tv);
    56.         if (iSelectResult == SOCKET_ERROR || !iSelectResult) _leave;
    57.         u_long ulVal = 0;
    58.         ioctlsocket(s, FIONBIO , &ulVal);
    59.         iReceiveRes = frecv(s, &cSocksVersion, 1, MSG_PEEK);
    60.        
    61.         if (cSocksVersion == 4){
    62.             iReceiveRes = frecv(s, ((char*)&socks4Request), sizeof(socks4Request), 0);
    63.             if (iReceiveRes == SOCKET_ERROR) _leave;
    64.             ulVal = 1;
    65.             ioctlsocket(s, FIONBIO , &ulVal);
    66.             FlushRecvBufferUntil(s, '\0');
    67.  
    68.             if (socks4Request.ucCommand == 1){
    69.                 ulVal = 0;
    70.                 ioctlsocket(s, FIONBIO, &ulVal);
    71.  
    72.                 remoteAddr.sin_family = AF_INET;
    73.                 memcpy(&(remoteAddr.sin_addr),&(socks4Request.dwDestIp), sizeof(remoteAddr.sin_addr));
    74.                 remoteAddr.sin_port = socks4Request.wDestPort;
    75.  
    76.                 tunnelSock = socket(AF_INET, SOCK_STREAM, 0);
    77.                 iConnectResult = connect(tunnelSock, (struct sockaddr*) &remoteAddr, sizeof(remoteAddr));
    78.                 if (iConnectResult != SOCKET_ERROR){
    79.                     socks4Response.ucCommand = 90;
    80.                     socks4Response.ucVersion = 0;
    81.                     send(s, (char*)&socks4Response, sizeof(socks4Response), 0);
    82.                 }
    83.             }
    84.         }
    85.        
    86.         if (cSocksVersion == 5){
    87.             socks5_method_request s5method = {0};
    88.             socks5_method_response s5methodResponse = {0};
    89.            
    90.            
    91.             iReceiveRes = frecv(s, ((char*)&s5method.version), 1, 0);
    92.             iReceiveRes = frecv(s, ((char*)&s5method.nmethods), 1, 0);
    93.             iReceiveRes = frecv(s, ((char*)&s5method.nmethods), s5method.nmethods, 0);
    94.             s5methodResponse.version = 5;
    95.             s5methodResponse.method = 0;
    96.  
    97.             send(s, (char*)&s5methodResponse, sizeof(s5methodResponse), 0);
    98.  
    99.  
    100.  
    101.             iReceiveRes = frecv(s, ((char*)&socks5Request), sizeof(socks5Request), 0);
    102.  
    103.  
    104.             if (iReceiveRes == SOCKET_ERROR) _leave;
    105.             ulVal = 1;
    106.             ioctlsocket(s, FIONBIO , &ulVal);
    107.             FlushRecvBufferUntil(s, '\0');
    108.  
    109.             if (socks5Request.ucCommand == 1){
    110.                 ulVal = 0;
    111.                 ioctlsocket(s, FIONBIO, &ulVal);
    112.  
    113.                 remoteAddr.sin_family = AF_INET;
    114.                 memcpy(&(remoteAddr.sin_addr),&(socks5Request.dwDestIp), sizeof(remoteAddr.sin_addr));
    115.                 remoteAddr.sin_port = socks5Request.wDestPort;
    116.  
    117.                 tunnelSock = socket(AF_INET, SOCK_STREAM, 0);
    118.                 iConnectResult = connect(tunnelSock, (struct sockaddr*) &remoteAddr, sizeof(remoteAddr));
    119.                 if (iConnectResult != SOCKET_ERROR){
    120.                     socks5Response.ucCommand = 90;
    121.                     socks5Response.ucVersion = 0;
    122.                     send(s, (char*)&socks5Response, sizeof(socks5Response), 0);
    123.                 }
    124.             }
    125.         }
    126.  
    127.         ulVal = 0;
    128.         ioctlsocket(tunnelSock, FIONBIO, &ulVal);
    129.         ioctlsocket(s, FIONBIO, &ulVal);
    130.  
    131.         char swapBuffer[4096*16];
    132.         int iSendResult, iRecvResult;
    133.         tv.tv_sec = 2;
    134.  
    135.         while (true){
    136.             FD_ZERO(&fds_read);
    137.             FD_SET(s, &fds_read);
    138.             FD_SET(tunnelSock, &fds_read);
    139.            
    140.             iSocketsSet = select(0, &fds_read, NULL, NULL, &tv); //if (iSocketsSet == SOCKET_ERROR) _leave;
    141.            
    142.             if (iSocketsSet > 0){
    143.                 if (FD_ISSET(s, &fds_read)){
    144.                     iRecvResult = frecv(s, swapBuffer, sizeof(swapBuffer), MSG_PEEK);
    145.                     if (iRecvResult == 0)_leave;
    146.                     else iRecvResult = frecv(s, swapBuffer, sizeof(swapBuffer), 0);
    147.                     if (iRecvResult != SOCKET_ERROR && iRecvResult > 0 )
    148.                         iSendResult = send(tunnelSock, swapBuffer, iRecvResult, 0);
    149.                     else _leave;
    150.                 }
    151.                 if (FD_ISSET(tunnelSock, &fds_read)){
    152.                     iRecvResult = frecv(tunnelSock, swapBuffer, sizeof(swapBuffer), MSG_PEEK);
    153.                     if (iRecvResult == 0) _leave;
    154.                     else iRecvResult = frecv(tunnelSock, swapBuffer, sizeof(swapBuffer), 0);
    155.                     if (iRecvResult != SOCKET_ERROR && iRecvResult > 0 )
    156.                         iSendResult = send(s, swapBuffer, iRecvResult, 0);
    157.                     else _leave;
    158.                 }
    159.             }
    160.         }
    161.     }
    162.  
    163.     if (s) fclosesocket(s);
    164.     if (tunnelSock)fclosesocket(tunnelSock);
    165.     return 0;
    166. }
    167.  
    168. DWORD WINAPI Socks(LPVOID) {
    169.    
    170.     WSADATA wsaData;
    171.     fWSAStartup(MAKEWORD(2,0), &wsaData);
    172.  
    173.     u_long a;
    174.     SOCKET l_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    175.     SOCKADDR_IN sock4;
    176.     sock4.sin_family = AF_INET;
    177.     sock4.sin_port = htons(c(socks_port));
    178.     sock4.sin_addr.s_addr = INADDR_ANY;
    179.     bind(l_sock, (sockaddr*)&sock4, sizeof(sock4));
    180.     listen(l_sock, 0xFF);
    181.     while (true)
    182.         CreateThread(0,0,SocksHandlerTreadProc, (LPVOID)accept(l_sock, 0, 0), 0, &a);
    183. }
     
  2. mc black

    mc black Member

    Публикаций:
    0
    Регистрация:
    19 янв 2005
    Сообщения:
    213
    Адрес:
    Russia, N.Novgorod
    Ух ты, какая интересная вещь! Я не так давно начал изучать Си, так что не до конца понимаю, почему написано "почти полноценный", и как (и в чём) это дело компилируется. В любом случае, спасибо!
     
  3. Av0id

    Av0id New Member

    Публикаций:
    0
    Регистрация:
    21 окт 2004
    Сообщения:
    87
    знаю что раздел про си, но есть очень хороший на асме, который запросто можно портировать

    http://vecna.hellsparty.com/ - socks4, socks4x, socksx