1. #1
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    6.080
    Thanked 9.118 Times in 2.995 Posts
    Blog Entries
    5

    Beitrag [Paper #2] Zugriff auf den Knuddelsclient aus Java heraus

    1. Vorwort

    Der Knuddelsclient selbst ist in Java geschrieben. Es liegt also nahe, dass wir Java nutzen, um den Client zu unseren Gunsten zu manipulieren.
    Unser Ziel wird es sein, eine Java-Anwendung zu entwickeln, die zwischen dem originalen Knuddels-Client und dem Chatserver steht.

    So kommuniziert der Knuddels-Client normal:



    Da wir diesen Datenverkehr kontrollieren, manipulieren und ggf. auch selbstständig erzeugen wollen, sitzt unsere Java-Anwendung später dazwischen:



    Wenn unser Client ein Paket zum Server senden will (z.B. wenn wir eine Nachricht senden), landet dieses Paket nicht direkt beim Server, sondern erst beim Client.
    Haben wir im Client festgelegt, dass dieses Paket okay ist, wird es zum Server weitergeleitet.
    Unsere Java-Anwendung stellt also eine Art Brücke zwischen Client und Server da, mit der wir alles kontrollieren können.

    2. Vorbereitungen und Werkzeuge

    2.1 Java Umgebungsvariablen registrieren

    Dieses Tutorial baut auf dem ersten Teil http://u-hacks.net/tutorials-90/pape...mmierung-8629/ auf.
    Ihr solltet also wie dort beschrieben das Java-SDK zusammen mit einem Texteditor eurer Wahl besitzen.
    Da wir später Java-Programme konsolenbasiert sowohl ausführen als auch kompilieren werden, müssen die Umgebungsvariablen angepasst werden.
    Wie das genau funktioniert, könnt ihr hier nachlesen: Installation des Java SDK / JDK (ab Punkt 8).

    2.2 Knuddels Applet herunterladen

    Da wir mit dem Knuddels-Applet arbeiten und es später sogar manipulieren wollen, benötigen wir dies natürlich erst einmal.
    Die aktuellste Version bekommen wir relativ einfach von der Knuddels-Homepage, wir müssen dazu nur den Login aufrufen: Chat - Knuddels.de
    Auf der Loginseite öffnen wir nun den Quelltext (Firefox: [STRG] + [U]) und suchen darin nach ".jar" (Firefox: [STRG] + [F].
    Damit sollten wir diese Zeile finden:

    PHP-Code:
    <applet id="chatapplet" name="chatapplet" width="100%" height="100%" code="Start.class" archive="knuddelsk90alw.jar"
    codebase="http://chat.knuddels.de/"
    alt=" " mayscript="yes" scriptable="true" 
    Der hiervon für uns relevante Teil ist

    PHP-Code:
    archive="knuddelsk90alw.jar" 
    Er gibt uns den Namen des aktuellen Applets an, also momentan knuddelsk90alw.jar. 90alw ist die Appletversion, die sich ständig ändert.

    Dies können wir nun einfach herunterladen, indem wir chat.knuddels.de/ davorsetzen: http://chat.knuddels.de/knuddelsk90alw.jar
    Dazu benötigen wir noch das zur Version passende ani-Archiv. Der Archivname lautet gleich wie der des Applets, nur wird knuddelsk durch ani ersetzt: http://chat.knuddels.de/ani90alw.jar

    2.3 Java Decompiler

    Um den compilierten Javacode von Knuddels wieder in eine einigermaßen lesbare Form zu bringen, brauchen wir einfen Decompiler.
    Es gibt hier ein paar verschiedene zur Auswahl. Dabei ist jedoch kein universeller, der alles perfekt decompilieren kann: Der eine compiliert diesen Teil des Applets besser, der andere den anderen.
    Für komplexere Vorhaben macht es daher Sinn, mehrere decompiler zu nutzen.
    Anfangs spielt das aber keine große Rolle, daher nehmen wir JD in der Gui-Version.

    Download: JD-GUI | Java Decompiler

    3. Erstes decompilieren des Applets

    Wir öffnen nun JD-GUI und ziehen das Applet, also knuddelsk90alw.jar, hinein (alternativ auch über File => Openfile öffnen).
    Links sehen wir nun die ganzen Klassen des Applets. Wie man sieht, sind die Namen nicht sehr aussagekräftig (OI, Z1, I5 etc).
    Dieses Kunstwerk haben wir dem vom Knuddels eingesetzten obfuscator zu verdanken. Zum einen soll uns dies das Reversen des Applets erschweren, zum anderen ist das Applet durch das obfuscaten kleiner.

    In der linken Leiste suchen wir nun eine Klasse mit dem Namen 'Start'. Diese Klasse wird, wie der Name schon sagt, beim starten des Applets geladen.
    Die Start-Klasse erbt immer von der sogenannten 'GroupChat-Klasse', zu erkennen direkt an der ersten Zeile:

    Code:
    public class Start extends dO
    [...]
    In der Applet-Version 90alw heißt die GroupChat-Klasse also dO. Dank des obfuscators ändert sich der Name bei jedem Update des Applets.

    In der Start-Klasse sehen wir noch weitere Methoden. Die für uns relevanten sind vorallem init() und start().
    Der Code sieht ziemlich chaotisch und kryptisch aus:

    Spoiler:

    Code:
    public void init()
      {
        try
        {
          f();
          break label24;
          return;
        }
        catch (Throwable localThrowable)
        {
          label24: 
          while (true)
          {
            a(t5.a(-20027), localThrowable, null);
            continue;
          }
        }
      }

    Für die Klasse interessieren wir uns aber erstmal gar nicht, unsere Aufmerksamkeit gilt der GroupChat-Klasse dO.

    4. Den Client aus Java heraus starten

    Nun geht es an das eigentliche coden in Java.
    Zuerst einmal erstellen wir ein leeres Textdokument mit dem Namen Client und der Datenendung .java.
    Dazu müsst ihr entweder in Windows das Anzeigen von Dateierweiterungen aktivieren, oder im Texteditor beim Speichern-Dialog als Dateiname Client.java und als Dateityp Alle Dateien auswählen.
    Ansonsten kommen so gebilde wie Client.java.txt heraus, die wir natürlich nicht wollen.

    Nachdem wir diese Datei in einem Texteditor geöffnet haben, fügen wir das Grundgerüst von so ziemlich jeder Java-Anwendung ein:

    Code:
    public class Client {
        public static void main(String[] args) {
        
        }
    }
    Um das Applet zu starten, müssen wir eine neue Instanz der GroupChat-Klasse dO erstellen.
    Wenn wir uns die sehr umfangreiche Klasse im Decompiler anschauen, sehen wir, dass der Konstrukteur 2 Argumente aufnehmen kann:

    Code:
    // ERROR //
      public dO(String paramString, int paramInt)
      {
        // Byte code:
        //   0: aload_0
        //   1: invokespecial 1333    java/applet/Applet:<init>    ()V
        //   4: aload_0
        //   5: sipush 445
        //   8: invokestatic 1334    t5:a    (I)Ljava/lang/String;
        //   11: putfield 2295    dO:h    Ljava/lang/String;
    Die Fehler und der bytecode, den dieser Obfuscator nicht korrekt decompilieren konnte, brauch uns erstmal nicht zu interessieren.
    Der erste Parameter des Konstrukteurs ist der Chathost, der zweite der entsprechende Port.
    Mit diesen Daten wird angegeben, zu welchem Chatsystem (DE, AT, CH, ...) sich das Applet verbinden soll. Knuddels nutzt für diese Chatsysteme jeweils den selben Client.

    Von Knuddels.de lauten diese Daten wie folgt:
    Host: chat.knuddels.de
    Port: 2710

    Wir erstellen also eine neue Instanz der GroupChat-Klasse und übergeben dieser im Konstrukteur Host und Port:

    Code:
    dO groupChat = new dO("chat.knuddels.de", 2710);
    Nun müssen wir das Applet noch initialisieren und starten.
    Dafür sehen wir uns mit dem obfuscator erneut die Start-Klasse an und suchen nach den Methoden init() und start:

    Spoiler:

    Code:
    public void init()
      {
        try
        {
          f();
          break label24;
          return;
        }
        catch (Throwable localThrowable)
        {
          label24: 
          while (true)
          {
            a(t5.a(-20027), localThrowable, null);
            continue;
          }
        }
      }
    
      public void start()
      {
        try
        {
          r();
          break label24;
          return;
        }
        catch (Throwable localThrowable)
        {
          label24: 
          while (true)
          {
            a(t5.a(-19818), localThrowable, null);
            continue;
          }
        }
      }


    Hier sehen wir, dass init() als erstes die Methode f() aufruft. Start ruft auch eine Methode auf, die jedoch r() heißt.
    Beide gehören zur GroupChat-Klasse. Diese Methoden müssen wir auch aufrufen, um das Applet zu initialisieren und anschließend zu starten:

    Code:
    dO groupChat = new dO("chat.knuddels.de", 2710);
    groupChat.f();
    groupChat.r();
    Nun ist das Applet zwar da, nur wir sehen es nicht.
    Da dieser Zustand zur Eingabe von Logindaten ziemlich ungeeignet ist, erzeugen wir ein Fenster, in Java ein sogenanntes JFrame, auf dem wir das Applet plazieren.
    Dafür müssen wir zuerst mal javax.swing.JFrame importieren, in dem wir ganz oben vor allem anderen folgende Zeile einfügen:

    Code:
    import javax.swing.JFrame;
    Nun erzeugen wir ein neues JFrame, übergeben dem Parameter den Titel, den unser Fenster haben soll

    Code:
    JFrame mainFrame = new JFrame("Knuddels-Client");
    hier heißt das Fenster 'mainFrame', da es das Hauptfenster unserer Anwendung darstellt.

    Nun müssen wir das Applet natürlich noch unserem JFrame hinzufügen:

    Code:
    mainFrame.add(groupChat);
    Schlussendlich positionieren wir das Fenster noch und machen es sichtbar:

    Code:
    mainFrame.pack();
    mainFrame.setLocationRelativeTo(mainFrame.getRootPane());
    mainFrame.setVisible(true);
    Damit sind wir codingmäßig erstmal fertig.
    Der gesamte Code sollte nun so aussehen:

    Spoiler:

    Code:
    import javax.swing.JFrame;
    
    public class Client {
        public static void main(String[] args) {
            dO groupChat = new dO("chat.knuddels.de", 2710);
            groupChat.f();
            groupChat.r();
            
            JFrame mainFrame = new JFrame("Knuddels-Client");
            mainFrame.add(groupChat);
            mainFrame.pack();
            mainFrame.setLocationRelativeTo(mainFrame.getRootPane());
            mainFrame.setVisible(true);
        }
    }


    Damit sich das Programm starten lässt, müssen wir es compilieren und anschließend starten.
    Da wohl keiner darauf steht jedes mal einzelne Befehle dafür einzugeben, erstellen wir uns eine Batch-Datei, die wir dafür dann nur noch öffnen müssen.

    Also wieder dasselbe Spiel wie vorher bei der Client.java-Datei: Wir erstellen eine neue Datei mit der Dateiendung .bat. Idealerweise nennt man sie start.bat, da sie zum starten des Clienten dient.

    In die Datei kommt folgendes:

    Code:
    javac Client.java
    pause
    java Client
    pause
    javac ist der Java-Compiler, er kompiliert die Datei Client.java. Anschließend führen wir die compilierte Datei mit java aus.
    Dazwischen warten wir mit Pause auf einen Tastendruck, falls beim compilieren etwas schiefläuft. Wenn nämlich beim compilieren was schiefläuft, wird die Java-Datei logischerweise nicht compiliert, und java guckt dumm wenn nix zum ausführen da ist.
    Bei komplexeren Projekten könnte man sich damit auch etwas zerschießen.

    Jetzt ist soweit alles fertig, es fehlt nur noch eine Sache, und zwar eine wichtige: Das Applet.
    Wenn wir kein Applet haben können wir logischerweise auch keines starten, daher ändern wir das jetzt:
    Am Anfang haben wir das Applet (knuddelsk90alw.jar) und das dazu passende ani-Archiv heruntergeladen.
    Beide Archive entpacken wir nun in den selben Ordner, in dem sowohl Client.java als auch start.bat liegen.
    Die Archive dürfen sich jedoch in keinem Unterordner befinden, sonst müssen wir den Classpath von Java anpassen, das lasse ich in diesem Tutorial absichtlich weg.
    Dann muss noch der netscape-Ordner rein (befindet sich unten im Anhang, einfach runterladen und entpacken) und der Client ist soweit fertig.

    Wenn euer Client-Ordner nun aus einem Durcheinander von vielen class- und diversen anderen Dateien besteht, ähnlich wie dem folgenden:



    solltet ihr alles richtig gemacht haben.

    Jetzt könnt ihr start.bat starten und testen, ob alles funktioniert.
    Nachdem sich ein schwarzes Fenster geöffnet hat, compiliert Java die Datei Client.java.
    Wenn euer Code nicht fehlerhaft ist, sollte Java nichts dazu sagen und direkt zu der pause-Anweisung in der Batch-Datei springen:



    Nachdem ihr irgendeine Taste gedrückt habt, wird der Client gestartet:



    Ihr habt nun einen lokalen Knuddels-Client, mit dem ihr euch normal in Knuddels einloggen könnt.

    Der hier erstellte Client befindet sich in der momentan aktuellsten Version (90alw) zusätzlich im Anhang!

    5. Nachwort

    Im nächsten Tutorial kommt der interessante Teil, nämlich die eigentliche Manipulation des Clienten, dazu. Der hier erzeugte Client ist praktisch der originale Knuddelsclient, der einfach nur lokal gestartet wird.
    Er bildet aber die Grundlage für spätere Clientmanipulationen.

    Im nächsten Teil werde ich auch zeigen, wie man das ganze übersichtlicher lößt. In diesem Teil wird einfach alles in einen Ordner geklatscht. Für Anfänger gut, da sie schnell zum Ergebnis kommt weil sie unterschiedliche Pfade nicht beachten müssen (was auch einige Fehlerquellen ausschließt).

    Für produktives Entwickeln ist so ein chaos natürlich absolut ungeeignet, erst recht bei der Manipulation, mit der ab dem nächsten Teil begonnen wird.

    Ausserdem gibt es noch ein paar Tricks, wie man seine Anwendungen dynamischer entwickeln kann, um so wenig wie möglich Variablen bzw Klassennamen zu verwenden, die sich bei einem Appletupdate ändern.
    Ein Beispiel wäre das verwenden der Start-Klasse (die ja von der GroupChat-Klasse erbt) anstatt direkt der GroupChat-Klasse.

    Das fällt hier aber alles bewusst weg, damit auch Anfänger schnell mit möglichst wenig Fehlerquellen zu einem Ergebnis kommen.


  2. The Following 9 Users Say Thank You to DMW007 For This Useful Post:

    Comu (31.05.2012), Dbzfreak1337 (31.05.2012), DnL (03.06.2012), Gangstersheep (21.07.2012), Mentos (01.06.2012), Pwned (21.07.2012), rVs14 (31.05.2012), Saad (07.12.2012), x failstar (07.06.2012)

  3. #2
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    6.080
    Thanked 9.118 Times in 2.995 Posts
    Blog Entries
    5

    Standard AW: [Paper #2] Zugriff auf den Knuddelsclient aus Java heraus

    Screens neu hochgeladen, da der Großteil down war.


  4. The Following User Says Thank You to DMW007 For This Useful Post:

    Minecraft (07.12.2012)

  5. #3
    Avatar von DMW007
    Registriert seit
    15.11.2011
    Beiträge
    6.080
    Thanked 9.118 Times in 2.995 Posts
    Blog Entries
    5

    Standard AW: [Paper #2] Zugriff auf den Knuddelsclient aus Java heraus

    Der Java-Compiler fehlt oder dessen Pfad ist nicht korrekt in den Umgebungsvariablen eingetragen. In der normalen Java-Runtime ist er nicht enthalten, dafür muss das Entwickler-Kit (JDK) installiert werden: Java Downloads

    Ob die Anleitung hier anschließend funktioniert, ist allerdings höchst fraglich:
    1. Wird XP seit über 2 Jahren nicht mehr unterstützt - Damit im Internet zu surfen ist grob fahrlässig, außerdem wird Java seit dem nicht mehr mit XP getestet und es finden keine Fehlerbehebungen statt - siehe Warum Windows XP fahrlässig und nicht mehr zeitgemäß ist
    2. Ist der Artikel über 4 Jahre alt, das Applet wird sich seit dem verändert haben und möglicherweise nur mit größeren Modifikationen wie gezeigt funktionieren
    3. Hat Knuddels seit Jahren mit Nutzerverlusten zu kämpfen, daher wird sich kaum jemand die Mühe machen, an #2 viel zu ändern


  6. The Following User Says Thank You to DMW007 For This Useful Post:

    xX PRiNCE LUBiNAZ Xx (25.10.2016)

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 02.12.2013, 23:41
  2. Antworten: 11
    Letzter Beitrag: 19.04.2013, 21:26
  3. [Paper #3] Saubere Struktur bei der Entwicklung
    Von DMW007 im Forum Tutorials
    Antworten: 1
    Letzter Beitrag: 21.07.2012, 01:54
  4. 2 Fragen bzgl. des Knuddelsclient
    Von rVs14 im Forum Knuddels Programmierung
    Antworten: 3
    Letzter Beitrag: 01.06.2012, 21:57
  5. Antworten: 0
    Letzter Beitrag: 07.03.2012, 23:31

Stichworte

Diese Seite nutzt Cookies, um das Nutzererlebnis zu verbessern. Klicken Sie hier, um das Cookie-Tracking zu deaktivieren.