Подскажите исходник socks5 серв. Не пойму с редиректом.

Тема в разделе "WASM.BEGINNERS", создана пользователем _sheva740, 8 окт 2009.

  1. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    Подскажите пожалуйста пример (исходник) socks5 сервера.
    Не пойму никак с редиректом.
    Хочу посмотреть как люди делают.
    Мой код набрал в инете по кускам которые как правило все нерабочие.
    Авторизацию проходит нормально но вот на редиректе стопорит :dntknw:((
    Код (Text):
    1. #define FD_SETSIZE 2
    2. #include <winsock.h>
    3. #include <windows.h>
    4. #include <wininet.h>
    5. #include <winreg.h>
    6. #include <stdio.h>
    7.  
    8. #pragma comment(linker,"/MERGE:.rdata=.text /entry:entry")
    9. #pragma comment(linker,"/MERGE:.data=.text /SECTION:.text,EWR")
    10. #pragma comment(lib, "wininet.lib")
    11. #pragma comment(lib, "ws2_32.lib")
    12. #define PORT 1080 //port!
    13.  
    14. DWORD WINAPI client_thread(LPVOID);
    15. int redirect(DWORD,DWORD);
    16.  
    17.  
    18. typedef struct s5rq_Auth
    19. {
    20.     BYTE ver;
    21.     BYTE nmetod;
    22.     BYTE metods;
    23. };
    24.  
    25. typedef struct s5rq_AddrCl
    26. {
    27.     BYTE    ver;        // 5
    28.     BYTE    cmd ;       // 1 - CONNECT
    29.     BYTE    reserved;   // 0
    30.     BYTE    AType;      // 1 - IPv4; 3 - domain name; 4 - IPv6
    31.     DWORD   dstip;
    32.     WORD    dstport;    // Байты в сетевом порядке, т. е. htons(Port);
    33. };
    34.  
    35.  
    36. int sc_read(SOCKET s,char *buf,int len){
    37.     FD_SET test;
    38.     TIMEVAL time_;
    39.     int can_read, cnt;
    40.     test.fd_count = 1;
    41.     test.fd_array[0] = s;
    42.     time_.tv_sec = 5;
    43.     time_.tv_usec = 0;
    44.  
    45.     do {
    46.         can_read = select(0,&test,NULL,NULL,&time_);
    47.         cnt = recv(s,buf,1,0);
    48.         len--; buf++;
    49.     } while((cnt != 0) && (can_read) && (len != 0));
    50.     return 0;
    51. }
    52. void text_dump(char *buf, unsigned int len)
    53. {
    54.     for(unsigned int i=0;i<len;i++)
    55.         {
    56.         int c = 0;
    57.                 c = *buf;
    58.                 c &= 0x000000ff;
    59.         printf("\\x%.2x",c);
    60.         buf++;
    61.     }
    62.     printf("\n");
    63. }
    64. //s0x0r c0de
    65. int entry()
    66. {
    67.     DWORD               hsock;
    68.     struct sockaddr_in  sin;
    69.     WSADATA             wsa;
    70.  
    71.     WSAStartup(0x202,&wsa);
    72.     hsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    73.     sin.sin_family = AF_INET;
    74.     sin.sin_addr.s_addr=INADDR_ANY;
    75.  
    76.     //a little subroutine, my habbits
    77.     __asm {
    78.         mov ax,PORT
    79.         xchg al,ah
    80.         mov word ptr [sin.sin_port],ax
    81.     }
    82.     printf("bind\t\t...\n");
    83.     bind(hsock, (struct sockaddr *)&sin, sizeof(sin));
    84.     printf("listen\t\t...\n");
    85.     listen(hsock, 10);
    86.  
    87.     while(TRUE)
    88.     {
    89.         CreateThread(NULL,0,&client_thread,(SOCKET *)accept(hsock, 0, NULL),0,0);
    90.     }
    91.  
    92.     return 0;
    93. }
    94. DWORD WINAPI client_thread(LPVOID lpParam)
    95. {
    96.     struct sockaddr_in      sin;
    97.     DWORD                   hsock;
    98.     struct s5rq_Auth        request;
    99.     struct s5rq_AddrCl      request_Addr;
    100.     fd_set                  fds_read;
    101.  
    102.     printf("new thread\t    >>>\n");
    103.  
    104.     u_long  ulVal = 1;
    105.     int     iCtlRes = 0;
    106.     FD_ZERO( &fds_read );
    107.     FD_SET((SOCKET)lpParam, &fds_read);
    108.     TIMEVAL tv = {0};
    109.     tv.tv_sec= 500;
    110.  
    111.     int iSelectResult = select(0, &fds_read, NULL, NULL, &tv);
    112.  
    113.     recv((SOCKET)lpParam,(char *)&request,sizeof(request),0);
    114.     if (request.ver == 5 && request.metods == 0)
    115.     {
    116.         printf("recv 5 1 0\t...\n");
    117.         request.ver = 5;
    118.         request.nmetod = 0;
    119.         printf("send 5 0\t...\n");
    120.            
    121.     //ulVal = 1;
    122.     //iCtlRes = ioctlsocket((SOCKET)lpParam, FIONBIO , &ulVal);
    123.         send((SOCKET)lpParam, (char *)&request, 8, 0); 
    124.     }
    125.     else
    126.     {           printf("recv thread stoped \t...\n");
    127.                 return 0;
    128.     }
    129.  
    130.     recv((SOCKET)lpParam,(char *)&request_Addr,sizeof(request_Addr),0);
    131.     if (request_Addr.ver == 5 && request_Addr.cmd == 1 && request_Addr.AType == 1)
    132.     {
    133.         printf("recv 5 1 0 1 [IP][PORT]\t...");
    134.         text_dump((char *)&request_Addr,sizeof(request_Addr));
    135.  
    136.         sin.sin_family = AF_INET;
    137.         sin.sin_port = request_Addr.dstport;
    138.         memcpy(&(sin.sin_addr),&(request_Addr.dstip), sizeof(sin.sin_addr));
    139.  
    140.  
    141.         hsock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    142.         int iConnectResult=connect(hsock, (struct sockaddr *)&sin, sizeof(sin));
    143.         if (iConnectResult != SOCKET_ERROR)
    144.         {  
    145.             printf("connecting\t...\n");
    146.             request_Addr.ver = 5;
    147.             request_Addr.cmd = 0;
    148.             request_Addr.reserved = 0;
    149.             request_Addr.AType = 1;
    150.  
    151.  
    152.             printf("connect OK\t...\n");
    153.             send((SOCKET)lpParam, (char *)&request_Addr, sizeof(request_Addr), 0);
    154.  
    155.             printf("send 5 0 0 1 [IP][PORT] ...");
    156.             text_dump((char *)&request_Addr,sizeof(request_Addr));
    157.         }
    158.         else
    159.         {
    160.             request_Addr.ver = 5;
    161.             request_Addr.cmd = 1;
    162.             request_Addr.reserved = 0;
    163.             request_Addr.AType = 1;
    164.             if(send((SOCKET)lpParam, (char *)&request_Addr, sizeof(request_Addr), 0) == SOCKET_ERROR)//
    165.                 return SOCKET_ERROR;
    166.             printf("send 5 1 0 1 [IP][PORT]\t...");
    167.             text_dump((char *)&request_Addr,sizeof(request_Addr));
    168.             return SOCKET_ERROR;   
    169.         }
    170.  
    171.         printf("redirect\t...\n");
    172.         redirect(hsock,(SOCKET)lpParam);
    173.     }
    174.     return 0;
    175. }
    176.  
    177. int redirect(DWORD server, DWORD client)
    178. {
    179.     char    buffer[1024];
    180.     fd_set  fd;
    181.  
    182.     while(TRUE)
    183.     {
    184.         FD_ZERO(&fd);
    185.         FD_SET(client, &fd);
    186.         FD_SET(server, &fd);
    187.         select(0, &fd, 0, 0, 0);
    188.  
    189.  
    190.         if(FD_ISSET(client, &fd))
    191.         {
    192.             int client_recv=sc_read(client, buffer, sizeof(buffer));
    193.             if(client_recv== SOCKET_ERROR)
    194.             {
    195.                 printf("recv() client error\t- %d\n",GetLastError());
    196.                 goto quit;
    197.             }
    198.             int client_send=send(server, buffer, client_recv, 0);
    199.             if(client_send == SOCKET_ERROR)
    200.             {
    201.                 printf("send() client error\t- %d\n",GetLastError());
    202.                 goto quit;
    203.             }
    204.         }
    205.         if (FD_ISSET(server, &fd))
    206.         {
    207.             int server_recv=sc_read(server, buffer, sizeof(buffer));
    208.             if(server_recv== SOCKET_ERROR)
    209.             {
    210.                 printf("recv() server error\t- %d\n",GetLastError());
    211.                 goto quit;
    212.             }
    213.             int server_send=send(client, buffer, server_recv, 0);
    214.             if(server_send == SOCKET_ERROR)
    215.             {
    216.                 printf("send() server error\t- %d\n",GetLastError());<<< !!!!!!!!!!!!! GetLastError() =10054
    217.                 goto quit;
    218.             }
    219.         }
    220.     }
    221.     quit:
    222.     closesocket(client);
    223.     closesocket(server);
    224.     return 0;
    225. }
    Спасибо.
     
  2. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    _sheva740, в putty есть встроенный socks5 сервер.
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
  4. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    _sheva740, посмотри исходник putty :)