Что нового

Socks5 и tor, парсинг сайтов

kupog

Новичок
Сообщения
12
Репутация
1
Всем привет, нужно парсить сайт находящийся в сети тор. Есть некоторые наработки. Из того, что получилось - серфить средствами Autoit через тор. Но при этом *.onion группа доменная не открывается.
Пример работающего вариант:
Код:
#include <GUIConstantsEx.au3>
#include <IE.au3>
#include <WindowsConstants.au3>


Local $oIE = _IECreateEmbedded()
GUICreate("Embedded Web control Test", 640, 580, _
        (@DesktopWidth - 640) / 2, (@DesktopHeight - 580) / 2, _
        $WS_OVERLAPPEDWINDOW + $WS_CLIPSIBLINGS + $WS_CLIPCHILDREN)
GUICtrlCreateObj($oIE, 10, 40, 600, 360)


GUISetState(@SW_SHOW)

_UseTOR()
_SetUserAgent("Linux, Firefox")
_IENavigate($oIE, "http://2ip.ru")

While 1
    Local $iMsg = GUIGetMsg()
    Select
        Case $iMsg = $GUI_EVENT_CLOSE
            ExitLoop
    EndSelect
WEnd

GUIDelete()

Exit

Func _SetProxy($proxy, $proxybypass = "")
    Local $INTERNET_OPTION_PROXY = 38
    Local $INTERNET_OPEN_TYPE_PROXY = 3
    Local $tBuff = DllStructCreate("dword;ptr;ptr")
    DllStructSetData($tBuff, 1, $INTERNET_OPEN_TYPE_PROXY)
    Local $pproxy = DllStructCreate("char[" & (StringLen($proxy) + 1) & "]")
    DllStructSetData($pproxy, 1, $proxy)
    DllStructSetData($tBuff, 2, DllStructGetPtr($pproxy))
    Local $pproxybypass = DllStructCreate("char[" & (StringLen($proxybypass) + 1) & "]")
    DllStructSetData($pproxybypass, 1, $proxybypass)
    DllStructSetData($tBuff, 3, DllStructGetPtr($pproxybypass))
    $chk_UrlMkSetSessionOption = DllCall("urlmon.dll", "long", "UrlMkSetSessionOption", "dword", $INTERNET_OPTION_PROXY, "ptr", DllStructGetPtr($tBuff), "dword", DllStructGetSize($tbuff), "dword", 0)
EndFunc

Func _UseTOR($TORPort = 9150)
	_SetProxy("socks=127.0.0.1:"&$TORPort)
EndFunc

Func _SetUserAgent($agent)
	$agentLen = StringLen($agent)
	Dim $tBuff = DllStructCreate("char["&$agentLen&"]")
    DllStructSetData($tBuff, 1, $agent)
	$chk_UrlMkSetSessionOption = DllCall("urlmon.dll", "long", "UrlMkSetSessionOption", "dword", 0x10000001, "ptr", DllStructGetPtr($tBuff), "dword", $agentLen, "dword", 0)
EndFunc

Обычные сайты без проблем открывает через тор, а вот *.onion не хочет, пишет, что переход отмене.

Но более предпочтительный вариант, сделать запрос через tcp, т.к. нужно консольное приложение в итогом результате. В эту сторону "копать" у меня хуже вышло.
Сделал такой набросок:
Код:
$proxy = "127.0.0.1"
$port = 9150

$domain = "hss3uro2hsxfogfq.onion"
$path = "/contact.php"
$agent = "Test"

$request = "GET " & $path & " HTTP/1.1" & @CRLF
$request &= "Host: " & $domain & "" & @CRLF
$request &= "User-Agent: " & $agent & "" & @CRLF
$request &= "Connection: close" & @CRLF
$request &= "Accept: application/xhtml+xml,html/text,application/xml;q=0.9" & @CRLF & @CRLF

TCPStartup()

$socket = TCPConnect($proxy, $port)
If $socket = -1 Then Exit

TCPSend($socket, $request)

While 1
    $recv = TCPRecv($socket, 2048)
    If $recv <> "" Then
        ConsoleWrite($recv)
        ExitLoop
    EndIf
WEnd

TCPShutdown()

Но... Проблема тут уже в том, что Тор отвечает, что не работает через HTTP Proxy. Т.е. нужно правильно составить запрос, чтобы получить ответ с содержанием страницы. И на этом этапе у меня ступор, нужна помощь, уже неделю штудирую интернет безрезультатно, знаний не хватает.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
Func _tor()
	TCPStartup()

	$hc = TCPConnect("127.0.0.1", 9050) ; Socks4a Proxy Server

	$sReq = Chr(0x04) _                                     ; Protocol version  4
			 & Chr(0x01) _                                     ; Command Code      1 - establish a tcp/ip stream connection
			 & Chr(0x00) & Chr(0x50) _                        ; Port              80
			 & Chr(0x00) & Chr(0x00) & Chr(0x00) & Chr(0xff) _ ; Ip Adress         Invalid - 0.0.0.255
			 & "" & Chr(0x00) _                           ; User Id           Empty
			 & "rutracker.org" & Chr(0x00) ; Host Name         www.mamma.com
	TCPSend($hc, $sReq)
	While 1
		$sBuff = TCPRecv($hc, 1)
		If @error Then Exit @ScriptLineNumber
		If StringLen($sBuff) > 0 Then ExitLoop
		Sleep(100)
	WEnd
	$sBuff &= TCPRecv($hc, 8)
	Switch StringMid(Hex(BinaryToString($sBuff)), 3, 2)
		Case "5A"
			ConsoleWrite("> request granted" & @CR)
		Case "5B"
			ConsoleWrite("> request rejected or failed" & @CR)
			Exit @ScriptLineNumber
		Case "5C"
			ConsoleWrite("> request failed because client is not running identd (or not reachable from the server)" & @CR)
			Exit @ScriptLineNumber
		Case "5D"
			ConsoleWrite("> request failed because client's identd could not confirm the user id string in the request" & @CR)
			Exit @ScriptLineNumber
	EndSwitch
	$sReq = 'GET /forum/tracker.php?f=1997&nm="' & $data & '" HTTP/1.0' & @CRLF
	$sReq &= "Host: rutracker.org" & @CRLF
	$sReq &= 'Cookie: ' & $sCookies & @CRLF & @CRLF
	TCPSend($hc, $sReq)
	$sRepy = ""
	While 1
		$sBuff = TCPRecv($hc, 1024 * 5)
		If @error Then ExitLoop
		If StringLen($sBuff) > 0 Then
			$sRepy &= $sBuff
;~ 			ConsoleWrite(".")
		EndIf
		Sleep(100)
	WEnd
	TCPCloseSocket($hc)
	Return $sRepy
	TCPShutdown()
EndFunc   ;==>_tor
 
Автор
K

kupog

Новичок
Сообщения
12
Репутация
1
sngr сказал(а):
Код:
Func _tor()
	TCPStartup()

	$hc = TCPConnect("127.0.0.1", 9050) ; Socks4a Proxy Server

	$sReq = Chr(0x04) _                                     ; Protocol version  4
			 & Chr(0x01) _                                     ; Command Code      1 - establish a tcp/ip stream connection
			 & Chr(0x00) & Chr(0x50) _                        ; Port              80
			 & Chr(0x00) & Chr(0x00) & Chr(0x00) & Chr(0xff) _ ; Ip Adress         Invalid - 0.0.0.255
			 & "" & Chr(0x00) _                           ; User Id           Empty
			 & "rutracker.org" & Chr(0x00) ; Host Name         www.mamma.com
	TCPSend($hc, $sReq)
	While 1
		$sBuff = TCPRecv($hc, 1)
		If @error Then Exit @ScriptLineNumber
		If StringLen($sBuff) > 0 Then ExitLoop
		Sleep(100)
	WEnd
	$sBuff &= TCPRecv($hc, 8)
	Switch StringMid(Hex(BinaryToString($sBuff)), 3, 2)
		Case "5A"
			ConsoleWrite("> request granted" & @CR)
		Case "5B"
			ConsoleWrite("> request rejected or failed" & @CR)
			Exit @ScriptLineNumber
		Case "5C"
			ConsoleWrite("> request failed because client is not running identd (or not reachable from the server)" & @CR)
			Exit @ScriptLineNumber
		Case "5D"
			ConsoleWrite("> request failed because client's identd could not confirm the user id string in the request" & @CR)
			Exit @ScriptLineNumber
	EndSwitch
	$sReq = 'GET /forum/tracker.php?f=1997&nm="' & $data & '" HTTP/1.0' & @CRLF
	$sReq &= "Host: rutracker.org" & @CRLF
	$sReq &= 'Cookie: ' & $sCookies & @CRLF & @CRLF
	TCPSend($hc, $sReq)
	$sRepy = ""
	While 1
		$sBuff = TCPRecv($hc, 1024 * 5)
		If @error Then ExitLoop
		If StringLen($sBuff) > 0 Then
			$sRepy &= $sBuff
;~ 			ConsoleWrite(".")
		EndIf
		Sleep(100)
	WEnd
	TCPCloseSocket($hc)
	Return $sRepy
	TCPShutdown()
EndFunc   ;==>_tor
А можно более полную версию скрипта? :-[ На переменные $data и $sCookies ругается.
PS Натыкался на этот пример в сети уже. Но вызвало много сомнений,а именно версия протокола 4, порт и т.п. В целом весь запрос. Сейчас как раз пытаюсь во всем этом разобраться. Изучаю RFC 1928 — Протокол SOCKS 5, но пока что безрезультатно. Если можно, было бы здорово получить готовый рабочий пример к примеру под сайт hss3uro2hsxfogfq.onion :-[
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Распаковываешь и запускаешь это, затем просто

Код:
$oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1')
$oRequest.Open('GET', 'http://flibustahezeous3.onion/')
$oRequest.Setproxy(2,'127.0.0.1:8118')
$oRequest.Send('')
MsgBox(32, '', $oRequest.responsetext)
 
Автор
K

kupog

Новичок
Сообщения
12
Репутация
1
sngr сказал(а):
Распаковываешь и запускаешь это, затем просто

Код:
$oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1')
$oRequest.Open('GET', 'http://flibustahezeous3.onion/')
$oRequest.Setproxy(2,'127.0.0.1:8118')
$oRequest.Send('')
MsgBox(32, '', $oRequest.responsetext)
Обычные сайты работаюn. При попытке зайти на onion:
Forwarding failure

Privoxy was unable to socks5t-forward your request h**p://flibustahezeous3.onion/ through 127.0.0.1: socks5 server unreachable

Just try again to see if this is a temporary problem, or check your forwarding settings and make sure that all forwarding servers are working correctly and listening where they are supposed to be listening.
Да и все равно хочу реализовать на прямую, а не через костыли :stars: Так то уже проще использовать шлюз с api, а интерес именно черезе сокс5 в аутоите реализовать)
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Тебе нужно запустить тор 127.0.0.1:9050, привокси, скрипт - получить счастье. Привокси это прокси, коий может работать поверх socks.
 
Автор
K

kupog

Новичок
Сообщения
12
Репутация
1
sngr сказал(а):
Тебе нужно запустить тор 127.0.0.1:9050, привокси, скрипт - получить счастье. Привокси это прокси, коий может работать поверх socks.
Не помогает. А если в конфиге самого privoxy пытаюсь указать порт тора (например forward-socks5t / 127.0.0.1:9150), то ругается при запуске, что мол не корректно указано. А если просто forward / 127.0.0.1:9150, то уже сам тор ругается, что не работает с http. :stars: Да и все же хочется напрямую реализовать в аутоите самом отправку запроса, чем через прокладку - privoxy.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Там же было всё уже указано, "forward-socks5t *.onion 127.0.0.1:9050 ." точка в конце нужна, разархивировать архив,запустить файл, править не надо конфиг правильный, у AutoIt нет стредств решения задачи, все средства шиндовс - winapi, с TCP функциями пример выше, не будет https, WinHttpRequest не работает с сокс напрямую, прямо может ие и ие в WinINet.au3.
 
Автор
K

kupog

Новичок
Сообщения
12
Репутация
1
sngr сказал(а):
Там же было всё уже указано, "forward-socks5t *.onion 127.0.0.1:9050 ." точка в конце нужна, разархивировать архив,запустить файл, править не надо конфиг правильный, у AutoIt нет стредств решения задачи, все средства шиндовс - winapi, с TCP функциями пример выше, не будет https, WinHttpRequest не работает с сокс напрямую, прямо может ие и ие в WinINet.au3.
Спасибо, с "forward-socks5t *.onion 127.0.0.1:9050 ." заработало наконец, не внимательно справку прочитал :-[ Порт только на стандартный 9150 сменил.
Но это альтернативное решение моей проблемы, под мой задуманный проект не совсем подходит. :-[
В WinINet.au3 описание вроде как FTP/HTTP/HTTPS/Gopher+.
С ИЕ в первом посте своем выложил пример, работает через тор, но только не *.onion сайты.
Вот с tcp как раз мне и подходит и хочется найти решение именно в этом направление. Но тут у меня вопросы. В примере, что Вы выложили не совсем рабочий вариант, чему равны переменные $data и $sCookies? На них ругается и не работает скрипт. Второй вопрос - отправляется запрос socks4, а у тора socks5, работает и с таким запросом?
Т.е. должно наверное выглядеть как минимум примерно так:
Код:
$sReq = Chr(0x05) _                                     ; Protocol version  5
             & Chr(0x01) _                                     ; Command Code      1 - establish a tcp/ip stream connection
             & Chr(0x00) & Chr(0x50) _                        ; Port              80
             & Chr(0x00) & Chr(0x00) & Chr(0x00) & Chr(0xff) _ ; Ip Adress         Invalid - 0.0.0.255
             & "" & Chr(0x00) _                           ; User Id           Empty
             & "rutracker.org" & Chr(0x00) ; Host Name         www.mamma.com

А т.к. у socks5 больше функционала и соответственно значит параметров, то запрос должен наверное содержать больше информации :scratch: :stars: В общем пытаюсь вникнуть в это, а не только готовое решение получить) Хотя пока что и с готовым решением по tcp больше вопросов, чем ответов)) Т.к. когда оно уже работает как-то, то проще ковыряться, понимаешь, что изменил и почему перестало работать или наоборот лучше стало работать. А в том примере орет на куки и дата переменные, т.е. пока не понятно, что туда нужно вообще предоставить этой функции) Извиняюсь, что возможно много в чем-то туплю и вероятно уже поднадоел со своими вопросами, просто пытаюсь разобраться до конца и добиться своей цели - работа через tcp.


Добавлено:
Сообщение автоматически объединено:

Наконец у меня продвижение.. ;D
Более менее разобрался. Но теперь не получается получить ответ, ругается на неправильный запрос, нужна помощь)
Код:
TCPStartup()

    $hc = TCPConnect("127.0.0.1", 9150) ; Socks4a Proxy Server

    $sReq = Chr(0x04) _                                     ; Protocol version  4
             & Chr(0x01) _                                     ; Command Code      1 - establish a tcp/ip stream connection
             & Chr(0x00) & Chr(0x50) _                        ; Port              80
             & Chr(0x00) & Chr(0x00) & Chr(0x00) & Chr(0xff) _ ; Ip Adress         Invalid - 0.0.0.255
             & "" & Chr(0x00) _                           ; User Id           Empty
             & "hss3uro2hsxfogfq.onion" & Chr(0x00) ; Host Name

; Send Request to Proxy
TCPSend($hc,$sReq)

; Wait for the Reply
While 1
    $sBuff = TCPRecv($hc,1)
    If @error Then Exit @ScriptLineNumber
    If StringLen($sBuff) > 0 Then ExitLoop
    Sleep(100)
WEnd

$sBuff &= TCPRecv($hc,8)

; Check for errors
Switch StringMid(Hex(BinaryToString($sBuff)),3,2)
    Case "5A"
        ConsoleWrite("> request granted" & @CR)
    Case "5B"
        ConsoleWrite("> request rejected or failed" & @CR)
        Exit @ScriptLineNumber
    Case "5C"
        ConsoleWrite("> request failed because client is not running identd (or not reachable from the server)" & @CR)
        Exit @ScriptLineNumber
    Case "5D"
        ConsoleWrite("> request failed because client's identd could not confirm the user id string in the request" & @CR)
        Exit @ScriptLineNumber
EndSwitch

; Send Http Request
$sReq  = "GET /index.html HTTP/1.1" & @CRLF
$sReq &= "Host: hss3uro2hsxfogfq.onion" & @CRLF & @CRLF
ConsoleWrite("! Request:" & @CR & $sReq & "---------------------------------" & @CR)
TCPSend($hc,$sReq)

; Wait for the Reply
ConsoleWrite("Receiving Data ")
$sRepy = ""
While 1
    $sBuff = TCPRecv($hc,1024*5)
    If @error Then
		ConsoleWrite("ERROR ")
		ExitLoop
	Endif
    If StringLen($sBuff) > 0 Then
        $sRepy &= $sBuff
        ConsoleWrite(".")
		ExitLoop
    EndIf
    Sleep(100)
WEnd

; Save Result to disk
$hFile = FileOpen("socks.html",2)
FileWrite($hFile,$sRepy)
FileClose($hFile)

ConsoleWrite("Reply Body stored in .\socks.html (" & Round(StringLen($sRepy)/1024,2) & "Kb)" & @CR)

Уже по разному пробовал и все равно 404 ошибка приходит:
HTTP/1.1 404 Not Found Server: nginx/1.4.6 (Ubuntu) Date: Sun, 16 Dec 2018 10:05:21 GMT Content-Type: text/html Content-Length: 177 Connection: keep-alive
404 Not Found
nginx/1.4.6 (Ubuntu)
 
Верх