Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Banana-Coding.com - Java Knuddels Emulator. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Sonntag, 25. März 2012, 17:44

[Release] Module Protocol

Diese Klassen sind für das Module Protocol, um bspw. eine Toolbar anzuzeigen. Stammen aus dem K-Reverse Emulator, müssen für den Banana-Chat etwas angepasst werden.

ModuleTree.java
Wo der Tree definiert ist, ist euch überlassen, bei mir wird er aus der Datenbank gelesen und dem Konstruktor übergeben.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package kreverse.kremu;

import java.util.ArrayList;

/**
 *
 * @author Flav
 */
public class ModuleTree {
	private String tree;
	private int version;
	private byte startIndex;
	private ArrayList<String> modules;

	public ModuleTree(String tree) {
		this.tree = tree;
		String[] mdls = tree.split(";");
		version = Integer.parseInt(mdls[0]);
		startIndex = Byte.parseByte(mdls[1]);
		modules = new ArrayList<String>();

		for (int i = 2; i < mdls.length; i++) {
			modules.add(mdls[i]);
		}
	}

	public String getTree() {
		return tree;
	}

	public int getVersion() {
		return version;
	}

	public String getModule(int index) {
		return modules.get(index - startIndex);
	}

	public int getIndex(String module) {
		for (int i = 0; i < modules.size(); i++) {
			if (modules.get(i).equals(module)) {
				return i + startIndex;
			}
		}

		return -1;
	}
}


ModuleHandler.java
Dieser Handler (Opcode: q) wird auch von der Whois2 angesprochen, ist hier aber erstmal nur dafür zuständig, dass der Tree von Client und Server übereinstimmen (braucht man nur wenn man den Tree ständig aktualisiert, was meiner Meinung nach sinnlos ist).

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package kreverse.kremu.handler;

import kreverse.kremu.Client;
import kreverse.kremu.Server;
import kreverse.kremu.tools.packet.PacketCreator;
import kreverse.kremu.tools.packet.PacketReader;

/**
 *
 * @author Flav
 */
public class ModuleHandler {
	private static String protocolConfirmed;
	private static String changeProtocol;

	static {
		protocolConfirmed = PacketCreator.protocolConfirmed();
		changeProtocol = PacketCreator.changeProtocol();
	}

	public static void handle(PacketReader reader, Client client) {
		String module = Server.get().getModuleTree().getModule(reader.readShort());

		if (module.equals("CONFIRM_PROTOCOL_HASH")) {
			reader.readInt();
			int version = reader.readInt();

			if (Server.get().getModuleTree().getVersion() == version) {
				client.send(protocolConfirmed);
			} else {
				client.send(changeProtocol);
			}
		}
	}
}


PacketReader.java

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package kreverse.kremu.tools.packet;

/**
 *
 * @author Flav
 */
public class PacketReader {
	private String buffer;

	public PacketReader(String buffer) {
		this.buffer = buffer;
	}

	public byte read() {
		byte v = (byte) buffer.charAt(0);
		buffer = buffer.substring(1);
		return v;
	}

	public boolean readBoolean() {
		return read() != 0;
	}

	public short readShort() {
		return (short) (((read() & 0xFF) << 8)
				+ (read() & 0xFF));
	}

	public int readInt() {
		return ((read() & 0xFF) << 24)
				+ ((read() & 0xFF) << 16)
				+ ((read() & 0xFF) << 8)
				+ (read() & 0xFF);
	}

	public String readString(int len) {
		String v = buffer.substring(0, len);
		buffer = buffer.substring(len);
		return v;
	}
}


PacketWriter.java

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package kreverse.kremu.tools.packet;

/**
 *
 * @author Flav
 */
public class PacketWriter {
	private StringBuilder buffer;

	public PacketWriter() {
		buffer = new StringBuilder();
	}

	public void write(int v) {
		buffer.append((char) v);
	}

	public void writeBoolean(boolean v) {
		write(v ? 1 : 0);
	}

	public void writeShort(int v) {
		write(v >> 8);
		write(v);
	}

	public void writeInt(int v) {
		write(v >> 24);
		write(v >> 16);
		write(v >> 8);
		write(v);
	}

	public void writeString(String v) {
		buffer.append(v);
	}

	public String toString() {
		return buffer.toString();
	}
}


PacketCreator.java

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[...]

	public static String protocolConfirmed() {
		PacketWriter packet = new PacketWriter();
		packet.writeString(SendOpcode.MODULE.getValue());
		packet.write(0x00);
		packet.writeShort(Server.get().getModuleTree().getIndex("PROTOCOL_CONFIRMED"));
		return packet.toString();
	}

	public static String changeProtocol() {
		PacketWriter packet = new PacketWriter();
		packet.writeString(SendOpcode.MODULE.getValue());
		packet.write(0x00);
		packet.writeShort(Server.get().getModuleTree().getIndex("CHANGE_PROTOCOL"));
		packet.writeShort(Server.get().getModuleTree().getTree().length());
		packet.writeString(Server.get().getModuleTree().getTree());
		return packet.toString();
	}

[...]


SessionHandler.java

Quellcode

1
2
3
4
5
6
7
8
9
[...]

else if (opcode.equals(ReceiveOpcode.MODULE.getValue())) {
							packet = packet.substring(2);
							PacketReader reader = new PacketReader(packet);
							ModuleHandler.handle(reader, this);
						}

[...]
Tschüß.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Flav« (25. März 2012, 20:10)


Es haben sich bereits 3 registrierte Benutzer bedankt.

Benutzer, die sich für diesen Beitrag bedankt haben:

Spectra, Diebspiel, Mentos

2

Sonntag, 25. März 2012, 21:17

Hier ist mal ein kleines Beispiel zum Anzeigen des PP-Fensters.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
	public static String privateChat(String channel, String nickname) {
		PacketWriter packet = new PacketWriter();
		packet.writeString(SendOpcode.MODULE.getValue());
		packet.write(0x00);
		packet.writeShort(Server.get().getModuleTree().getIndex("CLIENT_PP"));
		packet.write(channel.length());
		packet.writeString(channel);
		packet.write(nickname.length());
		packet.writeString(nickname);
		packet.write(0xFF);
		return packet.toString();
	}
Tschüß.

3

Mittwoch, 28. März 2012, 15:49

Hallo,

so richtig verstehe in dieses, ich nenn es mal 'AddOn', nicht.
Wofür soll das ganze denn gut sein?

Das /pp Fenster gibt's doch bereits im Chat, und Module-Sachen kann man doch auch so in der PacketCreator.java hinzufügen.

Oder ist das eine Art 'Entschlüsselung', da die :-Pakete schwerer zu analysieren sind?

4

Mittwoch, 28. März 2012, 17:02

Das mit dem /pp-Fenster ist nur ein Beispiel, mit dem Module Protocol lässt sich heute sehr viel anstellen. Wie Flav schrieb braucht man dafür erst den Tree, mit einem Logger kriegt man den aber raus.

Der oben genannte Code kann zum Beispiel - wie ich es verstanden habe - das PP-Fenster eines Users vom Server aus öffnen, was sonst nicht möglich ist.

Grüße
Kein Support per PN. Nur im Forum!

5

Mittwoch, 28. März 2012, 17:22

Im Banana-Chat ist der Opcode für das PP-Fenster hardcodet, bei einem Client-Update kann es passieren, dass sich das Fenster nicht mehr öffnet wenn der Opcode nicht aus einem übereinstimmenden Tree ausgelesen wird.
Tschüß.