[..] Server Proxy
Posté : sam. 13 févr. 2010 22:30
par Yoyo86220
Bonsoir à tous,
voilà je viens demander de l'aide car je voudrai faire un serveur proxy,
voici déjà se que j'ai trouver sur le forum anglais:
mais je souhaiterai qu'il fonctionne pour le HTTPS (ou SSL)
car le script n'est pas fini... merci d'avance de me donner un coup de main.
voilà je viens demander de l'aide car je voudrai faire un serveur proxy,
voici déjà se que j'ai trouver sur le forum anglais:
► Afficher le texte
Code : Tout sélectionner
TCPStartup()
#include <GUIConstantsEx.au3>
#include <EditConstants.au3>
#include <GUIEdit.au3>
#Include <Array.au3>
#Include <File.au3>
#include <WindowsConstants.au3>
Opt("GUIOnEventMode" , 1)
Opt("TrayAutoPause",0)
Opt("TrayMenuMode",3)
Opt("TrayOnEventMode",1)
Global $ini = @ScriptDir & "\config.ini"
Global $mainarray[51][10]
Global $proxysocket , $proxysocketssl
Global $GUISHOW = 1
$mainarray[0][0] = "Hostport"
$mainarray[0][1] = "Clientsocket"
$mainarray[0][2] = "Hostsocket"
$mainarray[0][3] = "Request"
$mainarray[0][4] = "Hostname"
$mainarray[0][5] = "Timerhandle Hostconnection"
$mainarray[0][6] = "Blocked"
$mainarray[0][7] = "State"
$mainarray[0][8] = "connection type"
Global $gui = GUICreate("ProxyServer v0.2",700,700)
$DEBUG=GUICtrlCreateEdit("" , 5 , 30 , 500 ,670,BitOr($GUI_SS_DEFAULT_EDIT,$ES_READONLY))
GUICtrlSetLimit(-1 , 2000000000000000)
Global $button_debug_clear = GUICtrlCreateButton("Clear",5,5,90,20)
GUICtrlSetOnEvent($button_debug_clear,"_debug_clear")
GUICtrlCreateLabel("Listening IP:",515,40,70,20)
GUICtrlCreateLabel("Port HTTP:",515,60,70,20)
GUICtrlCreateLabel("Port HTTPS:",515,80,70,20)
Global $input_proxyip = GUICtrlCreateInput("",590, 40,100,20)
Global $input_proxyport = GUICtrlCreateInput("",590,60,60,20)
Global $input_proxyportssl = GUICtrlCreateInput("",590,80,60,20)
Global $button_proxy_save = GUICtrlCreateButton("Save and Restart",515,140,180,20)
GUICtrlSetOnEvent($button_proxy_save,"_mainsocket_save")
Global $checkbox_debug = GUICtrlCreateCheckbox("Debugmode", 515 , 240, 120, 20)
Global $checkbox_debug_save = GUICtrlCreateCheckbox("Save Debug to file", 515 , 260, 120, 20)
Global $checkbox_debug_content = GUICtrlCreateCheckbox("Show traffic content", 515 , 280, 120, 20)
Global $button_debug_content = GUICtrlCreateButton("Binary to String",515,320,120,19)
GUICtrlSetOnEvent($button_debug_content,"_debug_binary")
Global $button_debug_array = GUICtrlCreateButton("show mainarray",515,340,120,19)
GUICtrlSetOnEvent(-1,"_show_array")
Global $tray_showgui = TrayCreateItem("Show gui")
TrayItemSetOnEvent($tray_showgui,"_gui_show")
GUISetOnEvent($GUI_EVENT_CLOSE,"_quit")
GUISetState(@SW_SHOW,$gui)
_mainsocket_create()
While 1
$newclientsock = TCPAccept($proxysocket)
If $newclientsock <> -1 Then
_save("] new HTTP clientconnection :" &_SocketToIP($newclientsock) &@CRLF)
_clientconnection_to_mainarray($newclientsock,80,"HTTP")
EndIf
$newclientsockssl = TCPAccept($proxysocketssl)
If $newclientsockssl <> -1 Then
_save("] new HTTPS clientconnection :" &_SocketToIP($newclientsockssl) &@CRLF)
_clientconnection_to_mainarray($newclientsockssl,443,"HTTPS")
EndIf
;--Recieving Req from Client
For $i = 1 To UBound($mainarray) -1
If $mainarray[$i][1] <> "" Then
$request = TCPRecv($mainarray[$i][1],4096)
If @error Then
_mainarray_deleteclient($i)
_save("] Client " & $i & " closed connection" & @CRLF)
EndIf
If $request <> "" Then
_save("] Client " & $i & " requested" & @CRLF & $request)
$mainarray[$i][3] = $request
If GUICtrlRead($checkbox_debug_content) = 1 Then _save($request & @CRLF)
EndIf
EndIf
Next
;--connecting and sending Req to Host
For $i = 1 To UBound($mainarray) -1
If $mainarray[$i][3] <> "" Then
If $mainarray[$i][2] = "" Then
$forward = _Get_Address($mainarray[$i][3])
_save("]" & $i &" Got Host Address : " & $forward & @CRLF)
$mainarray[$i][6] = 0
$mainarray[$i][4] = $forward
If $forward = "0" Then
_Send_Response($mainarray[$i][1],400)
_save("]" & $i &" Host is 0 , Error 400" & @CRLF)
Else
$serverip = TCPNameToIP($forward)
$serversock = TCPConnect($serverip,$mainarray[$i][0])
If $serversock <> -1 Then
_save("]" & $i &" Connected to Server: " & $forward & @CRLF)
$mainarray[$i][2] = $serversock
$mainarray[$i][5] = TimerInit()
Else
_save("]" & $i &" Not Connected to Server: " & $forward & @CRLF)
_Send_Response($mainarray[$i][1],400)
_mainarray_deleteclient($i)
EndIf
EndIf
Else
$forward = _Get_Address($mainarray[$i][3])
If $forward <> $mainarray[$i][4] Then
_save("]" & $i &" Host Address changed from: " & $mainarray[$i][4] & " to: " & $forward & @CRLF)
$mainarray[$i][4] = $forward
TCPCloseSocket($mainarray[$i][2])
$mainarray[$i][2] = ""
EndIf
EndIf
If $mainarray[$i][2] <> "" Then
$mainarray[$i][3] = _request_modify($mainarray[$i][3],$mainarray[$i][4])
TCPSend($mainarray[$i][2] , $mainarray[$i][3])
If Not @error Then
$mainarray[$i][3] = ""
_save("]" & $i &" Sending to Host " & $mainarray[$i][4] & " successfull " & @CRLF)
Else
_save("]" & $i &" Error Sending to Host " & @CRLF)
EndIf
EndIf
EndIf
Next
;--Waiting for Response from Host and Sending to client
For $i = 1 To UBound($mainarray) -1
If $mainarray[$i][2] <> "" Then
$serverresponse = TCPRecv($mainarray[$i][2],400000,1)
If @error Then
_mainarray_hostkillclient($i)
EndIf
If $serverresponse <> Binary("") Then
If $mainarray[$i][6] = 0 Then
_save("]" & $i &" Got Host response" & @CRLF)
If $mainarray[$i][1] <> "" And $mainarray[$i][7] = "" Then
TCPSend($mainarray[$i][1],$serverresponse)
If Not @error Then
_save("]" & $i &" Send data to Browser last 4 :" & StringRight($serverresponse,4) & @CRLF)
If GUICtrlRead($checkbox_debug_content) = 1 Then _save(BinaryToString($serverresponse) & @CRLF)
EndIf
EndIf
ElseIf $mainarray[$i][6] = 1 Then
TCPSend($mainarray[$i][1],"HTTP/1.1 " & "403")
_mainarray_hostkillclient($i)
EndIf
EndIf
EndIf
Next
WEnd
Func _show_array()
_ArrayDisplay($mainarray)
EndFunc
Func _mainsocket_save()
IniWrite($ini,"SYSTEM","PROXYPORT",GUICtrlRead($input_proxyport))
IniWrite($ini,"SYSTEM","PROXYIP",GUICtrlRead($input_proxyip))
IniWrite($ini,"SYSTEM","PROXYPORTSSL",GUICtrlRead($input_proxyportssl))
_mainsocket_create()
EndFunc
Func _mainsocket_create()
TCPShutdown()
TCPStartup()
$IP = IniRead($ini,"SYSTEM","PROXYIP","127.0.0.1")
$PORT = IniRead($ini,"SYSTEM","PROXYPORT","8080")
$PORTSSL = IniRead($ini,"SYSTEM","PROXYPORTSSL","8043")
GUICtrlSetData($input_proxyip, $IP)
GUICtrlSetData($input_proxyport,$PORT)
GUICtrlSetData($input_proxyportssl,$PORTSSL)
$proxysocket = TCPListen($IP,$PORT)
If @error Then
_GUICtrlEdit_AppendText($DEBUG , "] Error HTTP Proxy couldn't bind socket on IP :" & $IP & " Port :" & $PORT & @CRLF)
Else
_GUICtrlEdit_AppendText($DEBUG , "] HTTP Proxy listening on IP :" & $IP & " Port :" & $PORT & @CRLF)
EndIf
$proxysocketssl = TCPListen($IP,$PORTSSL)
If @error Then
_GUICtrlEdit_AppendText($DEBUG , "] Error HTTPS Proxy couldn't bind socket on IP :" & $IP & " Port :" & $PORTSSL & @CRLF)
Else
_GUICtrlEdit_AppendText($DEBUG , "] HTTPS Proxy listening on IP :" & $IP & " Port :" & $PORTSSL & @CRLF)
EndIf
EndFunc
Func _Get_Address($text)
$serversock=StringSplit($text , @CRLF,1)
For $i=1 To $serversock[0]
If StringLeft($serversock[$i],6)="Host: " Then
Return StringTrimLeft($serversock[$i],6)
EndIf
Next
Return 0
EndFunc
Func _clientconnection_to_mainarray($sock,$port = 80,$type = "HTTP")
For $i = 1 To UBound($mainarray) -1
If $mainarray[$i][1] = "" And $mainarray[$i][2] = "" Then
$mainarray[$i][1] = $sock
$mainarray[$i][0] = $port
$mainarray[$i][8] = $type
_save("] Added new client to mainarray , pos: " & $i & @CRLF)
Return
EndIf
Next
EndFunc
Func _mainarray_deleteclient($line)
TCPCloseSocket($mainarray[$line][1])
$mainarray[$line][0] = ""
$mainarray[$line][1] = ""
$mainarray[$line][3] = ""
$mainarray[$line][4] = ""
$mainarray[$line][5] = ""
$mainarray[$line][6] = ""
$mainarray[$line][7] = ""
$mainarray[$line][8] = ""
If $mainarray[$line][2]<> "" Then
TCPCloseSocket($mainarray[$line][2])
$mainarray[$line][2] = ""
EndIf
EndFunc
Func _mainarray_hostkillclient($line)
_save("]" & $line &" Connection Closed by Host" & @CRLF)
$mainarray[$line][2] = ""
$mainarray[$line][4] = ""
$mainarray[$line][5] = ""
If $mainarray[$line][1]<> "" Then
TCPCloseSocket($mainarray[$line][1])
_mainarray_deleteclient($line)
EndIf
EndFunc
Func _Send_Response($browsersock,$code,$data="")
If $data="" Then
$data=@CRLF & @CRLF
Else
$data=@CRLF & $data & @CRLF & @CRLF
EndIf
TCPSend($browsersock , "HTTP/1.0 " & $code & " Message" & $data)
EndFunc
Func _quit()
TCPShutdown()
Exit
EndFunc
Func _gui_show()
If $GUISHOW = 0 Then
Local $pw = InputBox("Enter Password","Enter Password","","*",150,130)
If Not @error Then
If $pw = "1234" Then
GUISetState(@SW_SHOW)
$GUISHOW = 1
Return
EndIf
EndIf
ElseIf $GUISHOW = 1 Then
GUISetState(@SW_HIDE)
$GUISHOW = 0
Return
EndIf
EndFunc
Func _save($text)
If GUICtrlRead($checkbox_debug_save) = 1 Then
$file = FileOpen(@ScriptDir & "\log\" & @Year & @MON & @MDAY & "-log.txt",9)
FileWrite ($file,$text)
FileClose($file)
Endif
If GUICtrlRead($checkbox_debug) = 1 Then _GUICtrlEdit_AppendText($DEBUG , $text)
Endfunc
Func _SocketToIP($SHOCKET)
Local $sockaddr, $aRet
$sockaddr = DllStructCreate("short;ushort;uint;char[8]")
$aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
"ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
If Not @error And $aRet[0] = 0 Then
$aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
If Not @error Then $aRet = $aRet[0]
Else
$aRet = 0
EndIf
$sockaddr = 0
Return $aRet
EndFunc ;==>SocketToIP
Func _debug_binary()
Local $aSel = _GUICtrlEdit_GetSel($DEBUG)
Local $text = StringMid(GUICtrlRead($DEBUG),$aSel[0]+1,$aSel[1]-$aSel[0])
If $text <> "" Then
Else
$text = InputBox("Binary to String","Enter Binary Data")
EndIf
If StringLower(StringLeft($text,2)) <> "0x" Then $text = "0x" & $text
$tempfile = FileOpen(@ScriptDir & "\temp.txt",2)
FileWrite($tempfile,BinaryToString($text))
FileClose($tempfile)
ShellExecute(@ScriptDir & "\temp.txt")
EndFunc
Func _debug_clear()
GUICtrlSetData($DEBUG,"")
EndFunc
Func _request_modify($req,$host)
Local $encoding = "Accept-Encoding: identity" ;deflate, gzip, compress,
Local $reqsplit
Local $encoding_done = 0
If $req <> "" Then
;$req = StringReplace($req,@CRLF & @CRLF , @CRLF)
$reqsplit = StringSplit($req,@CRLF,1)
If IsArray($reqsplit) Then
For $i = 1 to $reqsplit[0]
If StringLeft($reqsplit[$i],3) = "GET" Then
$wwwcount = StringInStr($reqsplit[$i],"www.",0,2)
If $wwwcount = 0 Then
$reqsplit[$i] = StringReplace($reqsplit[$i],$host,"")
$reqsplit[$i] = StringReplace($reqsplit[$i],"http://","")
EndIf
EndIf
If StringInStr(Stringlower($reqsplit[$i]),"proxy-connection: keep-alive") Then $reqsplit[$i] = "Connection: keep-alive"
If StringInStr(Stringlower($reqsplit[$i]),"accept-encoding") Then
$reqsplit[$i] = $encoding
$encoding_done = 1
EndIf
$reqsplit[$i] = StringReplace($reqsplit[$i],@CRLF,"")
Next
;If $encoding_done = 0 Then _ArrayInsert($reqsplit,$reqsplit[0], $encoding)
$req = _ArrayToString($reqsplit, @CRLF , 1 , Ubound($reqsplit)-1)
EndIf
EndIf
$req = StringReplace($req,":443","")
If GUICtrlRead($checkbox_debug_content) = 1 Then
_save("] Request modified to:" & @CRLF)
_save($req &@CRLF)
EndIf
Return $req
EndFunccar le script n'est pas fini... merci d'avance de me donner un coup de main.