socks 5 server на чистом си

Тема в разделе "WASM.NETWORKS", создана пользователем blablabla, 26 мар 2010.

  1. blablabla

    blablabla New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2010
    Сообщения:
    16
    никак не могу найти сокс сервер на чистом си.
    единственно - Satanic socks server не компилируется ни в visual studio, ни в борланде. орёт на синтаксис строки bool swrite(SOCKET s, char* Buff, int buff_size) {....}
    html лог прикреплён
    прошу подскажите где можно взять рабочий, чтобы легко встраивался в проект (потому что я думал из 3proxy вытянуть модуль, но не получается)
     
  2. blablabla

    blablabla New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2010
    Сообщения:
    16
    http://rghost.ru/1245969
     
  3. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    найди отвратительный socks5 от Izg0y,
    он в принципе-то написан более-менее по рфц, но Izg0y такой бестолковый кодер, что тебе придётся часик-другой поисправлять его гoвнокод и безграмотные комменты, которые он, зачем-то, решил писать на языке, которого совершенно не знает.
    на самом деле, когда я увидел его сорцы, я не знал что лучше сделать: набить морду автору, или сесть и заплакать.

    но я знаю - ты справишься )

    там реализована авторизация по rfc1929, bind и udp, что как бы даже круто. советую хотя-бы изучить и написать самостоятельно.
     
  4. sign63

    sign63 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    4
    я так понимаю msvc и bcpp не поддерживают c99? ставлю intel C++, может буду мучать cygwin+gcc
    странно, что никто так и не сказал в чем проблема (на сорцах.ру. тоже ) хотя везде твердят тут суперпуперчеловеки сидят
     
  5. sign63

    sign63 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    4
    всё равно не компилиться
    поменял этот тупизм. bool на int и true c false на 1 и 0 соответственно
    с винАпи я вобще не знаком и прошу помочь

    вот листинг
    Код (Text):
    1. //#define UNIX 1
    2. #define WIN32 1
    3. // #define AUTH_ON 1
    4.  
    5. #define BUFF_SIZE 1024
    6.  
    7. #ifdef AUTH_ON
    8.  
    9.   const char AuthLogin[] = "login";
    10.   const char AuthPass[] = "pass";
    11.   #define SOCKS5_METHOD 0x02      
    12. #else
    13.  
    14.   #define SOCKS5_METHOD 0x00        
    15. #endif
    16.  
    17. #ifdef UNIX
    18.  
    19. #include "sys/types.h"
    20. #include "sys/socket.h"
    21. #include "netinet/in.h"
    22. #include "netdb.h"
    23.  
    24. typedef int SOCKET;
    25. typedef int bool;
    26. typedef int __stdcall;
    27.  
    28. #define SOCKET_ERROR -1
    29. #define INVALID_SOCKET -1
    30.  
    31. #define 1 0
    32. #define true 1
    33.  
    34. #define SD_BOTH SHUT_RDWR
    35.  
    36. #define _malloc malloc
    37. #define closesocket close
    38.  
    39. void create_thread(void* func, void* param)
    40. {
    41.   int ThrId;
    42.   pthread_create(&ThrId, 0, func, param);
    43. }
    44.  
    45. #endif
    46.  
    47. #ifdef WIN32
    48.  
    49. #include "winsock.h"
    50. #include "stdbool.h"
    51.  
    52.  
    53.  
    54. typedef UINT in_addr_t;
    55.  
    56. #define strcmp lstrcmp
    57. #define free GlobalFree
    58.  
    59. void create_thread(void* func, void* param)
    60. {
    61.   CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)func, param, 0, NULL);
    62. }
    63.  
    64. char* _malloc(int BuffSize)
    65. {
    66.   return (char*)GlobalAlloc(GMEM_FIXED, BuffSize);
    67. }
    68.    
    69. void bzero(void* lpBuff, int BuffSize)
    70. {
    71.   _asm
    72.   {
    73.     xor eax, eax
    74.     mov ecx, BuffSize
    75.     mov edi, lpBuff
    76.     cld
    77.     rep stosb
    78.   }
    79. }
    80.                              
    81. #endif
    82.  
    83. #define SOCKS_VERSION 0x05
    84. #define SOCKS_SUCCESS 0x00
    85. #define SOCKS_FAILURE 0x01
    86. #define SOCKS_CONNECTION_REFUSED 0x05
    87. #define SOCKS_CMD_NOT_SUPPORTED 0x07
    88.  
    89. typedef struct
    90. {
    91.  
    92.   char* _ConnectStruct;
    93.   SOCKET From;
    94.   SOCKET To;
    95.   char Buff[BUFF_SIZE];
    96.   char* Error;
    97.  
    98. } SOCKSPIPE;
    99.  
    100. typedef SOCKSPIPE* LPSOCKSPIPE;
    101.  
    102. typedef struct _CONNECTSTRUCT
    103. {
    104.  
    105.   SOCKSPIPE FromStruct;
    106.   SOCKSPIPE ToStruct;
    107.   char Error;
    108.  
    109. } CONNECTSTRUCT;
    110.  
    111. typedef CONNECTSTRUCT* LPCONNECTSTRUCT;
    112.  
    113. LPCONNECTSTRUCT CreateConnectStruct(SOCKET From, SOCKET To)
    114. {
    115.   LPCONNECTSTRUCT Result = (LPCONNECTSTRUCT)_malloc(sizeof(CONNECTSTRUCT));
    116.  
    117.   Result->FromStruct._ConnectStruct = (char*)Result;
    118.   Result->FromStruct.From = From;
    119.   Result->FromStruct.To = To;
    120.   Result->FromStruct.Error = &(Result->Error);
    121.  
    122.   Result->ToStruct._ConnectStruct = (char*)Result;
    123.   Result->ToStruct.From = To;
    124.   Result->ToStruct.To = From;
    125.   Result->ToStruct.Error = &(Result->Error);
    126.  
    127.   Result->Error = 0x00;
    128.  
    129.   return Result;
    130. }
    131.  
    132. int swrite(SOCKET s, char* Buff, int buff_size)
    133. {
    134.   int bytes;
    135.  
    136.   while(buff_size > 0)
    137.   {
    138.     bytes = send(s, Buff, buff_size, 0);
    139.  
    140.     if((bytes == 0)||(bytes == SOCKET_ERROR))
    141.       return 1;
    142.     buff_size -= bytes;
    143.     Buff += bytes;
    144.   }
    145.  
    146.   return 1;
    147. }
    148.  
    149. int sread(SOCKET s, char* Buff, int buff_size)
    150. {
    151.   int bytes;
    152.  
    153.   while(buff_size > 0)
    154.   {
    155.     bytes = recv(s, Buff, buff_size, 0);
    156.  
    157.     if((bytes == 0)||(bytes == SOCKET_ERROR))
    158.       return 1;
    159.  
    160.     buff_size -= bytes;
    161.     Buff += bytes;
    162.   }
    163.  
    164.   return 1;
    165. }
    166.  
    167. __stdcall SocksPipe(LPSOCKSPIPE PipeStruct)
    168. {
    169.   int bytes;
    170.  
    171.   do
    172.   {
    173.     bytes = recv(PipeStruct->From, PipeStruct->Buff, BUFF_SIZE, 0);
    174.  
    175.     if((bytes == 0) || (bytes == SOCKET_ERROR))
    176.       break;
    177.  
    178.     if(*(PipeStruct->Error) & 0x01)
    179.     {
    180.       *(PipeStruct->Error) |= 0x02;
    181.       return 0;
    182.     }
    183.  
    184.     if(!swrite(PipeStruct->To, PipeStruct->Buff, bytes))
    185.     {
    186.       *(PipeStruct->Error) |= 0x02;
    187.       return 0;
    188.     }
    189.   }
    190.   while(!(*(PipeStruct->Error) & 0x01));
    191.  
    192.   if(*(PipeStruct->Error) & 0x01)
    193.     *(PipeStruct->Error) |= 0x02;
    194.   else
    195.   {
    196.     *(PipeStruct->Error) |= 0x01;
    197.     shutdown(PipeStruct->From, 2);
    198.     shutdown(PipeStruct->To, 2);
    199.     closesocket(PipeStruct->From);
    200.     closesocket(PipeStruct->To);
    201.  
    202.     while(!(*(PipeStruct->Error) & 0x02))
    203.     {
    204.     #ifdef UNIX
    205.       sleep(1);
    206.     #endif
    207.     #ifdef WIN32
    208.       Sleep(1000);
    209.     #endif
    210.     }
    211.  
    212.     free(PipeStruct->_ConnectStruct);
    213.   }
    214.  
    215.   return 0;
    216. }
    217.  
    218. int Socks5SendCode(SOCKET s, char Code, char* TempBuff, char* ip, char* port)
    219. {
    220.   *(int*)TempBuff = 0x1000000 | (Code << 8) | SOCKS_VERSION;
    221.   *(int*)(TempBuff + 4) = *(int*)ip;
    222.   *(short*)(TempBuff + 8) = *(short*)port;
    223.  
    224.   return swrite(s, TempBuff, 10);
    225. }
    226.  
    227. SOCKET Socks5ServConnect(SOCKET s, char* TempBuff, char* ip, u_short port)
    228. {
    229.   struct sockaddr_in saddr;
    230.   SOCKET Redir = socket(AF_INET, SOCK_STREAM, 0);
    231.  
    232.   if(Redir == INVALID_SOCKET)
    233.     Socks5SendCode(s, SOCKS_FAILURE, TempBuff, ip, (char*)&port);
    234.   else
    235.   {
    236.     bzero(&saddr, sizeof(struct sockaddr_in));
    237.     saddr.sin_family = AF_INET;
    238.     saddr.sin_addr.s_addr = *(in_addr_t*)ip;
    239.     saddr.sin_port = port;
    240.  
    241.     if(connect(Redir, (struct sockaddr*)&saddr, sizeof(struct sockaddr_in)) == -1)
    242.     {
    243.       Socks5SendCode(s, SOCKS_CONNECTION_REFUSED, TempBuff, ip, (char*)&port);
    244.       closesocket(Redir);
    245.       Redir = INVALID_SOCKET;
    246.     }
    247.   }
    248.   return Redir;
    249. }
    250.  
    251. int Socks5CmdIsSupported(SOCKET s, char cmd, char* TempBuff, char* ip, char* port)
    252. {
    253.   if(cmd != 0x01) // 0x02 - bind; 0x03 - udp associate
    254.   {
    255.     Socks5SendCode(s, SOCKS_CMD_NOT_SUPPORTED, TempBuff, ip, port);
    256.     return 1;
    257.   }
    258.  
    259.   return 1;
    260. }
    261.  
    262. int Socks5GetCmd(SOCKET s, char* TempBuff, char* cmd, char* ip, char* port)
    263. {
    264.   struct hostent* hp;
    265.   char DnLen;
    266.   char AddrType;
    267.   char Tmp[5];
    268.  
    269.   if(!sread(s, TempBuff, 4))
    270.     return 0;
    271.  
    272.   if((TempBuff[0] != SOCKS_VERSION)||(TempBuff[2] != 0x00))
    273.     return 0;
    274.  
    275.   *cmd = TempBuff[1];
    276.   AddrType = TempBuff[3];
    277.  
    278.   switch(AddrType)
    279.   {
    280.     case 0x01: // ip v4
    281.       if(!sread(s, ip, 4))
    282.         return 0;
    283.       break;
    284.  
    285.     case 0x03: // domain name
    286.  
    287.       if(!sread(s, &DnLen, 1))
    288.         return 0;
    289.       if(DnLen == 0)
    290.         return 0;
    291.       if(!sread(s, TempBuff, DnLen))
    292.         return 0;
    293.       TempBuff[DnLen] = 0x00;
    294.  
    295.       hp = gethostbyname(TempBuff);
    296.  
    297.       if(((int)hp == -1)||((int)hp == 0))
    298.       {
    299.         if(!sread(s, port, 2))
    300.           return 0;
    301.  
    302.         *(int*)(&Tmp) = 0x03000405;
    303.         *(char*)(&Tmp + 4) = DnLen;
    304.  
    305.         if(swrite(s, Tmp, 5))
    306.           if(swrite(s, TempBuff, DnLen))
    307.             swrite(s, port, 2);
    308.  
    309.         return 0;
    310.       }
    311.       else
    312.         *(int*)ip = *(int*)hp->h_addr;
    313.  
    314.       break;
    315.  
    316.     case 0x04:  // ip v6, not supported
    317.       *(int*)(&Tmp) = 0x04000805;
    318.  
    319.       if(sread(s, TempBuff, 16))
    320.         if(sread(s, port, 2))
    321.           if(swrite(s, Tmp, 4))
    322.             if(swrite(s, TempBuff, 16))
    323.               swrite(s, port, 2);
    324.  
    325.       return 0;
    326.  
    327.     default:
    328.       return 0;
    329.   }
    330.  
    331.   return sread(s, port, 2);
    332. }
    333.  
    334. #ifdef AUTH_ON
    335.  
    336.   intf Socks5Auth(SOCKET s, char* TempBuff)
    337.   {
    338.     char Login[256];
    339.     char LoginLen;
    340.     char PassLen;
    341.     char Status = '\xFF';
    342.  
    343.     if(!sread(s, TempBuff, 2))
    344.       return 1;
    345.  
    346.     LoginLen = TempBuff[1];
    347.  
    348.     if((TempBuff[0] != 0x01)||(LoginLen == 0))
    349.       return 1;
    350.  
    351.     if(!sread(s, Login, LoginLen+1))
    352.       return 1;
    353.  
    354.     PassLen = Login[LoginLen];
    355.  
    356.     if(!PassLen)
    357.       return 1;
    358.  
    359.     Login[LoginLen] = 0x00;
    360.  
    361.     if(!sread(s, TempBuff, PassLen))
    362.       return 1;
    363.  
    364.     TempBuff[PassLen] = 0x00;
    365.  
    366.     if((strcmp(AuthLogin, Login) == 0)&&(strcmp(AuthPass, TempBuff) == 0))
    367.       Status = 0x00;
    368.  
    369.     *(short*)TempBuff = (Status << 8) | 0x01;
    370.  
    371.     if(!swrite(s, TempBuff, 2))
    372.       return 1;
    373.  
    374.     return (Status == 0x00);
    375.   }
    376.  
    377. #endif
    378.  
    379. int Socks5Accept(SOCKET s, char* TempBuff)
    380. {
    381.   char MethodsCount;
    382.   char Cmd = '\xFF';
    383.  
    384.   if(!sread(s, TempBuff, 2))
    385.     return 1;
    386.  
    387.   MethodsCount = TempBuff[1];
    388.  
    389.   if((TempBuff[0] != SOCKS_VERSION)||(MethodsCount == 0))
    390.     return 1;
    391.  
    392.   if(!sread(s, TempBuff, MethodsCount))
    393.     return 1;
    394.  
    395.   do
    396.   {
    397.     MethodsCount--;
    398.  
    399.     if(TempBuff[MethodsCount] == SOCKS5_METHOD)
    400.     {
    401.       Cmd = TempBuff[MethodsCount];
    402.       break;
    403.     }
    404.   }
    405.   while(MethodsCount > 0);
    406.  
    407.   *(short*)TempBuff = (Cmd << 8) | SOCKS_VERSION;
    408.  
    409.   if(!swrite(s, TempBuff, 2))
    410.     return 1;
    411.  
    412. #ifdef AUTH_ON
    413.  
    414.   return (Cmd == 0xFF) ? 1 : Socks5Auth(s, TempBuff);
    415. #else
    416.  
    417.   return (Cmd != 0xFF);
    418. #endif
    419.  
    420. }
    421.  
    422. __stdcall AcceptThread(SOCKET s)
    423. {
    424.   SOCKET Redir;
    425.   LPCONNECTSTRUCT ConnectStruct;
    426.   char TempBuff[256];
    427.   char cmd;
    428.   char ip[4];
    429.   u_short port;
    430.  
    431.   if(Socks5Accept(s, TempBuff))
    432.     if(Socks5GetCmd(s, TempBuff, &cmd, ip, (char*)&port))
    433.       if(Socks5CmdIsSupported(s, cmd, TempBuff, ip, (char*)&port))
    434.       {
    435.         Redir = Socks5ServConnect(s, TempBuff, ip, port);
    436.  
    437.         if(Redir != INVALID_SOCKET)
    438.         {
    439.           if(Socks5SendCode(s, SOCKS_SUCCESS, TempBuff, ip, (char*)&port))
    440.           {
    441.             ConnectStruct = CreateConnectStruct(s, Redir);
    442.             create_thread(&SocksPipe, &(ConnectStruct->ToStruct));
    443.             SocksPipe(&(ConnectStruct->FromStruct));
    444.             return 0;
    445.           }
    446.           closesocket(Redir);
    447.         }
    448.       }
    449.  
    450.   closesocket(s);
    451.   return 0;
    452. }
    453.  
    454.  
    455. DWORD WINAPI Socks(LPVOID)
    456. {
    457.   SOCKET s, accepted;
    458.   struct sockaddr_in saddr;
    459.   int saddr_size = sizeof(struct sockaddr_in);
    460.  
    461. #ifdef WIN32
    462.  
    463.   WSADATA WSA;
    464.   if(WSAStartup(MAKEWORD(2, 2), &WSA) != 0)
    465.     return 0;
    466.  
    467. #endif
    468.  
    469.   s = socket(AF_INET, SOCK_STREAM, 0);
    470.  
    471.   if(s != INVALID_SOCKET)
    472.   {
    473.     bzero(&saddr, sizeof(struct sockaddr_in));
    474.  
    475.     saddr.sin_family = AF_INET;
    476.     saddr.sin_port = htons(socks_port);
    477.  
    478.     if(bind(s, (struct sockaddr*)&saddr, sizeof(struct sockaddr_in)) != SOCKET_ERROR)
    479.       if(listen(s, 0) != SOCKET_ERROR)
    480.         for(;;)
    481.         {
    482.           accepted = accept(s, (struct sockaddr*)&saddr, &saddr_size);
    483.  
    484.           if(accepted != INVALID_SOCKET)
    485.             create_thread(&AcceptThread, (void*)accepted);
    486.         }
    487.  
    488.     closesocket(s);
    489.   }
    490.  
    491. #ifdef WIN32
    492.  
    493.   WSACleanup();
    494.   ExitProcess(0);
    495.  
    496. #endif
    497.  
    498.   return 0;
    499. }
     
  6. Marazm

    Marazm Member

    Публикаций:
    0
    Регистрация:
    8 мар 2004
    Сообщения:
    95
    Comer_ дык показали бы как надо, коль скоро вы такой толковый кодер :)
     
  7. sign63

    sign63 New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2010
    Сообщения:
    4
    вот тут http://www.wasm.ru/forum/viewtopic.php?id=24709 еще один socks5 server
    опять же непонятно как/чем такие вещи компилировать.
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    То, что заявлено как чистый си, на самом деле си плюс плюс. А тебе критично, обзови файл .cpp и скомпилируй, какая разница тебе то? Зато скомпилируется и bool и отсутствие формальных параметров
     
  9. blablabla

    blablabla New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2010
    Сообщения:
    16
    конечно критично. меня интересует использование сего сервера в другой программке на чистом си.
     
  10. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    blablabla
    ну и скомпиль .lib с экспортом точки входа, хе..фигли страдать-то?

    Marazm
    вот ещё, я совсем на дурочка похож?
     
  11. blablabla

    blablabla New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2010
    Сообщения:
    16
    я тут на дурочка похож. как это делается? с экспортом - то.
     
  12. blablabla

    blablabla New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2010
    Сообщения:
    16
    в сети есть упоминания о сокс5 сервере от Nec.com, но домена http://www.socks.nec.com уже не существует, да и исходников нигде не видно :dntknw:
    зато нашел сокс сервак от Hewlett Packard :lol:
    может попробую перенести его как-нибудь на винду
     
  13. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    ох.. держите, переделал насколько терпения хватило.
    конпилится на vc6. на vc9 тоже должен бы.
    http://up.cih.ms/comer/sock5.zip
     
  14. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    Зачем писать код в .h файле? :)
     
  15. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    dendi
    Так нужно
    Это стандарт оформления кода на cih.ms
     
  16. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    ohne
    не, это только я так делаю)
    откинь общепринятое, воспринимай хедер таким, какой он есть технически - не более чем ответвление к main.cpp же)
     
  17. blablabla

    blablabla New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2010
    Сообщения:
    16
    404 not found перезалейте, пожалуйста
     
  18. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    всё там же.
     
  19. blablabla

    blablabla New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2010
    Сообщения:
    16
    Comer_ огромное спасибо
     
  20. doesn

    doesn New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2007
    Сообщения:
    97
    редкостный мусор