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

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

  1. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    Доброго времени суток!
    Есть игра heatonline.com. У него есть клиент, тоже на этом сайте можно найти. Особенность этой игры в том, что играть могут только те, у которых IP принадлежит штатам, Канаде и т.п. Пытаюсь обойти это ограничение. Имеется SOCKS5 Proxy-Server, хочу пустить весь TCP трафик через SOCKS5. Что для этого пытаюсь сделать: перехватываю connect подгрузкой своей dll, открыть соединение с SOCKS5 прокси, прохожу авторизацию, указываю SOCKS прокси с кем буду работать, и возвращаю 0, если все ОК. PS: Так вообще можно делать? Вот код dll(не весь):
    Код (Text):
    1. ....
    2. int (WSAAPI * Real_connect)(SOCKET s,   const sockaddr * name, int namelen) = connect;
    3. ....
    4. int ConnectSock(SOCKET sock);
    5. int SendAndChooseAuthMethod(SOCKET sock, bool bUseAuth, const char *login = NULL, const char *password = NULL);
    6. int ConnectionRequest(SOCKET sock, const char *host, unsigned short port);
    7. int ConnectSock(SOCKET sock)
    8. {
    9.     sockaddr_in saSocks;
    10.     memset(&saSocks,0,sizeof(saSocks));
    11.     saSocks.sin_family = AF_INET;
    12.     saSocks.sin_addr.s_addr  = inet_addr(socks_server);
    13.     saSocks.sin_port = htons(socks_port);
    14.     int err = Real_connect(sock, (sockaddr*)&saSocks, sizeof(saSocks));
    15.     /*
    16.  
    17.     */
    18.     if (0 != err){
    19.         char buf[128];
    20.         wsprintf(buf, "-err. Real_connect failed. err = %d, cnt = %d, socks_server = %s, socks_port = %d",
    21.                 err, cnt, socks_server, socks_port);
    22.         //MessageBox(NULL, buf, NULL, MB_OK);
    23.         //closesocket(sock);
    24.         return SOCKET_ERROR;
    25.     }
    26.     return 0;
    27. }
    28. int WSAAPI Catch_connect(SOCKET s, const sockaddr * name, int namelen)
    29. {
    30.     unsigned short remote_port = ntohs(((sockaddr_in *)name)->sin_port);
    31.     char *ptr = inet_ntoa(((sockaddr_in *)name)->sin_addr);
    32.     char remote_host[16];
    33.     strcpy_s((char*)remote_host, 15, (const char*)ptr);
    34.     char buf[128];
    35.     static int err;
    36.     if (strcmp(remote_host, "127.0.0.1") != 0 )
    37.     {
    38.         err = ConnectSock(s);   // <- err всегда SOCKET_ERROR
    39.         if (err != 0){
    40.             wsprintf(buf, "-err. ConnectSock failed. sock = %d, remote_host = %s", s, remote_host);
    41.             //MessageBox(NULL, buf, NULL, MB_OK);
    42.             //ExitProcess(EXIT_FAILURE);
    43.             return -1;
    44.         }
    45.         err = SendAndChooseAuthMethod(s, TRUE, login, password);
    46.         if (err != PROXYERROR_AUTHGRANTED && err != PROXYERROR_AUTHNOREQUIRED){
    47.             MessageBox(NULL, "-err. SendAndChooseAuthMethod failed.", NULL, MB_OK);
    48.             return -1;
    49.         }
    50.         //MessageBox(NULL, remote_host, NULL, MB_OK);
    51.         err = ConnectionRequest(s, remote_host, remote_port);
    52.         if (err != PROXYERROR_CONNECTION_ESTABLISHED){
    53.             MessageBox(NULL, "-err. ConnectionRequest failed.", NULL, MB_OK);
    54.             return -1;
    55.         }
    56.         return 0;
    57.     }
    58.     else
    59.         return Real_connect(s, name, namelen); 
    60. }
    61. BOOL APIENTRY DllMain( HMODULE hModule,
    62.                        DWORD  ul_reason_for_call,
    63.                        LPVOID lpReserved
    64.                      )
    65. {
    66.     if(ul_reason_for_call == DLL_PROCESS_ATTACH)
    67.     {
    68.         InitializeCriticalSection(&cs);
    69.         MessageBox(NULL, "DLL_PROCESS_ATTACH", NULL, MB_OK);
    70.         DetourTransactionBegin();
    71.         DetourUpdateThread(GetCurrentThread());
    72.     //  DetourAttach(&(PVOID&)Real_socket,Catch_socket);
    73.         DetourAttach(&(PVOID&)Real_connect,Catch_connect);
    74.         DetourTransactionCommit();
    75.     }
    76.     else if (ul_reason_for_call == DLL_PROCESS_DETAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH)
    77.     {
    78.         DetourTransactionBegin();
    79.         DetourUpdateThread(GetCurrentThread());
    80.     //  DetourDetach(&(PVOID&)Real_socket,Catch_socket);
    81.         DetourDetach(&(PVOID&)Real_connect,Catch_connect);
    82.         DetourTransactionCommit();
    83.  
    84.     }
    Вот тут err = ConnectSock(s); // <- err всегда SOCKET_ERROR, но WireShark показывает что клиент отправляет запрос на SOCKS прокси.
    Почему такое происходит?
     
  2. EOT

    EOT New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2010
    Сообщения:
    181
    Можешь заюзать sockschain/etc.
     
  3. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    воспользуйся готовым софтом, например Proxifier
     
  4. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    Hellspawn
    EOT
    Знаю про SockCap, FreeCap и Proxifier. Но мне хочется самому разобраться...
     
  5. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    Вначале поступил так: я знал список ip адресов и номера портов к которым подключается клиент. На локальном машине слушал эти порты(локальный прокси). Перехватывал connect и вместо адреса сервера выставлял адрес локальной машины. Клиент подключался к локальной машине и это соединение я перенаправлял на SOCKS прокси. Но ip адресов и портов может быть куча, да и хочется какой-то универсальности... Можно такой вариант переделать, организовав IPC между клиентом(с моей подгруженной DLL) и локальным прокси:
    int WSAAPI Catch_connect(SOCKET s, const sockaddr * name, int namelen)
    {
    // Передать локальному прокси что ожидается подключение к ((sockaddr_in *)name)->sin_addr
    // на порт ((sockaddr_in *)name)->sin_port
    // Прокси подключается к SOCKS5 прокси, проходит авторизацию, и отправляет запрос на подключение к ((sockaddr_in *)name)->sin_addr на порт ((sockaddr_in *)name)->sin_port
    // Ждать, пока откроется порт.
    sockaddr_in saSocks;
    memset(&saSocks,0,sizeof(saSocks));
    saSocks.sin_family = AF_INET;
    saSocks.sin_addr.s_addr = inet_addr(socks_server);
    saSocks.sin_port = htons(socks_port);
    return Real_connect(sock, (sockaddr*)&saSocks, sizeof(saSocks));
    }
     
  6. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    Разобрался, использовал Named Pipe для обмена данными между DLL и программой, которая перенаправляет соединение через SOCK-сервер. До этого пытался организовать обмен данными с помощью Event и FileMapping, это кошмар)). Теперь вопрос в другом, у меня программа работает, тестирую с firefox'ом все ок, даю эту же либу другому человеку, у него она не работает, в чем может быть проблема?? Для инжекта DLL сейчас использую тулзу, которая идет с Detours - withdll.exe
    Вот код DLL, может в ней проблема, я уже не знаю как быть. ОС - Windows 7 x86:
    Код (Text):
    1. // dllmain.cpp
    2. #include "stdafx.h"
    3. #include <Detours.h>
    4.  
    5. #pragma comment (lib,"detours.lib")
    6. #pragma comment (lib,"detoured.lib")
    7. #pragma comment (lib,"WSock32.Lib")
    8.  
    9. int (WSAAPI * Real_connect)(SOCKET s,
    10.                             const sockaddr * name, int namelen)
    11.     = connect;
    12.  
    13. unsigned short ports[65536];
    14. int port_size = -1;
    15. bool GetPorts()
    16. {
    17.     TCHAR exe_name[MAX_PATH];
    18.     //TCHAR buf[256];
    19.     if (!GetModuleFileName(NULL, exe_name, sizeof(exe_name)-1)){
    20.         MessageBox(NULL, "-err. Catch_WSAStartup. GetModuleFileName failed!", NULL, MB_OK);
    21.         return false;
    22.     }
    23.     /*else{
    24.         wsprintf(buf, "k = %d, GetModuleFileName: %s,PID: %d, TID: %d", k, exe_name, GetCurrentProcessId(), GetCurrentThreadId());
    25.         MessageBox(NULL, buf, buf, MB_OK);
    26.     }
    27.     */
    28.     LPTSTR lpszPipename = "\\\\.\\pipe\\mynamedpipe_2";
    29.     BOOL fSuccess;
    30.     DWORD cbRead;
    31.  
    32.     fSuccess = CallNamedPipe(
    33.                         lpszPipename,        // pipe name
    34.                         (LPVOID)exe_name,           // message to server
    35.                         strlen(exe_name)+1, // message length
    36.                         &ports,              // buffer to receive reply
    37.                         sizeof(ports),  // size of read buffer
    38.                         &cbRead,                // number of bytes read
    39.                         500);                 // waits for 20 seconds
    40.     if (fSuccess){
    41.         port_size = cbRead/sizeof(unsigned short);
    42.         return true;
    43.     }
    44.     else
    45.         return false;
    46.    
    47. }
    48. static int WSAAPI Catch_connect(SOCKET s, const sockaddr * name, int namelen)
    49. {
    50.     if ( ((sockaddr_in *)name)->sin_addr.S_un.S_addr == inet_addr("127.0.0.1"))
    51.         return Real_connect(s, name, namelen);
    52.  
    53.     bool bRes = false;
    54.     for(int i = 0; i < port_size; i++)
    55.     {
    56.         if (((sockaddr_in *)name)->sin_port == ports[i]){
    57.             bRes = true;
    58.             break;
    59.         }
    60.     }
    61.     if (ports[0] == 0 || bRes)
    62.     {
    63.         unsigned short new_port = ((sockaddr_in *)name)->sin_port;
    64.         BOOL fSuccess;
    65.         DWORD cbRead;
    66.         LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe");
    67.  
    68.         fSuccess = CallNamedPipe(
    69.                             lpszPipename,        // pipe name
    70.                             (LPVOID)name,           // message to server
    71.                             sizeof(sockaddr_in), // message length
    72.                             &new_port,              // buffer to receive reply
    73.                             sizeof(unsigned short),  // size of read buffer
    74.                             &cbRead,                // number of bytes read
    75.                             500);                 // waits for 20 seconds
    76.         if (fSuccess){
    77.             ((sockaddr_in *)name)->sin_port = new_port;
    78.             ((sockaddr_in *)name)->sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    79.         }
    80.         else
    81.             return -1;
    82.     }
    83.     return Real_connect(s, name, namelen);
    84. }
    85.  
    86. bool bGetPorts;
    87. BOOL APIENTRY DllMain( HMODULE hModule,
    88.                        DWORD  ul_reason_for_call,
    89.                        LPVOID lpReserved
    90.                      )
    91. {
    92.     MessageBox(NULL, "DllMain", NULL, MB_OK);
    93.     if(ul_reason_for_call == DLL_PROCESS_ATTACH)
    94.     {
    95.         MessageBox(NULL, "DLL_PROCESS_ATTACH", NULL, MB_OK);
    96.         bGetPorts = GetPorts();
    97.         if (bGetPorts)
    98.         {
    99.             DetourTransactionBegin();
    100.             DetourUpdateThread(GetCurrentThread());
    101.             //DetourAttach(&(PVOID&)Real_WSAStartup,Catch_WSAStartup);
    102.             DetourAttach(&(PVOID&)Real_connect,Catch_connect);
    103.             DetourTransactionCommit();
    104.         }
    105.         else
    106.             MessageBox(NULL, "GetPorts() failed!!!", NULL, MB_OK);
    107.  
    108.  
    109.     }
    110.     else if (ul_reason_for_call == DLL_PROCESS_DETACH)
    111.     {
    112.         if (bGetPorts)
    113.         {
    114.             DetourTransactionBegin();
    115.             DetourUpdateThread(GetCurrentThread());
    116.             //DetourDetach(&(PVOID&)Real_WSAStartup,Catch_WSAStartup);
    117.             DetourDetach(&(PVOID&)Real_connect,Catch_connect);
    118.             DetourTransactionCommit();
    119.         }
    120.  
    121.     }
    122.     else
    123.         if (ul_reason_for_call == DLL_THREAD_ATTACH)
    124.         {
    125.             MessageBox(NULL, "DLL_THREAD_ATTACH", NULL, MB_OK);
    126.         }
    127.  
    128.     return TRUE;
    129. }
     
  7. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    Блин, походу дела это из-за того, что либу отдавал собранную в режиме DEBUG %)
     
  8. newbie

    newbie New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    1.246
    не проще ли заюзать бесплатный штатовский впн? за 10 мин можно сабж нагуглить
     
  9. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    помимо коннекта есть еще WSAConnect, WSAConnectByList WSAConnectByName(A/W)
     
  10. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    sn0w
    По-правильному их тоже перехватывать нужно ?
     
  11. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
  12. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    Хочу переделать программу, оставить только одну DLL.dll
    Ошибка "Вот тут err = ConnectSock(s); // <- err всегда SOCKET_ERROR, но WireShark показывает что клиент отправляет запрос на SOCKS прокси." устранилась после того как в DllMain при получении DLL_PROCESS_ATTACH инициализировал работу с сокетам - WSAStartup(). Но все бы ничего, только опять некоторые непонятки ))
    Проблема следующая: connect() перехватываю. Если удаленный порт в списке портов, которые нужно отправлять через SOCKS-proxy, то подключаюсь к Socks-proxy, договариваюсь о методе авторизации с ним, отправляю запрос на подключение на remote_ip:port. Все это корректно выполняется. После меняю параметр sockaddr_in, в которых указываю sin_addr и sin_port на Socks-proxy(А нужно ли ?). А как после этого быть? Что вернуть? Соединение с Socks-proxy уже настроено и он ожидает траффика. Если вызвать Real_connect() с измененными sockaddr_in(в моем случае параметр name), то система же откроет новое подключение с Socks-proxy, а этого мне не надо
    Вот код:
    Код (Text):
    1. static int WSAAPI Catch_connect(SOCKET s, const sockaddr * name, int namelen)
    2. {          
    3.     if ( ((sockaddr_in *)name)->sin_addr.S_un.S_addr == inet_addr("127.0.0.1"))
    4.         return Real_connect(s, name, namelen);
    5.  
    6.     if (MODE == MODE_SOCKS)
    7.     {
    8.         if (PortsWithSocks.size == 0)
    9.             return Real_connect(s, name, namelen);
    10.         USHORT port = ((sockaddr_in *)name)->sin_port;
    11.         int i, size = PortsWithSocks.size;
    12.         for (i = 0; i < size; i++)
    13.         {
    14.             if (PortsWithSocks.ports[i] == port)
    15.                 break;
    16.         }
    17.         if (i == size)
    18.             return Real_connect(s, name, namelen);
    19.        
    20.         char *ptr = inet_ntoa(((sockaddr_in *)name)->sin_addr);
    21.         char def_host[17];
    22.         strncpy(def_host, ptr,16);
    23.        
    24.         SOCKET sock = CreateSock();
    25.         if (sock == INVALID_SOCKET){
    26. #ifdef MY_DEBUG
    27.             MessageBox(NULL,"CreateSock() failed. connect() with default params!!!", "-err", MB_ICONERROR);
    28. #endif
    29.             return Real_connect(s, name, namelen);
    30.         }
    31.         int err;
    32.         err = ConnectSock(sock, socks_server, socks_port);
    33.         if (err != 0){
    34. #ifdef MY_DEBUG
    35.             MessageBox(NULL,"ConnectSock() failed. connect() with default params!!!", "-err", MB_ICONERROR);
    36. #endif         
    37.             return Real_connect(s, name, namelen);
    38.         }
    39.  
    40.         err = SendAndChooseAuthMethod(sock, TRUE, login, password);
    41.         if (err != PROXYERROR_AUTHGRANTED && err != PROXYERROR_AUTHNOREQUIRED){
    42. #ifdef MY_DEBUG
    43.             MessageBox(NULL,"SendAndChooseAuthMethod() failed. connect() with default params!!!", "-err", MB_ICONERROR);
    44. #endif
    45.             return Real_connect(s, name, namelen);
    46.         }
    47.         err = ConnectionRequest(sock, def_host, ntohs(port));
    48.         if (err != PROXYERROR_CONNECTION_ESTABLISHED){
    49. #ifdef MY_DEBUG
    50.             MessageBox(NULL,"ConnectionRequest() failed. connect() with default params!!!", "-err", MB_ICONERROR);
    51. #endif
    52.             return Real_connect(s, name, namelen);
    53.         }
    54.         ((sockaddr_in *)name)->sin_port = socks_port;
    55.         ((sockaddr_in *)name)->sin_addr.S_un.S_addr = inet_addr(socks_server);
    56.        
    57.                 // Необходимо же заменить  s = sock; ?
    58.                 /*s = sock;
    59.         WSASetLastError(0);
    60.                 */
    61.                
    62.                 // Что вернуть?
    63.                 //return Real_connect(s, name, namelen);
    64.         //return 0;
    65.        
    66.     }
     
  13. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    >to ALL
    Люди неужели я пишу какую-то глупость, или наоборот, невыполнимые вещи... Гугл мне не помогает. Прочитал 30 страниц ветки WASM.NETWORKS, ничего похожего на то что делаю не увидел...
     
  14. dr_godsl

    dr_godsl New Member

    Публикаций:
    0
    Регистрация:
    13 дек 2009
    Сообщения:
    60
    привет тс. пишу принудительную соксификацию для браузеров, так вот, пишу на асме, изпользую для тестов 3proxy, также выбором пал на протокол socks4, ну собственно кодес:
    Код (Text):
    1. SOCKS4_REQUEST struct
    2.     vn byte ?
    3.     cd byte ?
    4.     port word ?
    5.     ip dword ?
    6.     null dword ?
    7. SOCKS4_REQUEST ends
    8.  
    9. Newconnect proc sock,_name,namelen
    10. local r:SOCKS4_REQUEST
    11. ;local saddr:sockaddr_in
    12. local res:dword
    13. local psubj:dword
    14. local tdw[2]:dword
    15. pusha
    16.     mov res,-1
    17.     lea eax,pOrigconnect
    18.     mov psubj,eax
    19.  
    20.     mov ebx,_name
    21.     cmp (sockaddr_in ptr [ebx]).sin_port,5000h
    22.     jnz @orig
    23.     cmp (sockaddr_in ptr [ebx]).sin_addr.S_un.S_addr,0100007Fh
    24.     jz @orig
    25.     mov r.vn,04h
    26.     mov r.cd,01h
    27.     mov r.port,5000h
    28.    
    29.     m2m r.ip,(sockaddr_in ptr [ebx]).sin_addr.S_un.S_addr
    30.     mov r.null,0
    31.     mov r.null,'oes'
    32.     mov (sockaddr_in ptr [ebx]).sin_addr.S_un.S_addr,0100007Fh
    33.     invoke f3 ptr psubj,sock,_name,namelen
    34.     test eax,eax
    35.     jz @f
    36.     invoke GetLastError
    37.     cmp eax,WSAEWOULDBLOCK
    38.     jnz @exit
    39. @@:
    40.     invoke send,sock,addr r,sizeof SOCKS4_REQUEST,0
    41. @recv: 
    42.     mov ecx,sizeof SOCKS4_REQUEST
    43.     lea edi,r
    44.     xor eax,eax
    45.     cld
    46.     rep stosb
    47. @@:
    48.     invoke recv,sock,addr r,8,0
    49.     test eax,eax
    50.     jz @exit
    51.     lea eax,r
    52.     cmp word ptr [eax],5A00h
    53.     jz @f
    54.     cmp word ptr [eax],5A04h
    55.     jnz @b
    56. @@:
    57.     invoke OutputDebugString,chr$("access granted")
    58.     mov res,0
    59.     jmp @exit
    60. @orig:
    61.     invoke f3 ptr psubj,sock,_name,namelen
    62.     mov res,eax
    63. @exit:
    64. invoke OutputDebugString,chr$("exit")
    65.     popa
    66.     mov eax,res
    67.     ret
    68. Newconnect endp
    кодес так скажем, полурабочий, в ие работает на ура, в опере вроде тоже, хз, бъемся наверное над одной проблемой.
     
  15. xanxy

    xanxy New Member

    Публикаций:
    0
    Регистрация:
    18 май 2010
    Сообщения:
    18
    хукаешь WSAConnect(), в хуке авторизуешься на соксе, мутишь все эти приветствия, установку назначения и возвращаешь хэндл соединения. Все. Дальше все должно быть нормально, не?
     
  16. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    xanxy
    Смотрю библиотекой tracetcp.dll которая вместе с Detours Express 2.1 идет. Программа, которая хукается пользуется connect(), а не WASConnect(). И что значит
    . Какой HANDLE ? Разве WSAConnect возвращает HANDLE ?
     
  17. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    dr_godsl
    Кто такой f3 в вызове invoke f3 ptr psubj,sock,_name,namelen. Вызывает оригинальный connect?
    Можешь написать псевдокод, а не асм.
    И что ты возвращаешь из хученной connect, если соединение с сокс прошло успешно? Исходя из этого
    0 ?
    Я возвращал и 0, и -1. Если 0, то firefox писал в строке состояния Соединено с www.blablabla.ru и все, так и висел.
    Сейчас остановился на связке DLL+программа, которая форвардит порты. Библиотека сначала спрашивает у программы порт(через именованные пайпы). Программа bind'ся на порт, который свободен(sin_port = 0) и возвращает библиотеке номер этого порта. В DLL
    Код (Text):
    1. // заменяю порт и хост
    2. ((sockaddr_in *)name)->sin_port = new_port;
    3. ((sockaddr_in *)name)->sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    4. // вызываю нехучанный connect
    5. return Real_connect(s, name, namelen);
    Программа слущает порт, и весь траффик перенаправляет куда надо.
     
  18. xanxy

    xanxy New Member

    Публикаций:
    0
    Регистрация:
    18 май 2010
    Сообщения:
    18
    ну да, хэндл возвращает socket. Забыл. Значит просто для этого сокета замутить соединене с соксом, произвести все приветствия и тд, и вернуть результат
    Щас под рукой винды нет, но на сколько помню connect вызывает WSAConnect..
    Завтра точно посмотрю
     
  19. REASY

    REASY New Member

    Публикаций:
    0
    Регистрация:
    24 дек 2007
    Сообщения:
    108
    xanxy
    Может мы друг друга не поняли, но где тут handle ? Он же возвращает 0, если все успешно, иначе SOCKET_ERROR если произошла ошибка.
    Я все также и делаю, возвращаю 0 и ничего не происходит...
     
  20. xanxy

    xanxy New Member

    Публикаций:
    0
    Регистрация:
    18 май 2010
    Сообщения:
    18
    По мимо замены порта и хоста, надо посылать всякие версии протокола, хост на который сокс должен перенаправлять и тд. В описании протокола об этом подробнее можно почитать.. А вот после этих приветствий можно тупо отправлять на сокс данные (не разрывая соединения) и сокс будет перенаправлять это на тот хост который ты указал в приветствиях..

    Да я вот тут еще подумал, что возникнут проблемы если сокет(хэндл которого пришел в connect) не блокируемый. Думаю лучшее решение проверять блокируемый сокет или нет, если не блокируемый делаешь его блокируемым, мутишь магию, возвращаешь сокет в не блокируемый и return:)

    Про блокируемый/не блокируемый сокет:
    http://msdn.microsoft.com/en-us/library/ms738573%28v=VS.85%29.aspx
    Про протокол Socks5:
    http://ru.wikipedia.org/wiki/SOCKS

    Да и советую использовать WireShark для просмотра что куда отправляется.
    Вообще попробуй сначала написать код который бы работал через Socks, без хуков и прочего.
    Так же можно в бразуере прописать настройки прокси, и в вирешарке посмотреть что там браузер отправляет. WireShark клево парсит кучи протоколов, и все наглядно показывает..