ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
 
 
Опции темы Поиск в этой теме Опции просмотра

Работа через socks5
  #1  
Старый 06.07.2009, 18:41
Аватар для Ant1b10t1k
Ant1b10t1k
Новичок
Регистрация: 18.06.2009
Сообщений: 17
Провел на форуме:
421610

Репутация: 5
По умолчанию Работа через socks5

Хочу написать паблик чекер акк. mail.ru через sock5.
Нашел удобный класс для работы с проксями. После того как я подключился к smtp.mail.ru через проксю, я должен от него получить данные, а потом отправить. Загвоздка в том что я получаю данные и сразу же хост мне lost connection. Все уже пересмотрел ошибок вроде нет. Посмотрите вы пожалуйста. С прокси все нормально. Без проксей все получается, думаю что ошибка в классе а найти не могу помогите.

Код:
 #include <winsock2.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <iostream>
  using namespace std;

  #pragma comment(lib, "Ws2_32.lib")

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("10.10.7.150"); // Впишите сюда нужный адрес
    ssock.socks_port = htons(1080); // Впишите сюда порт
    
    if (!ssock.CreateSocket()) return;	// Can't connect to socks
					// or auth required
    if (!ssock.Connect("smtp.mail.ru", htons(2525))) return; // www.mail.ru 
							  // is inaccessible
    
    char buf[79];
    ssock.Recv(buf, 79);

    LPSTR q = "EHLO mail.ru";
    ssock.Send(q, strlen(q));

    ssock.Close();
    WSACleanup();
}
Что получаю от сервака. Отловив сниффером

Код:
220 mail.ru ESMTP Mon, 06 Jul 2009 15:39:05 +0400
421 mx39.mail.ru lost input connection
EHLO mail.ru
 
Ответить с цитированием
 



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Логи nginx и открытый порт через r57shell TRX.new Анонимность 3 16.06.2009 10:49
Получение шелла через MBot Goudini ICQ 2 02.12.2006 02:14
Посылка Cookie через Header (PHP) cop PHP, PERL, MySQL, JavaScript 12 25.11.2006 01:26
Как выйти в интернет с ноутбука через мобильник novichok Сотовый фрикинг 1 08.03.2006 02:18
Через MSN Messenger и AIM распространяется опасный червь DRON-ANARCHY Мировые новости 0 25.07.2005 08:01



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ