Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Сетевое программирование > Tor Control на Delphi


Автор: Jiro 22.09.15, 19:19
Доброденько.

Есть ли рабочие примеры, управления TOR-ом ?

Автор: Fr0sT 23.09.15, 07:03
А какого рода управление нужно?

Автор: Jiro 23.09.15, 07:57
Меня интересует смена нима для текущего подключения главным образом.
Ну а в идеале конечно было бы неплохо иметь возможность полноценно общаться с тором и получать от него всю инфу.


В этих ваших интернетах есть один пример, в разных вариантах, один такой вариант ниже.
Но он не работает, тк после tcp.SendCmd('AUTHENTICATE',-1); результат приходит 515 Чё делать то?

Тор завожу так:
Цитата

"C:\Users\Userok\Desktop\BTor Browser\Browser\TorBrowser\Tor\tor.exe" --defaults-torrc "C:\Users\Userok\Desktop\BTor Browser\Browser\TorBrowser\Data\Tor\torrc-defaults" -f "C:\Users\Userok\Desktop\BTor Browser\Browser\TorBrowser\Data\Tor\torrc" DataDirectory "C:\Users\Userok\Desktop\BTor Browser\Browser\TorBrowser\Data\Tor" GeoIPFile "C:\Users\Userok\Desktop\BTor Browser\Browser\TorBrowser\Data\Tor\geoip" GeoIPv6File "C:\Users\Userok\Desktop\BTor Browser\Browser\TorBrowser\Data\Tor\geoip6"


Не рабочий пример из интернетов:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    procedure TorChangeIP(AHost: string; APort: integer);
      const ErrMsg = 'Tor ChangeIP Error: ';
      var tcp: TIdTCPClient;
    begin
      tcp:=TIdTCPClient.Create(nil);
      try
        tcp.Host:=AHost;
        tcp.Port:=APort;
        tcp.Connect;
        try
          tcp.SendCmd('AUTHENTICATE',-1);
          if tcp.LastCmdResult.TextCode<>'250' then
            raise Exception.Create(ErrMsg+tcp.LastCmdResult.TextCode);
          tcp.SendCmd('SIGNAL NEWNYM',-1);
          if tcp.LastCmdResult.TextCode <>'250' then
            raise Exception.Create(ErrMsg+tcp.LastCmdResult.TextCode);
        finally
          tcp.Disconnect;
        end;
      finally
        tcp.Free;
      end;
    end;

Автор: Fr0sT 23.09.15, 15:52
Так может в настройках тора надо аутентиф-ся. Можно поснифать, как общается с ним Видалия

Автор: Jiro 23.09.15, 21:27
Хорошо бы, только вот инструмента хорошего для этого нету, был когда-то appsniff хорошая штуковина, но на x64 не работает, а аналогов я не знаю, пробовал некоторые сниферы, но без результата. :(

Автор: Fr0sT 24.09.15, 09:01
Я в основном SmSniff юзаю, но можно и монстра WireShark попробовать

Автор: Jiro 24.09.15, 12:08
SmSniff - это снифер трафика сетевой карты, а нужен снифер между двумя локальными приложениями, как раз appsniff это умел делать, внедряясь в чужой процесс.
WireShark - давно как-то использовал, чё-то он мне своим недружественным фейсом вобще не понравился.

Автор: Fr0sT 25.09.15, 08:10
Так все равно через сокеты, если не ловит обмен через локалхост - укажи в настройках внешний адрес вместо 127.0.0.1 и будет ловить

Автор: Jiro 25.09.15, 20:10
Всё, со всем разобрался всё работает. :)

Автор: MasterBoy 02.08.16, 11:52
Цитата Jiro @
Всё, со всем разобрался всё работает. :)

Извиняюсь за некропост, но тем не менее не могли бы вы подсказать как именно решился вопрос ?

У меня выдает вот такой выхлоп.

==============
13:56:08 Ошибка авторизации на порте управления: Authentication failed: Password did not match HashedControlPassword value from configuration. Maybe you tried a plain text password? If so, the standard requires that you put it in double quotes.
==============

Скрытый текст


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     

// Обработка статуса TOR
if (Exec <> 0) and (ExePID <> 0) then
begin
LogFileAdd('TOR_EXEC:' + IntToStr(Exec) + ' PID:' + IntToStr(ExePID) + ' SocksPort:' + IntToStr(Port) + ' ControlPort:' + IntToStr(ControlPort));
LogFileAdd('Ожидание готовности TOR: 5000');
Delay(5000); // Защитное время ожидания запуска

// Подключение к порту управления
begin
AClient:= TIdTCPClient.Create(nil);
try
AClient.Host := '127.0.0.1';
AClient.Port := ControlPort;
AClient.ConnectTimeout := 10000; // 10.0 sec
AClient.ReadTimeout := 10000; // 10.0 sec
AClient.Connect;
try
AClient.SendCmd ('AUTHENTICATE','16:E60A178AF69054FB6039E7FA8B207A89E20B9AE648BA765540187A558A\r\n');
LogFileAdd('TOR Вернул код ошибки: ' + AClient.LastCmdResult.Code);
if AClient.LastCmdResult.Code = '250' then
begin
LogFileAdd('Авторизация на порте управления прошла успешно 250');
Result := True;
end;
except
on E: Exception do
begin
LogFileAdd('Ошибка авторизации на порте управления: ' + E.Message);
exit
end;
end;
finally
AClient.Free;
end;
end;

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     




Запускаю так:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     

(paramstr(0), '--socksport ' + IntToStr(Port) + ' --controlport ' + IntToStr(ControlPort) + ' --hashedcontrolpassword 16:E60A178AF69054FB6039E7FA8B207A89E20B9AE648BA765540187A558A', @ABuffer[0]);
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     


Пробовал и просто пароль и в кавычках и 16-ричный хоть ты тресни не проходит авторизация и все.

Хотел посмотреть как авторизуется Vidalia, но так и не смог найти подходящего инструмента, через Microsoft LoopBack Adapter не получается, там нет нужнго трафика.

Может кто натолкнет на правильные мысли ? :thanks:

Автор: Jiro 02.08.16, 15:06
MasterBoy

я уже не помню что да как там с этим хэшем и авторизацией, просто в итоге пришёл к выводу, что проще на эту авторизацию забить и работать без неё.
То есть просто запускать тор без параметра HashedControlPassword и его значения.



Добавлено
ну а далее можешь слать вские там newnymb и тд.

Автор: MasterBoy 02.08.16, 18:38
Я вас понял, но это не решение вопроса, у меня получилось, для поддержания форума я поделюсь ответом.

Случайно натолкнулся в недрах интернета что на контрольный порт тора можно цепляться телнетом, введя ту последовательность которая реализована в коде моей программы я быстро получил отлуп аналогичный выхлопу исключения, потом пробовал различные варианты пока не получил код 250, и о да страйк ! AClient.SendCmd ('AUTHENTICATE "mypassword"'); запрос должен выполняться без запятой ! и пароль обязательно в кавычках (о чем и написано в выхлопе исключения) тема решена, профит.

======================
15:44:42 TOR_EXEC:356 PID:4176 SocksPort:32207 ControlPort:32208
15:44:42 Ожидание готовности TOR: 5000
15:44:47 TOR Вернул код ошибки: 250
15:44:47 Авторизация на порте управления прошла успешно 250
======================

Есть еще вопросы, уважаемый Jiro не могли бы вы подсказать как мне определить (какими командами через порт контрола) готовность тора к отправке трафика ?

Автор: Jiro 03.08.16, 03:16
Цитата MasterBoy @
какими командами через порт контрола) готовность тора к отправке трафика ?


Если не ошибаюсь то
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    IdTCPClient1.SendCmd('GETINFO status/bootstrap-phase', -1);
и далее тор возвращает фазу готовности в процентиках.
но возможно перед этим нужно ещё пульнуть команду TAKEOWNERSHIP.

Вообще лучше поснифить, там всё точно покажется, чем снифить вопрос хороший ... я чем-то снифил, увы не помню чем.
вроде использовал SockSniff от Nirsoft.

ps:
кстати если запускать тор без HashedControlPassword то всё равно нужно слать AUTHENTICATE но уже с параметром -1:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
      IdTCPClient1.SendCmd('AUTHENTICATE',-1);

Автор: MasterBoy 03.08.16, 10:32
Цитата Jiro @
Если не ошибаюсь то
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    IdTCPClient1.SendCmd('GETINFO status/bootstrap-phase', -1);
и далее тор возвращает фазу готовности в процентиках.
но возможно перед этим нужно ещё пульнуть команду TAKEOWNERSHIP.

Огромное спасибо, отправив GETINFO status/bootstrap-phase я получил 250-status/bootstrap-phase=NOTICE BOOTSTRAP PROGRESS=100 TAG=done SUMMARY="Done" - то что нужно ! В самое яблочко. TAKEOWNERSHIP отправлять не требуется. Еще раз и спасибо добрый человек. :thanks:

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)