Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> OpenSSL && Socks5, Связать вместе, как ? 
:(
    Опции темы
Damp1L
Дата 20.1.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Для socks использую следующий код, знаю что он неполный. Но как тестовый вариант думаю пойдёт 
Код

 #include <winsock2.h>
  #include <stdio.h>
  #include <stdlib.h>

  class CTSocket
  {
    public:
      virtual BOOL CreateSocket();
      virtual BOOL Connect(unsigned long ip, unsigned short port);
      virtual BOOL Connect(LPCSTR name, unsigned short port);
      virtual int Send(const char* str, int len);
      virtual int Recv(char* buf, int max);
      virtual void Close();
      virtual unsigned long GetHost(); // Узнать свой адрес. Это тоже может понадобиться.

    private:
      SOCKET sock;
  };

  BOOL CTSocket::CreateSocket()
  {
       return (sock = socket(AF_INET, SOCK_STREAM, 0)) != NULL;
  }

  BOOL CTSocket::Connect(unsigned long ip, unsigned short port)
  {
      SOCKADDR_IN addr;
      memset(&addr, 0, sizeof(addr));
      addr.sin_family = AF_INET;
      addr.sin_addr.S_un.S_addr = ip;
      addr.sin_port = port;
      return connect(sock, (SOCKADDR*)&addr, sizeof(addr)) == 0;
  }
  BOOL CTSocket::Connect(LPCSTR name, unsigned short port)
  {
      HOSTENT* p = gethostbyname(name);
      if (p == NULL) return FALSE;
      return Connect(p->h_addr_list[0], port);
  }


  int CTSocket::Send(const char* str, int len)
  {
      return send(sock, str, len, 0);
  }

  int CTSocket::Recv(char* buf, int max)
  {
      return recv(sock, buf, max, 0);
  }

  void CTSocket::Close()
  {
      closesocket(sock);
  }

  unsigned long CTSocket::GetHost()
  {
      SOCKADDR_IN addr;
      int cbName = sizeof(addr);
      if (getsockname(sock, (SOCKADDR*)&addr, &cbName) == 0)
      {
          return addr.sin_addr.S_un.S_addr;
      } else return 0;
  }


  class CSocksSocket : public CTSocket
  {
    public:
      virtual BOOL CreateSocket();
      virtual BOOL Connect(unsigned long ip, unsigned short port);
      virtual BOOL Connect(LPCSTR name, unsigned short port);
      virtual int Send(const char* str, int len);
      virtual int Recv(char* buf, int max);
      virtual void Close();
      virtual unsigned long GetHost();

     CTSocket* pSocket;
     unsigned long socks_ip;
     unsigned short socks_port;

    private:
      char buffer[512];     // Такого размера точно хватит
      unsigned long l_ip;   // Адрес, возвращаемый функцией GetHost()
  };

  // Реализация
  BOOL CSocksSocket::CreateSocket()
  {
     if (!pSocket->CreateSocket()) return FALSE;
     if (!pSocket->Connect(socks_ip, socks_port)) return FALSE;
     buffer[0] = 5;  // Ver
     buffer[1] = 1;  // 1 method
     buffer[2] = 0;  // no auth
     pSocket->Send(buffer, 3);
     int n = pSocket->Recv(buffer, 2);
     if (n != 2) return FALSE;
     if (buffer[1] != 0) return FALSE;  // method 0 not supported
     return TRUE;
  }

  BOOL CSocksSocket::Connect(unsigned long ip, unsigned short port)
  {
     buffer[0] = 5;  // Ver
     buffer[1] = 1;  // CONNECT
     buffer[2] = 0;  // Reserved
     buffer[3] = 1;  // IPv4
     *((unsigned long*)(buffer + 4)) = ip;
     *((unsigned short*)(buffer + 8)) = port;
     pSocket->Send(buffer, 10);
     int n = pSocket->Recv(buffer, 10);
     if (n != 10) return FALSE;
     if (buffer[1] != 0) return FALSE; // Can't connect
     if (buffer[3] != 1) return FALSE; // Будем требовать, чтобы нам сказали IP, а не что-нибудь другое.
     l_ip = *((unsigned long*)(buffer + 4));
     return TRUE;
  }

  BOOL CSocksSocket::Connect(LPCSTR name, unsigned short port)
  {
     buffer[0] = 5;
     buffer[1] = 1;
     buffer[2] = 0;
     buffer[3] = 3;  // Domain name
     int m = strlen(name);
     buffer[4] = m;  // Length byte
     memcpy(buffer+5, name, m); // Копируем строку без завершающего нуля
     *((unsigned short*)(buffer + 5 + m)) = port;
     pSocket->Send(buffer, m + 7);
     int n = pSocket->Recv(buffer, 10);
     if (n != 10) return FALSE;
     if (buffer[1] != 0) return FALSE;
     if (buffer[3] != 1) return FALSE; // Будем требовать, чтобы нам сказали IP, а не что-нибудь другое.
     l_ip = *((unsigned long*)(buffer + 4));
     return TRUE;
  }

  int CSocksSocket::Send(const char* str, int len)
  {
     return pSocket->Send(str, len);
  }

  int CSocksSocket::Recv(char* buf, int max)
  {
     return pSocket->Recv(buf, max);
  }

  void CSocksSocket::Close()
  {
     pSocket->Close();
  }

  unsigned long CSocksSocket::GetHost()
  {
     return l_ip;
  }

  // Ну, а теперь тестовая прога
  void main()
  {
    WSADATA wsadata;
    CTSocket tsock;
    CSocksSocket ssock;
    ssock.pSocket = &tsock;

    WSAStartup(MAKEWORD(2,2), &wsadata);

    ssock.socks_ip = inet_addr("76.233.95.138"); // Впишите сюда нужный адрес
    ssock.socks_port = htons(6010); // Впишите сюда порт

    if (!ssock.CreateSocket()) return;    // Can't connect to socks
                    // or auth required
    if (!ssock.Connect("www.mail.ru", htons(80))) return; // www.mail.ru
                              // is inaccessible
    LPSTR q = "HEAD / HTTP/1.1\xD\xAHost: www.mail.ru:80\xD\xAUser-Agent: xakep\xD\xA\xD\xA";
    ssock.Send(q, strlen(q));

    char buf[1000];
    int n = ssock.Recv(buf, 1000);
    buf[n] = 0;
    printf("%s", buf);

    ssock.Close();
    WSACleanup();
  }

Ну и код для OpenSSL
Код

#
#include <openssl/crypto.h>
#include <openssl/x509.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/err.h>

           SOCKET sock;
           // build regular SOCK_STREAM sock and connect to server
           // ... (I'm not going into these details)
           // pretend sock is now connected....


           // here's the data items we'll use....
          char buf[1000];
           char request[1000];

           SSL_CTX *ctx;
           SSL *ssl;
           int err;

           // initialize SSL stuff
           //
           SSL_load_error_strings();
           SSL_library_init();


           // build the SSL objects...
           //
           ctx=SSL_CTX_new(SSLv2_client_method());
           ssl=SSL_new(ctx);          
           

           // assign the socket you created for SSL to use
           //
           SSL_set_fd(ssl, sock);


           // communicate!!
           /////////////////////////////////////////////
             err=SSL_connect(ssl);
             sprintf(request, 
                    "GET %s HTTP/1.0\r\nHost: %s\r\n\r\n","/" , 
                    "www.theserver.com");
             err=SSL_write(ssl, request, strlen(request));
             while(1)
             {
                int read_size;
                read_size=SSL_read(ssl, buf, sizeof(buf)-1);
                buf[read_size]='\0';
                if(read_size > 0)
               {
                     // I'm assuming you have a Memo object 
                     //on your application form...
                     //
                    Memo1->SetSelTextBuf(buf);
               }
               else
               {
                break;
               }
             }


             // free the SSL stuff....
             //
             SSL_shutdown(ssl);
             SSL_free(ssl);
             SSL_CTX_free(ctx);

Как это связать вместе ? Вроде всё понятно, а ничего не получается... =(
PM MAIL   Вверх
ptr
Дата 21.1.2008, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 661
Регистрация: 31.5.2006
Где: Новосибирск

Репутация: 9
Всего: 14



Цитата(Damp1L @  20.1.2008,  21:17 Найти цитируемый пост)
Вроде всё понятно, а ничего не получается... =(

Вот с этого и надо начинать. Что пробовал, что не получается?

Дизайн класса кстати не очень. Это и создает трудности.

Это сообщение отредактировал(а) ptr - 21.1.2008, 09:00


--------------------
Единственный способ определить границы возможного - это выйти за эти границы, в невозможное.
Артур Кларк.
PM MAIL ICQ   Вверх
Damp1L
Дата 21.1.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Я пробовал создать методы в классе для SSL, так-же делал процедуру подготовки ссл соединения. А на отправке вываливался еррор Acces volation =( Может кто набросает хотяб простой пример ? Или может курл всёж удастся собрать...
PM MAIL   Вверх
JackYF
Дата 21.1.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 1
Всего: 162



Цитата(Damp1L @  21.1.2008,  14:50 Найти цитируемый пост)
Я пробовал создать методы в классе для SSL, так-же делал процедуру подготовки ссл соединения. А на отправке вываливался еррор Acces volation =( 

Кода ты нам, естественно, не покажешь, да?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Damp1L
Дата 21.1.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Да я его просто переделывал раз 5, а итог тот-же. Вот и не стал сохранять =( Что толку от нерабочего варианта-то =(
PM MAIL   Вверх
JackYF
Дата 21.1.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 1
Всего: 162



Цитата(Damp1L @  21.1.2008,  18:16 Найти цитируемый пост)
Что толку от нерабочего варианта-то =( 

Если бы я так писал программы, то мало что дошло бы до рабочего состояния. Баги могут отлавливаться днями и неделями. Не убивать же из-за этого промежуточные варианты.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Damp1L
Дата 22.1.2008, 04:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 21.3.2006

Репутация: нет
Всего: нет



Оки, попробую ещё раз и выложу код =)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0541 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.