hook на connect() и попытка соединиться с SOCKS

Тема в разделе "WASM.NETWORKS", создана пользователем REASY, 28 янв 2011.

  1. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    xanxy
    Спасибо, не вроде дурак, перед тем как писать либу читал про SOCKSv5. Вот подробнее:
    Код (Text):
    1. char socks_server[1024];
    2. USHORT socks_port;
    3. char login[256];
    4. char password[256];
    5. // Работа с сокс5 сервером
    6. // Создает SOCKET
    7. SOCKET CreateSock();
    8. // Подключается к Socks-серверу
    9. int ConnectSock(SOCKET sock, char *socks_server, unsigned short socks_port);
    10. // Договариваюсь о методе авторизации
    11. int SendAndChooseAuthMethod(SOCKET sock, bool bUseAuth, const char *login = NULL, const char *password = NULL);
    12. // Запрос к Socks на подключение к host:port
    13. int ConnectionRequest(SOCKET sock, const char *host, unsigned short port);
    14. static int WSAAPI Catch_connect(SOCKET s, const sockaddr * name, int namelen)
    15. {          
    16.     if ( ((sockaddr_in *)name)->sin_addr.S_un.S_addr == inet_addr("127.0.0.1"))
    17.         return Real_connect(s, name, namelen);
    18.  
    19.     if (MODE == MODE_SOCKS)
    20.     {
    21.         if (PortsWithSocks.size == 0)
    22.             return Real_connect(s, name, namelen);
    23.         USHORT port = ((sockaddr_in *)name)->sin_port;
    24.         int i, size = PortsWithSocks.size;
    25.         for (i = 0; i < size; i++)
    26.         {
    27.             if (PortsWithSocks.ports[i] == port)
    28.                 break;
    29.         }
    30.         if (PortsWithSocks.ports[0] != 0)
    31.             if (i == size)
    32.                 return Real_connect(s, name, namelen);
    33.        
    34.         char *ptr = inet_ntoa(((sockaddr_in *)name)->sin_addr);
    35.         char def_host[17];
    36.         strncpy(def_host, ptr,16);
    37.        
    38.         SOCKET sock = CreateSock();
    39.         if (sock == INVALID_SOCKET){
    40. #ifdef MY_DEBUG
    41.             MessageBox(NULL,"CreateSock() failed. connect() with default params!!!", "-err", MB_ICONERROR);
    42. #endif
    43.             return Real_connect(s, name, namelen);
    44.         }
    45.         int err;
    46.         err = ConnectSock(sock, socks_server, socks_port);
    47.         if (err != 0){
    48. #ifdef MY_DEBUG
    49.             MessageBox(NULL,"ConnectSock() failed. connect() with default params!!!", "-err", MB_ICONERROR);
    50. #endif         
    51.             return Real_connect(s, name, namelen);
    52.         }
    53.  
    54.         err = SendAndChooseAuthMethod(sock, TRUE, login, password);
    55.         if (err != PROXYERROR_AUTHGRANTED && err != PROXYERROR_AUTHNOREQUIRED){
    56. #ifdef MY_DEBUG
    57.             MessageBox(NULL,"SendAndChooseAuthMethod() failed. connect() with default params!!!", "-err", MB_ICONERROR);
    58. #endif
    59.             return Real_connect(s, name, namelen);
    60.         }
    61.         err = ConnectionRequest(sock, def_host, ntohs(port));
    62.         if (err != PROXYERROR_CONNECTION_ESTABLISHED){
    63. #ifdef MY_DEBUG
    64.             MessageBox(NULL,"ConnectionRequest() failed. connect() with default params!!!", "-err", MB_ICONERROR);
    65. #endif
    66.             return Real_connect(s, name, namelen);
    67.         }
    68.         ((sockaddr_in *)name)->sin_port = htons(socks_port);
    69.         ((sockaddr_in *)name)->sin_addr.S_un.S_addr = inet_addr(socks_server);
    70. #ifdef MY_DEBUG
    71.         wsprintf(buffer, "Catch_connect. SOCKET sock = %d, SOCKET s = %d", sock, s);
    72.         MessageBox(NULL, buffer, "-err", MB_ICONERROR);
    73. #endif
    74.         //closesocket(sock);
    75.         //Real_connect(s, name, namelen);
    76.         s = sock;
    77.         WSASetLastError(10035);
    78.         return -1;//Real_connect(s, name, namelen);
    79.        
    80.     }
    81.     else
    82.         if (MODE == MODE_TUNNEL)
    83.         {
    84.             //MessageBox(NULL,"Catch_connect() MODE_TUNNEL", "-err", MB_ICONERROR);
    85.             USHORT port = ((sockaddr_in *)name)->sin_port;
    86.             int local = FindInLocal(&LocalForward, port);
    87.             if (local == PORT_NOT_FOUND)
    88.             {
    89.                 int dynamic = FindInDynamic(&DynamicForward, port);
    90.                 if (dynamic == PORT_NOT_FOUND){
    91. #ifdef MY_DEBUG
    92.  
    93.                     wsprintf(buffer, "-err. Catch_connect. Port %d not found in Dynamic or Local. connect() with default params!!!", port);
    94.                     MessageBox(NULL, buffer, "-err.", MB_ICONERROR);
    95. #endif
    96.                     return Real_connect(s, name, namelen);
    97.                 }
    98.                 if (dynamic == ALL_PORTS)
    99.                     dynamic = 0;
    100.                 USHORT new_port = DynamicForward.local[dynamic];
    101.                 char *ptr = inet_ntoa(((sockaddr_in *)name)->sin_addr);
    102.                 char def_host[17];
    103.                 strncpy(def_host, ptr, 16);
    104.  
    105.                 SOCKET sock = CreateSock();
    106.                 if (sock == INVALID_SOCKET){
    107. #ifdef MY_DEBUG
    108.                     MessageBox(NULL,"CreateSock() failed. connect() with default params!!!", "-err", MB_ICONERROR);
    109. #endif
    110.                     return Real_connect(s, name, namelen);
    111.                 }
    112.  
    113.                 int err;
    114.                 err = ConnectSock(sock, "127.0.0.1", ntohs(new_port));
    115.                 if (err != 0){
    116. #ifdef MY_DEBUG
    117.                     MessageBox(NULL,"ConnectSock() failed. connect() with default params!!!", "-err", MB_ICONERROR);
    118. #endif         
    119.                     return Real_connect(s, name, namelen);
    120.                 }
    121.  
    122.                 err = SendAndChooseAuthMethod(sock, TRUE, NULL, NULL);
    123.                 if (err != PROXYERROR_AUTHGRANTED && err != PROXYERROR_AUTHNOREQUIRED){
    124. #ifdef MY_DEBUG
    125.                     MessageBox(NULL,"SendAndChooseAuthMethod() failed. connect() with default params!!!", "-err", MB_ICONERROR);
    126. #endif
    127.                     return Real_connect(s, name, namelen);
    128.                 }
    129.                 err = ConnectionRequest(sock, def_host, ntohs(port));
    130.                 if (err != PROXYERROR_CONNECTION_ESTABLISHED){
    131. #ifdef MY_DEBUG
    132.                     MessageBox(NULL,"ConnectionRequest() failed. connect() with default params!!!", "-err", MB_ICONERROR);
    133. #endif
    134.                     return Real_connect(s, name, namelen);
    135.                 }
    136.                 ((sockaddr_in *)name)->sin_port = new_port;
    137.                 ((sockaddr_in *)name)->sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    138. #ifdef MY_DEBUG
    139.         wsprintf(buffer, "Catch_connect. SOCKET sock = %d, SOCKET s = %d, new_port = %d, ntohs(new_port) = %d", sock, s, new_port, ntohs(new_port));
    140.         MessageBox(NULL, buffer, "-err", MB_ICONERROR);
    141. #endif
    142.                 //closesocket(s);
    143.                 s = sock;
    144.                 WSASetLastError(10035);
    145.                 return -1;             
    146.             }
    147.             else
    148.             {
    149.                 ((sockaddr_in *)name)->sin_port = LocalForward.local[local];
    150.                 ((sockaddr_in *)name)->sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    151.                 return Real_connect(s, name, namelen);
    152.             }
    153.         }
    154. }
     
  2. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    xanxy
    Вчитайтесь в то что я чуть выше написал, а именно пост #12
     
  3. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    xanxy
    Про блокируемые сокеты спасибо. Но сейчас хотя бы с этим разобраться...
     
  4. xanxy

    xanxy New Member

    Публикаций:
    0
    Регистрация:
    18 май 2010
    Сообщения:
    18
    Сори за невнимательность:)
    Возможно не стоит менять значения const sockaddr * name. Кто его знает как они будут использоватся в дальшейшем.