Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.12.2020, 13:53   #1
kinohund1
 
Регистрация: 14.02.2017
Сообщений: 8
По умолчанию Подключение к домену через socks5

Здравствуйте.
Помогите пожалуйста с подключением к .onion серверу.

Есть стандартный код socks5:

Код:
socks5_r_TPC:record 
    ver:byte;
    cmd:byte;
    rsv:byte;
    atyp:byte;
    ip:u_long;
    port:u_short;
  end;

begin
 socks5_r.ver:=5;
 socks5_r.nmet:=1;
 socks5_r.met:=0;
 socks5_r_TPC.ver:=5;
 socks5_r_TPC.cmd:=1;
 socks5_r_TPC.rsv:=0;
 socks5_r_TPC.atyp:=3;

socks5_r_TPC.ip := inet_addr('rt56jg78jghsu.onion');
socks5_r_TPC.port:=htons(80);
Подключение идет к ip адрессу: socks5_r_TPC.atyp:=1;
Заменяю на socks5_r_TPC.atyp:=3;
Теперь подключение должно идти к домену. В данном случае к торовскому серверу.
Но как создать само подключение.
Подключение к ip адрессу происходит следущим образом: socks5_r_TPC.ip := inet_addr('56.63.741.23');
Но как подключится к торовскому домену?

socks5_r_TPC.ip := inet_addr('rt56jg78jghsu.onion'); - данный вариант не срабатывает.


Заранее благодарю за помощь.
kinohund1 вне форума Ответить с цитированием
Старый 21.12.2020, 01:47   #2
GreyScall
Пользователь
 
Аватар для GreyScall
 
Регистрация: 01.01.2011
Сообщений: 29
По умолчанию

Во-первых, функция inet_addr() может принимать только IP-адрес. А вы ему суёте имя домена (да ещё и к тому же псевдо-домена).

Во-вторых, в общем случае у псевдо-доменов .onion в принципе нет явного публичного IP-адреса.
Из приведённого фрагмента не очень понятно что именно вы пытаетесь сделать, но запросы к псевдо-доменам .onion придётся делать через сеть Tor-серверов.
А вот добиться этого можно разными путями, как будет удобнее - зависит от ситуации. Для начала можно попробовать просто через какой-либо прокси-сервер (понимающий .onion).
Regards, GreyScall.
GreyScall вне форума Ответить с цитированием
Старый 21.12.2020, 11:41   #3
kinohund1
 
Регистрация: 14.02.2017
Сообщений: 8
По умолчанию

Вы все верно описали.
Просто возникло недопонимание.
Как раз проблема подключения и заключается в inet_addr().
Ее нужно заменить на что то другое, что бы шло подключение не к ip адрессу а к домену onion,
который ip адресса не имеет.
Понятно что преобразование вида: pinteger(gethostbyname('rt56jg78jgh su.onion').h_addr^)^;
то же работать не будет.

Нужно именно заменить: socks5_r_TPC.ip := inet_addr('rt56jg78jghsu.onion'); на что то другое.

Ниже привожу полный код:

Код:
var
 sock:LongWord;
 block:u_long;
 SockAddrIn:TSockAddrIn;
 timeout:ttimeval;
 fds:TFDSet;
 rc,curr,len:integer;
 ws:TWSAData;
 send_buf, result:string;
 buf:array[0..4095] of char;
 strtarget : string;

 socks5_r:record // ??????
   ver:byte;
   nmet:byte;
   met:byte;
   end;

  socks5_r_TPC:record // ???? ????????????
    ver:byte;
    cmd:byte;
    rsv:byte;
    atyp:byte;
    ip:u_long;
    port:u_short;
  end;

begin
 //???????????

 socks5_r.ver:=5;
 socks5_r.nmet:=1;
 socks5_r.met:=0;
 WsaStartup($202,ws);
 //?????? ??????????
 socks5_r_TPC.ver:=5;
 socks5_r_TPC.cmd:=1;
 socks5_r_TPC.rsv:=0;
 socks5_r_TPC.atyp:=3;

socks5_r_TPC.ip := inet_addr(string('rt56jg78jghsu.onion'));

 socks5_r_TPC.port:=htons(2365);

 block:=1;
 sock:=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 if sock=LongWord(-1) then exit;
 SockAddrIn.sin_family := AF_INET;
 SockAddrIn.sin_port := htons(9050);
 SockAddrIn.sin_addr.s_addr := inet_addr(Pansichar('127.0.0.1'));

 ioctlsocket(sock, FIONBIO, block); // ????????? ????? ? ????????????? ?????
 if connect(sock, SockAddrIn, SizeOf(SockAddrIn))=SOCKET_ERROR then // ???????? ????????????
  begin
   if WSAGetLastError=WSAEWOULDBLOCK then // ????????? ??? ????? ??????? ? ????????????? ?????
     begin
      FD_ZERO(fds);
      FD_SET(sock,fds);
      timeout.tv_sec:=strtoint('1000');//(form2.Edit1.Text); // ??? ???????
      timeout.tv_usec:=0;
      rc:=select(0, nil, @fds, nil, @timeout); // ???????
     end;
   end;
 block:=0;
 ioctlsocket(sock, FIONBIO, block); // ????????? ????? ??????? ? ??????????? ?????
if rc=0 then
 begin
   // ???????? ???????

   showmessage('showresultbad');
 end
else
 begin
   // ?????? ???????????
  // ?????? ??? http
   send_buf:='GET http://'+'mail.ru'+'/ HTTP/1.1'#13#10+
              'Host: '+'domen.ru'+#13#10+
              'Accept: */*'+#13#10+
              'Proxy-Connection: Keep-Alive'+#13#10+
              'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 4.7 (build 01670); Crazy Browser 1.0.5; .NET CLR 1.1.4322; .NET CLR 2.0.50727)'#13#10#13#10;


    send(sock,socks5_r, 3,0); // ???? ??????
          len := recv(sock, socks5_r, 2, 0); // ??????? ??????

          if len > 0 then // ???? ???? ?????
          begin
            //??????? ?????????
            if (socks5_r.ver=5) and(socks5_r.met=0) then //?????
              begin

                send(sock, socks5_r_TPC, 10,0); // ?????? ?? ?????????? ? http ??????
                len := recv(sock,  socks5_r_TPC, 10, 0); // ??????? ??????
                if len > 0 then
                  if socks5_r_TPC.cmd=0 then //?????
                    begin

                         send(sock, send_buf[1], length(send_buf),0); // ???? ??????? http ????? ????? ??????
                             len := recv(sock,  buf, 4096, 0); // ?????? ?????
                             if len > 0 then
                              begin
                                result := copy(buf, 0, len);
                                if pos('200 OK', result)<>0 then result:='GOOD';
                              end;
                    end;

              end;

          end;
     if result='GOOD' then showmessage('showresultgood'); //synchronize(showresultgood);

 end;
  closesocket(sock);
  //synchronize(dec_count);

 end;
Благодарю за ответ.
kinohund1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
UDP через SOCKS5 WeSTMan C# (си шарп) 0 20.06.2020 13:11
как отправить пакет через socks5 Playtowin C/C++ Сетевое программирование 6 06.10.2014 13:04
Windows Server 2003 подключение к домену PadrivNICK Windows 2 28.09.2013 13:29
подключение двух компьютеров к интернет через одно подключение Chudo4258 Помощь студентам 3 30.03.2010 16:07
Подключение через WinInet SHEI'TI Работа с сетью в Delphi 1 15.02.2007 19:53