Packet an IE weiterreichen

  • Hallo^^

    hab malwieder ein Problem mit einer TCP Funktion.
    Soweit wie unten steht hab ichs allein hinbekommen bzw mit der Hilfe funktion.
    Wenn ihr das script austestet und im IE als proxy 127.0.0.1 port 8080 eintragt werdet ihr sehen,
    dass wenn ihr google anfragt eine Meldung mit dem Paket an google erscheint. Das script dreht nun Proxy-Connection : Keep-Alive in
    Connection: Close um und findet die IP von google als Zieladresse raus. Es verbindet sich mit google reicht die Anfrage weiter und bekommt die Antwort.
    (Bei mir GZip komprimiert). Ich scheitere nun aber daran diese antwort wieder an den IE weiter zu reichen.

    Ist bestimmt nichtmehr viel aufwand aber ich verstehs einfach nicht und mit der Hilfe komm ich auch nicht klar.
    Vielen Dank

    Spoiler anzeigen
    [autoit]

    $serverip = "127.0.0.1"
    $serverport = "8080"
    TCPStartup()
    $mslisten = TCPListen($serverip,$serverport,3)

    [/autoit] [autoit][/autoit] [autoit]

    Do
    $cosl = TCPAccept($mslisten)
    Until $cosl>=0

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $recv = TCPRecv($cosl, 2048)
    If @error Then ExitLoop
    $recv = BinaryToString($recv, 4)
    If $recv <> "" Then
    MsgBox(0,"",$recv)
    $packet = StringSplit($recv,@CRLF,1)
    $dnt = 0;Do Not Track
    $PKA = 0;Proxy Keep Alive
    $recvip = "";IP of where the Request have to go to

    [/autoit] [autoit][/autoit] [autoit]

    For $i=1 To $packet[0]
    Select
    Case StringInStr($packet[$i],"DNT") Or StringInStr($packet[$i],"X-Do-Not-Track")
    $dnt = 1
    Case StringInStr($packet[$i],"Proxy-Connection: Keep-Alive")
    $packet[$i] = "Connection: Close"
    $PKA = 1
    Case StringInStr($packet[$i],"Host: ")
    $recvip = StringSplit($packet[$i],"Host: ",1)
    $recvip = TCPNameToIP($recvip[2])
    EndSelect
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $newpacket = ""
    For $i=1 To $packet[0]
    If $packet[$i]<>"" And $i>=2 Then
    $newpacket = $newpacket&@CRLF&$packet[$i]
    ElseIf $packet[$i]<>"" And $i=1 Then
    $newpacket = $packet[$i]
    EndIf
    Next
    $newpacket = $newpacket&@CRLF&@CRLF
    FileWrite("newpacket.txt",$newpacket)

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0,"",""""&$recvip&"""")
    $socket = TCPConnect($recvip,"80")
    MsgBox(0,"",$newpacket)
    TCPSend($socket,$newpacket)
    $gzippacketfromgoogle = ""
    While 1
    $recv = TCPRecv($socket, 2048)
    If @error Then ExitLoop
    $recv = BinaryToString($recv, 4)
    If $recv <> "" Then
    $gzippacketfromgoogle = $gzippacketfromgoogle & $recv
    MsgBox(0,"",$recv)
    EndIf
    WEnd
    TCPSend($cosl,$gzippacketfromgoogle)
    ConsoleWrite("data send to IE.");FALSCH wurde wieder zu 127.0.0.1 geschickt. Muss erst CLientname zu IP auflösen??
    MsgBox(0,"",$gzippacketfromgoogle)
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit]


    €geändert um folgefehler zu vermeiden

    -

    2 Mal editiert, zuletzt von Nachid (9. April 2013 um 12:10)

  • Du versuchst TCPSend eine IP Adresse zu übergeben. Das kann nicht funktionieren. Setze dort einfach direkt $cosl ein anstelle von $stIP.

    Gruss Shadowigor

  • €3
    Der ganze Code scheint zu lang für den Spoiler ich grenz das mal ein.
    Bekommt der IE überhaupt mit das ich Fertig bin ihm die Daten zu schicken ?
    Ich kann die Verbindung ja nicht Trennen da Proxy-Connection : Keep-Alive gesetzt ist

    Spoiler anzeigen
    [autoit]

    HTTP/1.1 200 OK
    Date: Tue, 09 Apr 2013 10:03:46 GMT
    Expires: -1
    Cache-Control: private, max-age=0
    Content-Type: text/html; charset=UTF-8
    Server: gws
    X-XSS-Protection: 1; mode=block
    X-Frame-Options: SAMEORIGIN
    Connection: close

    [/autoit] [autoit][/autoit] [autoit]

    <!doctype html><html itemscope="itemscope" itemtype="http://schema.org/WebPage"><head><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta content="text/html; charset=UTF-8" http-equiv="content-type"><meta itemprop="image" content="/images/google_favicon_128.png"><title>Google</title><script>(function(){
    window.google={kEI:"gudjUYWHBoXJswaLwYHwAg",getEI:functi......</html>

    [/autoit]


    €4

    Hier ein weitere einfacheres Script.
    Da ich immernoch nicht weis wie ich dem IE Signalisiere das alle Packete da sind habe ich eine andere Methode verwendet.
    Auserdem habe ich das Connection : Close aus der Antwort entfernt da der User ja eine aktive Proxy Connection will.

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.8.1
    Author: myName

    [/autoit] [autoit][/autoit] [autoit]

    Script Function:
    Template AutoIt script.

    [/autoit] [autoit][/autoit] [autoit]

    #ce ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    ; Script Start - Add your code below here
    #include "Inet.au3"
    TCPStartup()

    [/autoit] [autoit][/autoit] [autoit]

    $mslisten = TCPListen(@IPAddress1,"8080",1)
    Do
    $ConnectionSocket = TCPAccept($mslisten)
    Until $ConnectionSocket<>-1
    ConsoleWrite(SocketToIP($ConnectionSocket)&" connected."&@CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    $request = ""
    While 1
    $recv = TCPRecv($ConnectionSocket, 2048)
    If @error Then ExitLoop
    $recv = BinaryToString($recv, 4)
    If $recv <> "" Then
    ConsoleWrite($recv&@CRLF)
    $packet = $recv
    $googleip = TCPNameToIP("google.de")
    $socket = TCPConnect($googleip,"80")
    TCPSend($socket,StringReplace(StringReplace($packet,"Accept-Encoding: gzip, deflate","Accept-Encoding: none"),"Proxy-Connection: Keep-Alive","Connection: Close"))
    $data = ""
    While 1
    $recv2 = TCPRecv($socket, 2048)
    If @error Then ExitLoop
    $recv2 = BinaryToString($recv2, 4)
    If $recv2 <> "" Then
    $data = $data & $recv2
    EndIf
    WEnd
    $data = StringSplit($data,@CRLF&@CRLF,1)
    If StringInStr($data[1],"Connection : Close") Then
    StringReplace($data[1],"Connection : Close","Transfer-Encoding: chunked")
    EndIf
    TCPSend($ConnectionSocket,$data[1]&@CRLF&@CRLF)
    TCPSend($ConnectionSocket,$data[2])
    TCPSend($ConnectionSocket,"")
    EndIf
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    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

    [/autoit]

    -

    2 Mal editiert, zuletzt von Nachid (9. April 2013 um 14:34)

  • So viel ich weis musst du dem IE doch gar nicht sagen, dass alle Pakete da sind. Das sollte HTTP schon von alleine regeln. Was genau funktioniert denn noch nicht oder was sagt dir der IE?

  • Der IE bleibt im Ladescreen hängen. Also ich bekomm weder ne Fehlermeldung noch irgendwas. Nur den kringel.
    Wenn ich die Verbindung beende kommt ein error das die Proxy Connection fehl schlägt obwohl alle Daten übermittelt wurden.

    -

  • Hast du schon mal versucht dich mit einem anderen Programm darauf zu verbinden und dann zu schauen ob wirklich alles so ankommt wie es soll? Denn ich hab noch mal nachgeschaut und es sollte eigentlich alles durch HTTP geregelt werden. Poste doch mal was der Proxy wirklich an den "IE" sendet. Vielleicht ist auch die Antwort an sich nicht komplett.

  • Hmm. Sieht eigentlich recht normal aus. Ich kann dir jetzt so direkt auch nicht sagen was da falsch läuft. Hast dus mal mit einem anderen Browser probiert?