Как использовать Proxy-сервера TOR'а программно?

Тема в разделе "WASM.NETWORKS", создана пользователем Meatcoins, 17 мар 2008.

  1. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Допустим есть какой-то стандартный код, который создаёт соединение по TCP/IP с каким-то сервером в Internet'е:

    Код (Text):
    1. invoke WSAStartup,101h,offset wsadata
    2. invoke socket,AF_INET,SOCK_STREAM,0h
    3. mov s,eax
    4.  
    5. ...
    6.  
    7. mov sin.sin_addr.s_addr,eax
    8. mov sin.sin_port,PORT
    9. mov sin.sin_family,AF_INET
    10.  
    11. invoke clear,memheap
    12.  
    13. invoke connect,s,addr sin,sizeof(sockaddr_in)
    14. .if eax==0h
    15.  
    16. ...
    17. ...
    18.  
    19. invoke send,s,memheap,eax,0h
    Допустим мы скачали TOR http://www.torproject.org!
    Допустим мы даже знаем как настроить Internet Explorer для работы с TOR, т.е. через Proxy-сервера http://www.torproject.org/docs/tor-doc-web.html.ru!
    Вопрос:
    Можно ли каким-нибудь незамысловатым способом сделать так, чтобы наша программуля тоже соединялась с удалённым сервером через Proxy-сервера TOR?


    Моя догадка:
    Может быть дело во втором параметре функции connect?
    invoke connect,s,addr sin,sizeof(sockaddr_in)
    Т.е. в структуре sockaddr_in?
    А именно в поле sin_addr?
    Но туда вроде обычно кладётся адрес сервера, с кем соединяться!
    Типа так:
    Код (Text):
    1. invoke gethostbyname,eax
    2. assume eax:ptr HOSTENT
    3. mov eax,[eax].h_addr
    4. assume eax:nothing
    5. mov eax,[eax]
    6. mov eax,[eax]
    7.  
    8.     MOV  sin.sin_addr.s_addr,eax
    А как тогда одновременно указать socket'у 2 адреса: адрес proxy-сервера и сервер, с которым надо установить соединение?
     
  2. kyprizel

    kyprizel New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2003
    Сообщения:
    232
    Адрес:
    TSK
    песикиец. новые гении спама?
     
  3. temp666

    temp666 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2007
    Сообщения:
    141
  4. boobl

    boobl New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2008
    Сообщения:
    18
    1) использовать умные (даже иногда бесплатные) загрузчики-перехватчики, которым указать в кач-ве проксисервера 127.0.0.1 9050 и запускать программу токмо через нее.
    2) написать свою ф-цию connect которая сначала будет коннектиться к проксисерверу, обмениваться парой фраз, коннектить проксисервер туда куда надо и возвращаться. Подробнее см. RFC по socks 5.
     
  5. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Код (Text):
    1. myconnect proc hWnd,hMemo,hEdit
    2. LOCAL s:SOCKET
    3. LOCAL memheap:DWORD
    4. LOCAL procheap:DWORD
    5. LOCAL sin:SOCKADDR_IN
    6.  
    7.  
    8.  
    9. invoke GetProcessHeap
    10. mov procheap,eax
    11. invoke HeapAlloc,eax,HEAP_ZERO_MEMORY,4000h
    12. mov memheap,eax
    13.  
    14.  
    15. invoke WSAStartup,101h,offset wsadata
    16. invoke socket,AF_INET,SOCK_STREAM,0h
    17. mov s,eax
    18.  
    19. mov eax,memheap
    20. invoke SendMessage,hEdit,WM_GETTEXT,50h,eax
    21. mov eax,memheap
    22. invoke gethostbyname,eax
    23. assume eax:ptr HOSTENT
    24. mov eax,[eax].h_addr
    25. assume eax:nothing
    26. mov eax,[eax]
    27. mov eax,[eax]
    28. mov  sin.sin_addr.s_addr,eax
    29. mov  sin.sin_port,5000h
    30. mov  sin.sin_family,AF_INET
    31. invoke connect,s,addr sin,sizeof(sockaddr_in)
    32. .if eax==0h
    33.  
    34.  
    35.  
    36. .data
    37.  
    38. CrLf equ 0Dh,0Ah
    39.  
    40. Send_Data db "GET / HTTP/1.1",CrLf
    41.  
    42. db "Accept: */*",CrLf
    43.  
    44. db "Accept-Language: ru",CrLf
    45.  
    46. db "Accept-Encoding: gzip, deflate",CrLf
    47.  
    48. db "If-Modified-Since: Wed, 19 Mar 2008 16:23:38 GMT; length=26538",CrLf
    49.  
    50. db "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",CrLf
    51.  
    52. db "Host: www.yandex.ru",CrLf
    53.  
    54. db "Connection: Keep-Alive",CrLf
    55.  
    56. db "Cookie: yandexuid=395368511203519150; yabs-frequency=/2/M_4vm2G3v____pF_EG0a0qT8wJa090CdCCen02G3F000//fG8e0mK2WWC0",CrLf,CrLf
    57.  
    58. .code
    59.  
    60.  
    61. invoke lstrlen,offset Send_Data
    62. invoke send,s,offset Send_Data,eax,0h
    63.  
    64. mov eax,memheap
    65. invoke recv,s,eax,1000h,0h
    66.  
    67. mov eax,memheap
    68. invoke recv,s,eax,1000h,0h
    69.  
    70. mov eax,memheap
    71. invoke recv,s,eax,1000h,0h
    72.  
    73. mov eax,memheap
    74. invoke recv,s,eax,1000h,0h
    75.  
    76. mov eax,memheap
    77. invoke recv,s,eax,1000h,0h
    78.  
    79.  
    80. invoke shutdown,s,0h
    81. invoke closesocket,s
    82. invoke WSACleanup
    83.  
    84. .endif
    85. invoke HeapFree,procheap,0h,memheap
    86.  
    87.  
    88. endy:
    89. ret
    90. myconnect endp
    Эта функция соединяется по HTTP с каким-то сервером! А сервер посылает в ответ HTML-страничку!

    Берём из Edit'а имя сервера, потом делаем DNS-запрос и т.д.
    Код (Text):
    1. invoke SendMessage,hEdit,WM_GETTEXT,50h,eax
    Если вместо, например, www.yandex.ru написать 127.0.0.1 (localhost), то:
    Код (Text):
    1. mov  sin.sin_addr.s_addr,eax
    2. mov  sin.sin_port,5000h
    3. mov  sin.sin_family,AF_INET
    4. invoke connect,s,addr sin,sizeof(sockaddr_in)
    В eax, который суётся в sin.sin_addr.s_addr находится 0100007Fh, короче, вроде правильно! А функция connect возвращает FFFFFFFFh и ошибку WSAECONNREFUSED (0000274D)!
    Т.е. даже первый пункт не получается сделать! Т.е. соединиться!!!
     
  6. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Как я понял с сервером, возможно, придётся пообщаться как показано ниже...
    Но вопрос:
    Ведь TOR - это программа. Может быть она сама берёт на себя всю эту заботу о Proxy-серверах??? А другая программа (моя разрабатываемая) просто использует TOR! Может быть моей программе и не надо обо всём этом "думать"???

    Код (Text):
    1. Протокол SOCKS 5
    2. SOCKS 5 расширяет модель SOCKS 4, добавляя к ней поддержку UDP, обеспечение универсальных схем строгой аутентификации и расширяет методы адресации, добавляя поддержку доменных имен и адресов IPv6. Начальное установка связи теперь состоит из следующего:
    3.  
    4. Клиент подключается, и посылает приветствие, которое включает перечень поддерживаемых методов аутентификации
    5. Сервер выбирает из них один (или посылает ответ о неудаче запроса, если ни один из предложенных методов не приемлем)
    6. В зависимости от выбранного метода, между клиентом и сервером может пройти некоторое количество сообщений
    7. Клиент посылает запрос на соединение, аналогично SOCKS 4
    8. Сервер отвечает, аналогично SOCKS 4
    9. Методы аутентификации пронумерованы следующим образом:
    10.  
    11. 0x00 — аутентификация не требуется
    12. 0x01 — GSSAPI
    13. 0x02 — имя пользователя / пароль
    14. 0x03-0x7F — зарезервировано IANA
    15. 0x80-0xFE — зарезервировано для методов частного использования
    16. Начальное приветствие от клиента:
    17.  
    18. поле 1: номер версии SOCKS (должен быть 0x05 для этой версии)
    19. поле 2: количество поддерживаемых методов аутентификации, 1 байт
    20. поле 3: номера методы аутентификации, переменная длина, 1 байт для каждого поддерживаемого метода
    21. Сервер сообщает о своём выборе:
    22.  
    23. поле 1: Версия SOCKS, 1 байт (0x05 для этой версии)
    24. поле 2: выбранный метод аутентификации, 1 байт, или 0xFF, если не было предложено приемлемого метода
    25. Последующая идентификация зависит от выбранного метода.
    26.  
    27. Запрос клиента:
    28.  
    29. поле 1: номер версии SOCKS (должен быть 0x05 для этой версии)
    30. поле 2: код команды, 1 байт:
    31. 0x01 = установка TCP/IP соединения
    32. 0x02 = назначение TCP/IP порта (binding)
    33. 0x03 = ассоциирование UDP-порта
    34. поле 3: зарезервированный байт, должен быть 0x00
    35. поле 4: тип адреса, 1 байт:
    36. 0x01 = адрес IPv4
    37. 0x03 = имя домена
    38. 0x04 = адрес IPv6
    39. поле 5: назначение адреса
    40. 4 байта для адреса IPv4
    41. первый байт — длина имени, затем следует имя домена
    42. 16 байт для адреса IPv6
    43. поле 6: номер порта, 2 байта
    44. Ответ сервера:
    45.  
    46. поле 1: номер версии SOCKS, 1 байт (0x05 для этой версии)
    47. поле 2: код ответа, 1 байт:
    48. 0x00 = запрос предоставлен
    49. 0x01 = ошибка SOCKS-сервера
    50. 0x02 = соединение запрещено набором правил
    51. 0x03 = сеть недоступна
    52. 0x04 = хост недоступен
    53. 0x05 = отказ в соединении
    54. 0x06 = истечение TTL
    55. 0x07 = команда не поддерживается / ошибка протокола
    56. 0x08 = тип адреса не поддерживается
    57. поле 3: байт зарезервирован, должен быть 0x00
    58. поле 4: тип последующего адреса, 1 байт:
    59. 0x01 = адрес IPv4
    60. 0x03 = имя домена
    61. 0x04 = адрес IPv6
    62. поле 5: назначение адреса
    63. 4 байта для адреса IPv4
    64. первый байт — длина имени, затем следует имя домена
    65. 16 байт для адреса IPv6
    66. поле 6: номер порта, 2 байта
     
  7. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Эх! Всё! Надо было почитать повнимательнее немного на http://www.torproject.org/docs/tor-doc-web.html.ru!
    В качестве хоста надо указать localhost, а порт 8118 или 9050!
    Тогда функция connect вернёт STATUS_SUCCESS и eax==0h!
    Правда я ещё не понял что дальше-то делать.
    Я вроде как даже и не с Proxy соединился, а "установил взаимодействие" с TOR, как с программой! Видимо, TOR заботится о том с каким Proxy соединяться!
     
  8. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    тор создаёт сок прокси на локальном компутере, привокси цепляется на него и создаёт уже хттп прокси, так что для хттп приложений юзаем 8118 (привокси) для сок 9050 (сам тор)
     
  9. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    А ясненько, т.е. если нам нужен только http,то:
    localhost:8118
    А если нам нужен, например, ftp, pop3 или smtp, то:
    localhost:9050
    Как я понял делаем invoke connect с localhost:9050, а затем в полученный SOCKET делаем invoke send и посылаем запрос на соединение в соответствии с SOCKS 5, который описан в RFC 1928!
    Это я всё себе пока представляю так в теории - на практике, ещё не пробывал...