Port 80 Proxy auf localhost und stream in echtzeit auf anderen pc übertragen

  • Guten Abend,


    ich möchte ein Tool schreiben das meinen gesamten Traffic von Programm X (Proxy einstellbar ist vorraussetzung, ist klar)

    über ein localhost autoit script von Rechner A auf Rechner B schickt. Rechner B soll dann die Daten weiterleiten.


    Das ganze hatte ich mir so vorgestellt das ich zB https://autoit.de/www.google.de aufrufe

    und meinen Proxy bei Opera eintrage.


    Nun soll mein Computer (A) das Packet auf Computer (B) senden. Computer B soll nun google nach der website fragen

    und die antwort an Computer A weiterleiten.


    Ist dies möglich oder zu schwierig zu realisieren ?

    Wenn möglich mit einfachen mitteln^^ TCP/IP funktionen behersche ich nur fehlt mir ein kleiner


    Anfangstipp oder Anstoß wie ich von Anfang an da rangehen soll.


    btw : entschuldigt die Rechtschreibung.....


    Danke

    Nachid

    -

    Einmal editiert, zuletzt von Nachid (4. September 2012 um 20:59)

  • Das ist möglich und eigentlich sogar sehr einfach...

    ...sofern du dir das Protokoll aussuchen kannst. Da du das aber für Webseiten benutzen willst, musst du einen HTTP- oder vielleicht sogar einen SOCKS4/5-Proxyserver programmieren, wobei ersteres auch nicht schwer ist.
    Ein normaler HTTP-Request sieht zum Beispiel so aus:

    Code
    GET /index.php
    Host: www.example.com
    ...


    Mit Proxy sieht das dann so aus:

    Code
    GET http://www.example.com/index.php
    Host: www.example.com
    ...


    Du musst also in der eigentlichen Anfrage nur wenig ändern und kannst diese dann direkt an den Empfänger (im Beispiel https://autoit.de/www.example.com) weiterleiten.

    MfG, James

    PS: Berichtigt mich bitte, falls ich hier gerade totalen Mist geschrieben habe.^^

  • Ich GLAUBE dazu braucht man kein Script od ähnl. du musst Rechner B als Proxyserver einrichten mit dem sich dann Rechner A verbindet dann läuft der gesammte Traffic über B.

  • ZUM "Server" Rechner B
    Auf B bist du Gott demnach kannst du auch den Traffic abfangen manipulieren weiterschicken dazu gibt es fertige Programme, mit denen du sogar den Proxy einrichten kannst.
    Google anschmeissen.


    Zum "Client" RECHNER A

    Im Browser Proxy einstellen - FERTIG


    Natürlich übers internet was dachtest du denn per Post ?? :rolleyes:

  • >.> bitte die klugen sprüche lassen.
    ich versuch mich mal allein.
    Da hier keine gescheite Hilfe zum erfragten gegen wurde kann der Thread gelöscht werden.
    Bringt niemand was^^


    Mfg

    -

  • Kizum Ich halte Nachid für intelligent genug um Google nach Proxy-Server-Software (gibt es dieses Wort überhaupt?) zu befragen. Außerdem wäre dafür noch lange kein AutoIt nötig.

    Nachid Ich gehe jetzt einfach mal davon aus, dass du Post #2 in diesem Thema übersehen hast...

  • [autoit]

    TCPStartup()
    $listen = TCPListen("192.168.2.100",80,100)
    $socket = TCPAccept($listen)
    $ipofgoogle = TCPNameToIP("www.google.de")
    $socketconn = TCPConnect($ipofgoogle,80)
    TCPSend($socketconn,"GET /index.html HTTP/1.1" & @CRLF & "Host: http://www.google.de")
    While 1
    $rcv = TCPRecv($socket,2048)
    If $rcv <> "" Then MsgBox(0,"",$rcv)
    WEnd

    [/autoit]


    nein und danke dir^^ ich arbeite bereits daran auch wenn ich glaub das die anfrage nicht ganz ausreicht denn ich bekomme rein response^^

    -

  • Ich hab mal einen kleinen Ansatz zusammengezimmert. Der ist aber natürlich noch längst nicht fertig oder gegen alle Fehler gewappnet, aber immerhin habe ich diesen Post darüber erstellt :P.
    (Falls hier nur Müll drinsteht wundert euch also nicht, die Verbindung ist Schuld :whistling: ...)

    Spoiler anzeigen
    [autoit]

    TCPStartup()

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

    Global Const $sIP_Local = "127.0.0.1", $iPort_Local = 1337
    Global $iSocket_Main, $iSocket_Client, $iSocket_Host

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

    $iSocket_Main = TCPListen($sIP_Local, $iPort_Local)
    If @error Then Exit MsgBox(16, "Error=" & @error, "Unable to create listening socket.")

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

    OnAutoItExitRegister("_Shutdown")

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

    While True
    While Sleep(100)
    $iSocket_Client = TCPAccept($iSocket_Main)
    If $iSocket_Client > -1 Then ExitLoop
    WEnd
    While Sleep(50)
    $sRecv = TCPRecv($iSocket_Client, 8192)
    If @error Then ExitLoop
    If $sRecv <> "" Then
    $aHost = StringRegExp($sRecv, "(?m)^Host: ([^\:]+?):?(\d+)?\s*$", 1)
    If UBound($aHost) = 1 Then
    $iSocket_Host = _ConnectToHost($aHost[0], 80)
    Else
    $iSocket_Host = _ConnectToHost($aHost[0], $aHost[1])
    EndIf
    TCPSend($iSocket_Host, $sRecv)

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

    While Sleep(50)
    $bRecv_Temp = TCPRecv($iSocket_Host, 8192, 1)
    If @error Then ExitLoop
    If $bRecv_Temp <> "" Then
    TCPSend($iSocket_Client, $bRecv_Temp)
    If @error Then ExitLoop
    EndIf
    WEnd
    TCPCloseSocket($iSocket_Host)
    TCPCloseSocket($iSocket_Client)
    ExitLoop
    EndIf
    WEnd
    WEnd

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

    Func _ConnectToHost($sHostname, $iPort)
    Local $iSocket_Return, $sIP_Host
    $sIP_Host = TCPNameToIP($sHostname)
    $iSocket_Return = TCPConnect($sIP_Host, $iPort)
    Return $iSocket_Return
    EndFunc

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

    Func _Shutdown()
    TCPCloseSocket($iSocket_Client)
    TCPCloseSocket($iSocket_Main)
    TCPShutdown()
    EndFunc ;==>_Shutdown

    [/autoit]


    Zu viele Requests scheint dieses Script auch nicht zu mögen. Der Firefox ist da wohl ein wenig zu schnell...

  • Vielen dank für deine Mühen =)

    ich hänge im momment daran das ich eine valide (?)
    Anfrage sende jedoch kein response erhalte

    [autoit]

    Sleep(15000)
    TCPStartup()
    $listen = TCPListen("192.168.2.100",80,100)
    $socket = TCPAccept($listen)
    $ipofgoogle = TCPNameToIP("www.google.de")
    $socketconn = TCPConnect($ipofgoogle,80)
    TCPSend($socketconn,"GET /index.html HTTP/1.1" & _
    @CRLF & "Host: http://www.google.de" & _
    @CRLF & "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.6) Gecko/20061201 Firefox/2.0.0.6 (Ubuntu-feisty)" & _
    @CRLF & "Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5" & _
    @CRLF & "Accept-Language: en-us,en;q=0.5" & _
    @CRLF & "Accept-Encoding: gzip,deflate" & _
    @CRLF & "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7" & _
    @CRLF & "Keep-Alive: 300" & _
    @CRLF & "Connection: keep-alive")
    While 1
    $rcv = TCPRecv($socket,2048)
    If $rcv <> "" Then MsgBox(0,"",$rcv)
    WEnd

    [/autoit]

    könnt ihr mir sagen warum ?

    -

  • Pack mal TCPAccept in eine Endlosschleife, die Funktion gibt lediglich -1 zurück wenn im Moment niemand versucht sich zu verbinden...
    Eigentlich kannst du gleich mal 90 % meines Scripts übernehmen. Das wirst du nämlich für dein Vorhaben mindestens brauchen.

  • Oh, hab jetzt erst gelesen dass er keine Antwort empfängt. Das HTTP Request ist nicht valide... HTTP Requests enden immer mit einer Leerzeile (2 Zeilenumbrüchen), ansonsten weiß der Server nicht wann das Request aufhört und wartet für eine unbestimmte Zeit auf weitere Headereinträge.
    Dann noch das was James angesprochen hat: Du sendest die Daten an den Socket der mit Google verbunden ist aber versuchst Daten von dem Socket zu empfangen der sich eigentlich mit deinem Clienten verbinden sollte (was er aus oben genannten Gründen sowieso nicht tut). Das sind 2 verschiedene Sockets und du verwendest den falschen, bzw. erwartest das Falsche ^^.
    Schau dir doch mal ein paar Erklärungen und Standards des HTTP Protokolls an, ansonsten kommst du hier nicht weit. Und mein Beispiel funktioniert wie gesagt, eigentlich müsstest du das nur noch ausbauen...

  • Soweit so gut.

    Spoiler anzeigen
    [autoit]

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

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

    AutoIt Version: 3.3.8.0
    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

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

    Dim $Config[5]
    $Config[0] = "192.168.2.100"; MeineIP
    $Config[1] = "50999"; ListenPort
    $Config[2] = "100"; Max Anstehende Con.
    TCPStartup()
    $Lsocked = TCPListen($Config[0],$Config[1],$Config[2])

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

    While 1
    ;Warte auf BenutzerConnect
    $connection = -1
    Do
    $connection = TCPAccept($Lsocked)
    Until $connection <> -1
    ConsoleWrite("User Conn !"&@CRLF)
    $timer=TimerInit()
    While 1
    $Request = TCPRecv($connection, 1024)
    If $Request <> '' Then
    While 1
    $Request &= TCPRecv($connection, 1024)
    If @error or TimerDiff($timer)>10000 Then ExitLoop 2
    WEnd
    EndIf
    WEnd
    ConsoleWrite("Request Accepted !"&@CRLF)
    $host = StringRegExp($Request,"(?<=Host: )(.*)",1);Filtere Host Zeile
    $host = StringStripCR($host[0]) ;Wandle Array zu Variable und entfernt Zeilenumbrüche
    $ipofhost = TCPNameToIP($host)
    $connectiontohost = TCPConnect($ipofhost,80)
    If @error Then ExitLoop 1
    TCPSend($connectiontohost,$Request)
    If @error Then ExitLoop 1
    ConsoleWrite("Connected to Host of Data !"&@CRLF)
    $timer=TimerInit()
    While 1
    $answer = TCPRecv($connectiontohost, 1024)
    If $answer <> '' Then
    While 1
    $answer &= TCPRecv($connectiontohost, 1024)
    If @error or TimerDiff($timer)>10000 Then ExitLoop 2
    WEnd
    EndIf
    WEnd
    ConsoleWrite("Got the answer !"&@CRLF)

    WEnd

    [/autoit]


    Bekommt das request und leitet es an google weiter.
    Wenn ich nun aber die antwort von google auf mein request an mein
    Client weiterleiten möchte (TCPSend( $connection
    ,$answer))
    sagt mir der IE nachdem der befehl ausgeführt wurde das die Seite nicht erreichbar sei ?

    Liegt das nun daran das er die Antwort von google's IP erwartet und von local host bekommt ?


    Mfg

    -

  • Zitat

    Liegt das nun daran das er die Antwort von google's IP erwartet und von local host bekommt ?


    Sollte es eigentlich nicht... Sonst würden Proxy Server nichtmit dem IE funktionieren.
    In meinem Beispiel leite ich auch direkt die Antwort vom Server zum Clienten (FF, IE, etc.) weiter.
    Es gibt aus meiner Sicht 2 Fehlerquellen: 1. Überprüfe mal ob alle Verbindungen zum Zeitpunkt des Versendens noch aktiv sind; 2. Lass dir mal die Requests und die Antwort des Servers ausgeben und schau nach ob sie auch vollständig sind.

  • Request und Antwort sind vollständig. Von google codiert mit bzip.
    Wie kann ich prüfen ob eine verbindung auf der ich "listen" noch aktiv ist ?
    bzw kann ich verbindungen auf denen ich "listen" auch senden ?

    -

  • Zitat

    Wie kann ich prüfen ob eine verbindung auf der ich "listen" noch aktiv ist ?


    TCPSend setzt @error wenn der Socket geschlossen wurde. Und gibt die gesendete Datenmenge zurück (glaube ich).

    Zitat

    bzw kann ich verbindungen auf denen ich "listen" auch senden ?


    Das hab ich jetzt nicht ganz verstanden... TCPListen erstellt einen Mainsocket der nur dazu dient eingehende Verbindungen anzunehmen, über den sendest du gar nichts (und empfängst natürlich auch nichts).

  • Listen nimmt meine verbindung auf.
    $connection = TCPAccept($Lsocked)
    ist dann hier mein handle auf den der IE connected ist.
    Wenn ich nun die antwort wie oben beschrieben
    mit TCPSend($connection,$answer) sende (also $answer ist die antwort von google)
    hört der IE sofort auf zu laden und spuckt die fehlermeldung das
    google.de nicht erreichbar wäre. (IE wartet genau bis dieser befehl kommt bevor er abschmiert)

    -