[Baustelle]HTTP Paket Bots

  • Wilkommen bei meinem zweiten AutoIt Tutorial!
    Worum geht es hier?


    • Grundwissen über Pakete
    • HTTP-Pakete und wie man sie sniffen kann
    • Erstellen einer HTTP TCP-Request Funktion
    • Coden eines Paket Bots an einem Beispiel
    • Eurem Bot den letzten Schliff geben


    1. Grundwissen über Pakete


    Für alle die es genau wissen wollen beginne ich mit der Definition für "Datenpakete".


    Quote

    Bei dem EDV Begriff Datenpaket handelt es sich um eine zusammengefasste Gruppe von Daten bzw. Informationseinheiten bei der Datenübertragung (Netzwerk), sowie Datenfernübertragung. Die Struktur, Aufbau und Datenverschlüsselung der einzelnen Datenpakete wird durch das verwendete Übertragungsprotokoll festgelegt. Ein Datenpaket enthält neben der eigentlichen Dateneinheit auch Header, Trailer mit Prüfsumme, Steuerungsinformationen und Verwaltungsinformationen. Als Vermittlungsverfahren kommt die Paketvermittlung zum Einsatz. Bei der Paketvermittlung wird die Gesamtmenge der zu übertragenden Daten bzw. Dateien in einzelne Pakete unterteilt, und dann übertragen. Dieses Vermittlungsverfahren ermöglicht eine störungssichere und leitungsunabhängige Datenübertragung. Bei zwei über Data Link, Nullmodem oder parallel Kabel verbundenen Computern ist die Datenpaketgröße wesentlich niedriger als bei IP-basierten Netzwerken wie lokalen Netzwerken, Weitbereichsnetzen oder dem Internet, da bei 2 direktverbundenen Computern einige Steuerinformationen wie zum Beispiel Empfängeradresse oder Absenderadresse entfallen. Quelle:

    Letztendlich bedeutet das nichts anderes, als das Datenpakete Blöcke von Daten sind, die in ihrem Header Informationen über z.B. die größe der Pakete enthalten.


    Pakete werden ständig und überall verwendet. Ob ihr eine Internetseite aufruft, oder ein Flashgame im Internet spielt, euer Rechner und die Server kommunizieren immer über Pakete miteinander. Dabei kann es große unterschiede geben wie ein Paket aussieht.


    Ein HTTP-Paket hat beispielsweise in etwa dieses Aussehen (kann leicht variieren):

    Code
    1. Eigener Rechner sendet:http://www.google.de/GET / HTTP/1.1Host: www.google.deUser-Agent: Mozilla/5.0 (Windows NT 5.1; rv:7.0.1) Gecko/20100101 Firefox/7.0.1Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7Connection: keep-aliveCookie: hier stehen gesezte cookies...Server antwortet:HTTP/1.1 200 OKDate: Sat, 01 Oct 2011 16:43:57 GMTExpires: -1Cache-Control: private, max-age=0Content-Type: text/html; charset=UTF-8Content-Encoding: gzipServer: gwsContent-Length: 16573X-XSS-Protection: 1; mode=block


    Wenn ihr in eurer URL-Leiste www.google.de eingebt, kommt der obere Block genauso beim Google Server an, und Google sendet ein Antwort Paket. Dies wird von eurem Browser dann grafisch dargestellt. Gesendet wird tatsächlich ausschließlich Text!


    Ein Paket von einer Flashanwendung kann Beispielsweise so aussehen:

    Code
    1. LAB|UPD|GET
    2. RDY|MAP


    Ihr seht also, es gibt gewisse unterschiede zwischen Paketen, je nachdem zu welchem Zweck sie benötigt werden. Was genau das Flashpaket macht, und wie es sich zusammensetzt, werde ich in diesem Tutorial nicht erklären, dies würde den Rahmen sprengen. Zu den HTTP-Paketen werde ich allerdings jetzt kommen.


    2. HTTP Pakete und wie man sie sniffen kann


    Wir beginnen damit HTTP Pakete zu sniffen, damit ihr selbst welche analysieren und euch eigenständig mit ihnen auseinander setzten könnt.
    Um HTTP Pakete zu sniffen kann man jeden beliebigen sniffer verwenden, falls ihr Firefox habt würde ich euch allerdings das Add-on Live HTTP headers empfehlen, ich persönlich habe damit bisher nur gute Erfahrungen gemacht.


    Ich gehe im weiteren Verlauf des Tutorials davon aus, dass ihr Live HTTP headers verwendet, solltet ihr einen anderen sniffer benutzen, stellt sicher das ihr ihn bedienen könnt!


    Nachdem Live HTTP headers installiert ist, findet ihr unter "Extras" in der Menüleiste von Firefox den Eintrag "Live HTTP headers". Startet das Programm, es sollte sich jetzt dieses Fenster öffnen:
    [Blocked Image: http://www.bilder-space.de/show_img.php?img=1322b4-1317488541.jpg&size=thumb]


    Achtet darauf, dass der Hacken bei "Mitschneiden" gesezt ist!


    Wenn ihr jetzt einfach mal auf www.google.de geht, sollte sich danach im Live HTTP headers Fenster etwas getan haben.
    Mehrere, durch waagerechte Linien getrennte, Datenblöcke sollten aufgetaucht sein. Beziehungsweise, es sollten sogar 2 Datenblöcke zwischen diesen waagerechten Linien stehen.


    Der jeweils erste Block ist die Anfrage von eurem Rechner an den Server. Wie dieser Block sich zusammensezt zeige ich euch an dem Paket, das mein Rechner an den Google Server sendet.


    Euer Paket müsste ziemlich ähnlich aussehen!


    Die Antwort vom Googleserver sollte in etwa so aussehen (wieder mit Erklärung):


    Weiterführende Informationen bezüglich HTTP Paketen:
    Wikipedia - Hypertext Transfer Protocol
    Hypertext Transfer Protocol -- HTTP/1.1

  • Bei Anfragen des eigenen Rechners (Client), unterscheidet man zwischen 2 arten der Anfrage per HTTP Protokoll.


    Erstens gibt es "GET" (leicht am "GET" vor der HTTP Versionsnummer zu erkennen). Diese GET Pakete enthalten lediglich Informationen über den Browser und die Seite die angesteuert werden soll. GET Pakete werden daher verwendet um Seiten aufzurufen.


    Im Gegensatz dazu stehen POST Pakete. POST Pakete werden immer dann genuzt, wenn der Client dem Server etwas mitteilen muss, beispielsweise was sich in einem Input befindet (wenn ihr euchetwa in diesem Forum einloggt, wird ein POST Paket verwendet um dem Server den von euch eingegebenen Benutzernamen und das Passwort mitzuteilen). Ein POST Paket unterscheidet sich in 3 Kleinigkeiten von einem GET Paket.


    Erstens beginnen POST Pakete im gegensatz zu GET mit dem Stichwort "POST" (und andersherum).
    Zweitens enthalten POST Pakete einen Anhang (Content).
    Und drittens enthalten POST Pakete eine Zeile die Informationen über die größe des Anhangs geben.


    Am besten loggt ihr euch selbst mal auf einer belibiegen Internetseite ein, während Live HTTP headers (oder euer sniffer) eingeschaltet ist.
    Seht euch danach dass POST Paket an und versucht den Unterschied zu einem GET Paket auszumachen. Das mag Anfangs kompliziert wirken, bekommt allerdings schnell Routine.



    3. Erstellen einer HTTP TCP-Request Funktion


    Um zu Kapitel 4 zu kommen, in dem endlich ein HTTP Bot für ein Browsergame erstellt wird, möchte ich dieses Kapitel einschieben. In diesem Kapitel werden die wichtigsten Funktionen zum erstellen eines solchen Bots erläutert.


    Die mit Abstand wichtigste Funktion hierfür ist eine HTTP Protokoll Request funktion. Welche Aufgaben muss diese Funktion erfüllen?


    • Es muss möglichst automatisch ein realistisches HTTP Paket erstellt werden.
    • Parameter wie die URL, eventuell verwendete Anhänge für POST Pakete und Cookies sollten übergebar sein.
    • Die Antwort des Servers sollte aufgezeichnet und zurück gegeben werden.
    • Bei Verbindungsfehlern muss der Benutzer darauf hingewiesen, und die Funktion beendet werden.

    Ich werde die Funktion in den Beispielen "_TCPRequest" nennen.


    Beginnen wir mit dem erstellen des Paketes. Bereits in der ersten Zeile stoßen wir auf ein Problem. Wenn es einen Anhang gibt, beginnt das Paket mit dem Schlüsselwort "POST", anderfalls mit "GET". Also müssen wir der Funktion zunächst einmal mitteilen um welche art von Paket es sich handelt.


    Und da kommt auch schon unser erstes Parameter zum Einsatz! Das Parameter (welches ich einfach mal "$sContent" nenne) in dem der Anhang enthalten ist. Am Anfang unserer _TCPRequest Funktion muss nun geprüft werden ob $sContent einen String enthält oder nicht. Falls $sContent also ungleich "" ist, handelt es sich um ein POST Paket, andernfalls um ein GET Paket.


    In der Funktion sieht das ganze so aus:


    Diese Funktion kann so wie sie da steht allerdings noch nicht Funktionieren. Sie enthält eine nicht deklarierte Variable "$sPage". Diese Variable steht in Zukunft für das Verzeichniss der Seite auf dem Server. Wie wir dieses mit Hilfe einiger Funktionen herrausfiltern können zeige ich euch hier. Die 3te verwendete Variable, $sPaket enthält später den String der als Paket gesendet wird.


    Da wir im Verlauf dieser Funktion sowohl den Host (z.B. www.noshacks.de), als auch das Seitenverzeichniss (z.B. /index.php) benötigen, ist es sinnvoll die gesamte URL als Parameter an die Funktion zu übergeben. Nennen wir das Parameter doch einfach "$sURL". Diese URL muss nun also in Host und Verzeichniss unterteilt werden. Dazu werden insgesamt 4 Funktionen benötigt, die sich jedoch ziemlich ähnlich sind.


    [autoit]StringLen("string")
    StringLeft("string", count)
    StringTrimLeft("string", count)
    StringSplit("string", "delimiters")[/autoit]


    StringLen - gibt die Länge eines Strings zurück.
    StringLeft - Extrahiert [count] Zeichen von Links aus einem String und gibt diese zurück. Count bezieht sich auf die Menge der Zeichen.
    StringTrimLeft - "Schneidet" eine Anzahl [count] von Zeichen links in einem String weg.
    StringSplit - Trennt einen String an bestimmten Zeichen [delimiters] und gibt alle getrennten Strings in einem Array zurück.


    Zunächst überprüfen wir ob die URL möglicherweise 'http://' enthält, dies benötigen wir nämlich nicht.


    Hier geht es in kürze weiter...