Что нового

Код Proxy сервера

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Как сделать свой прокси сервер, который должен работать только на прослушку трафика в обе стороны?

Я понимаю что это будет очень медлено, но все таки хочется попробывать.

Вот что набросал:
Код:
OnAutoItExitRegister("OnAutoItExit")
HotKeySet('{F11}', 'OnAutoItExit')
TCPStartup()
$stop = 0
Local $iListenSocket = TCPListen('127.0.0.1', 56888)
If @error Then Exit MsgBox(0,'Ошибка '& @error,'Нельзя слушать этот парт и адрес')
Local $sReceived
Do
	Do
		$iSocket = TCPAccept($iListenSocket)
		If @error Then Exit 99
		Sleep(10)
	Until $iSocket <> -1
	ConsoleWrite('> Кто то подключился' & @LF)
	$sReceived = ''
	Do
		$sReceived = TCPRecv($iSocket, 2048 * 60) ;получаем часть сообщения сервера
		If $sReceived Then ExitLoop
		Sleep(10)
	Until 0
	$sReceived &= TCPRecv($iSocket, 2048 * 60)

	$aHost = StringRegExp($sReceived, 'Host: (.+?)\s+', 1)
	$sReceived = StringRegExpReplace($sReceived, '(?m)Accept-Encoding: .+\r?\n', '') ;нам не нужен GZIP
	ConsoleWrite($sReceived & @LF) ;Запрос
	If IsArray($aHost) Then
		$iSocket2 = TCPConnect(TCPNameToIP($aHost[0]), 80) ;Порты могут быть другие
		TCPSend($iSocket2, $sReceived)
		$sData = ''
		$iTimer = TimerInit() ;запускаем таймер
		Do
			$sBuffer = TCPRecv($iSocket2, 2048 * 6) ;получаем часть сообщения сервера
			$iError = @error
			If Not $sBuffer = '' Then ;если удалось получить сообщение
				$sData &= $sBuffer ;сохраняем полученное сообщение
				$iTimer = TimerInit() ;обнуляем таймер
			EndIf
		Until $iError <> 0 Or TimerDiff($iTimer) > 1000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла
;~ 		ConsoleWrite($sData & @LF) ;Ответ
	Else
		$sData = 'Запрос не выполнялся'
	EndIf
	TCPSend($iSocket, $sData)
	TCPCloseSocket($iSocket)
Until $stop

Func OnAutoItExit()
	$stop = True
	TCPCloseSocket($iListenSocket)
	TCPShutdown()
EndFunc   ;==>OnAutoItExit

Но как то криво :smile: Не понятно как определять что все данные получены.
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
как сделать именно прокси я хз(
но знаю как сделать програмку для преадресации данных что позволяет просматривать эти данные.

нужно при присоединение к прокрамме открыть новое соединение к серверу к каторому будет идти переадресация,
а дальше в цикле получать данные от клиента и отсылать и их серверу, а от сервера клиенту)
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
inververs [?]
Не понятно как определять что все данные получены.
Наверное это зависит от протокола который необходимо перехватывать.

Я понимаю что это будет очень медлено, но все таки хочется попробывать.
Костыль здесь "эмуляция" многопоточности через WSAAsyncSelect и приделывания обработки сообщения WM_ASYNC_CLIENTEVENT.

http://uinc.ru/articles/24/
https://mail.python.org/pipermail/python-win32/2011-May/011506.html
Гугл иногда помогает...
 

winstan

Эксплотатор)
Сообщения
406
Репутация
79
Z_Lenar [?]
Наверное это зависит от протокола который необходимо перехватывать.
если идти по моему предложению то не имеет значения где конец данных т.к. сам серв уже разбереться, а в выводе на глаз будет всё вполне ясно
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
winstan
Покажите ваш вариант :smile:


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

Z_Lenar
Такие варианты не прокатят на AutoIT/ Я делал реализацию асинхронной работы с сетью через wininet которая не работала. AutoIT в случайных местах завершался с критической ошибкой. И как я понял такие вещи как WaitForMultipleObjects или WaitForSingleObject вообще нет смысла использовать в AutoIT.


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

Z_Lenar [?]
Наверное это зависит от протокола который необходимо перехватывать.
HTTP HTTPS
 

Z_Lenar

Продвинутый
Сообщения
209
Репутация
52
inververs
Еще один вариант реализовать через создание нового процесса + DuplicateHandle.
Или в программе обрабатывать только одно соединение. При возвращении из TCPListen создавать копию ожидающего соединение процесса.
 
Верх