diff --git a/G-Earth/src/main/java/gearth/misc/packetrepresentation/PacketStringUtils.java b/G-Earth/src/main/java/gearth/misc/packetrepresentation/PacketStringUtils.java index f9d69b9..42b5dc3 100644 --- a/G-Earth/src/main/java/gearth/misc/packetrepresentation/PacketStringUtils.java +++ b/G-Earth/src/main/java/gearth/misc/packetrepresentation/PacketStringUtils.java @@ -45,6 +45,9 @@ public class PacketStringUtils { packet = replaceAll(packet, "\\{u:([0-9]+)}", m -> "[" + (Integer.parseInt(m.group(1))/256) + "][" + (Integer.parseInt(m.group(1)) % 256) + "]"); + packet = replaceAll(packet, "\\{h:([0-9]+)}", + m -> "[" + (Integer.parseInt(m.group(1))/256) + "][" + (Integer.parseInt(m.group(1)) % 256) + "]"); + packet = replaceAll(packet, "\\{b:([Ff]alse|[Tt]rue)}", m -> m.group(1).toLowerCase().equals("true") ? "[1]" : "[0]"); @@ -174,7 +177,7 @@ public class PacketStringUtils { packet.resetReadIndex(); StringBuilder builder = new StringBuilder(); - builder.append("{l}{u:").append(packet.headerId()).append("}"); + builder.append("{l}{h:").append(packet.headerId()).append("}"); buildExpressionFromGivenStructure(packet, struct, 0, builder); packet.setReadIndex(oldReadIndex); @@ -205,6 +208,7 @@ public class PacketStringUtils { else if (c == 'b') builder.append("{b:").append(p.readByte()).append('}'); else if (c == 'B') builder.append("{b:").append(p.readBoolean()).append('}'); else if (c == 'l') builder.append("{l:").append(p.readLong()).append('}'); + else if (c == 'u') builder.append("{u:").append(p.readShort()).append('}'); else return; } } @@ -233,16 +237,16 @@ public class PacketStringUtils { } public static void main(String[] args) throws InvalidPacketException { - HPacket p1 = fromString("{l}{u:1129}{s:\"\\\\\\\\\"}{i:0}{i:0}"); + HPacket p1 = fromString("{l}{h:1129}{s:\"\\\\\\\\\"}{i:0}{i:0}"); System.out.println(p1.toExpression()); HPacket p1_2 = fromString(p1.toExpression()); System.out.println(p1_2.toExpression()); - HPacket p2 = fromString("{l}{u:4564}{i:3}{i:0}{s:\"hi\"}{i:0}{i:1}{s:\"how\"}{i:3}{b:1}{b:2}{b:3}{i:2}{s:\"r u\"}{i:1}{b:120}{i:2}{b:true}"); + HPacket p2 = fromString("{l}{h:4564}{i:3}{i:0}{s:\"hi\"}{i:0}{i:1}{s:\"how\"}{i:3}{b:1}{b:2}{b:3}{i:2}{s:\"r u\"}{i:1}{b:120}{i:2}{b:true}"); System.out.println(p2); System.out.println(structureEquals( - new HPacket("{l}{u:5}{s:\"asdas\"}"), + new HPacket("{l}{h:5}{s:\"asdas\"}"), "s" )); } diff --git a/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/StructurePredictor.java b/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/StructurePredictor.java index 9a62eee..8216489 100644 --- a/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/StructurePredictor.java +++ b/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/StructurePredictor.java @@ -9,8 +9,8 @@ import java.util.List; public class StructurePredictor { - HPacket packet; - String structure; // null if not found/ didnt try to find + private HPacket packet; + private String structure; // null if not found/ didnt try to find public StructurePredictor(HPacket packet) { this.packet = packet; diff --git a/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/IntegerChecker.java b/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/IntegerChecker.java index 54c9941..72ade6a 100644 --- a/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/IntegerChecker.java +++ b/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/IntegerChecker.java @@ -33,7 +33,7 @@ public class IntegerChecker extends TypeChecker { } // 4 bytes that read [0][2]xy could be a string - if (ushortTest >= 2 && ushortTest <= 6 && StringChecker.canReadString(hPacket, index)) { + if (ushortTest == 2 && StringChecker.canReadString(hPacket, index)) { return (1 - StringChecker.scoreString(hPacket.readString(index))); } @@ -100,4 +100,17 @@ public class IntegerChecker extends TypeChecker { int nextIndexSafe(int index) { return index + 4; } + + public static void main(String[] args) { + HPacket packet = new HPacket("{l}{h:901}{b:false}{b:9}{i:0}{i:20064977}"); +// System.out.println(new IntegerChecker(packet).score(30)); +// System.out.println(new IntegerChecker(packet).score(26)); +// System.out.println(new StringChecker(packet).score(30)); + + TypeCheckerProducer.UNITY_PACKETS = true; + + System.out.println(new LongChecker(packet).score(8)); + + System.out.println(packet.toExpression()); + } } diff --git a/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/LongChecker.java b/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/LongChecker.java index 6ebf317..7cc3591 100644 --- a/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/LongChecker.java +++ b/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/LongChecker.java @@ -21,8 +21,13 @@ public class LongChecker extends TypeChecker { int split1 = hPacket.readInteger(index); int split2 = hPacket.readInteger(index + 4); - if (split2 > 256 * 256 * 3 && split1 == 0) { - return integerChecker.score(index); + int zeros = 0; + for (int i = index + 4; i < index + 8; i++) { + zeros += hPacket.readByte(i) == 0 ? 1 : 0; + } + + if (split2 > 256 * 256 * 3 && split1 == 0 && zeros < 2) { + return integerChecker.score(index) * integerChecker.score(index + 4) + 0.0000000001; } return 0; diff --git a/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/ShortChecker.java b/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/ShortChecker.java new file mode 100644 index 0000000..d125e3b --- /dev/null +++ b/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/ShortChecker.java @@ -0,0 +1,56 @@ +package gearth.misc.packetrepresentation.prediction.checkers; + +import gearth.protocol.HPacket; + +public class ShortChecker extends TypeChecker { + + private BooleanChecker booleanChecker; + private ByteChecker byteChecker; + + protected ShortChecker(HPacket hPacket) { + super("u", hPacket); + booleanChecker = new BooleanChecker(hPacket); + byteChecker = new ByteChecker(hPacket); + } + + @Override + public boolean canRead(int index) { + return index >= 6 && !(index + 2 > hPacket.getBytesLength()); + } + + @Override + public double score(int index) { + short val = hPacket.readShort(index); + + if (index == 6 && val == 0 && hPacket.length() == nextIndexSafe(index)) { + return 1; + } + + if (val <= 0) { + return 0; + } + + if (val < 1000) { + return 0.5; + } + + double leftMinScore; + double rightMinScore; + if (booleanChecker.canRead(index)) leftMinScore = booleanChecker.score(index); + else leftMinScore = byteChecker.score(index); + if (booleanChecker.canRead(index+1)) rightMinScore = booleanChecker.score(index+1); + else rightMinScore = byteChecker.score(index+1); + + return leftMinScore * rightMinScore + 0.00000001; + } + + @Override + Object get(int index) { + return hPacket.readShort(); + } + + @Override + int nextIndexSafe(int index) { + return index + 2; + } +} diff --git a/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/TypeCheckerProducer.java b/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/TypeCheckerProducer.java index f7d7959..c4c71fc 100644 --- a/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/TypeCheckerProducer.java +++ b/G-Earth/src/main/java/gearth/misc/packetrepresentation/prediction/checkers/TypeCheckerProducer.java @@ -8,7 +8,7 @@ import java.util.List; public class TypeCheckerProducer { - public static volatile boolean USE_LONG_DATATYPE = false; + public static volatile boolean UNITY_PACKETS = false; public static List getValidators(HPacket packet) { List typeCheckers = new ArrayList<>(Arrays.asList( @@ -17,8 +17,9 @@ public class TypeCheckerProducer { new IntegerChecker(packet), new StringChecker(packet))); - if (USE_LONG_DATATYPE) { + if (UNITY_PACKETS) { typeCheckers.add(new LongChecker(packet)); + typeCheckers.add(new ShortChecker(packet)); } return typeCheckers; diff --git a/G-Earth/src/main/java/gearth/protocol/HPacket.java b/G-Earth/src/main/java/gearth/protocol/HPacket.java index 6bcf771..c1cfb94 100644 --- a/G-Earth/src/main/java/gearth/protocol/HPacket.java +++ b/G-Earth/src/main/java/gearth/protocol/HPacket.java @@ -607,7 +607,7 @@ public class HPacket implements StringifyAble { } public static void main(String[] args) { - HPacket packet = new HPacket("{l}{u:4564}{i:3}{i:0}{s:\"hi\"}{i:0}{i:1}{s:\"how\"}{i:3}{b:1}{b:2}{b:3}{i:2}{s:\"r u\"}{i:1}{b:120}{i:2}{b:true}{d:1.4}"); + HPacket packet = new HPacket("{l}{h:4564}{i:3}{i:0}{s:\"hi\"}{i:0}{i:1}{s:\"how\"}{i:3}{b:1}{b:2}{b:3}{i:2}{s:\"r u\"}{i:1}{b:120}{i:2}{b:true}{d:1.4}"); String str = PacketStringUtils.toExpressionFromGivenStructure(packet, "i(isi(b))iBd"); diff --git a/G-Earth/src/main/java/gearth/ui/extra/ExtraController.java b/G-Earth/src/main/java/gearth/ui/extra/ExtraController.java index 1a98ee4..22f5a1f 100644 --- a/G-Earth/src/main/java/gearth/ui/extra/ExtraController.java +++ b/G-Earth/src/main/java/gearth/ui/extra/ExtraController.java @@ -2,7 +2,6 @@ package gearth.ui.extra; import gearth.Main; import gearth.misc.Cacher; -import gearth.misc.packetrepresentation.prediction.StructurePredictor; import gearth.misc.packetrepresentation.prediction.checkers.TypeCheckerProducer; import gearth.protocol.HConnection; import gearth.protocol.connection.HState; @@ -12,8 +11,6 @@ import gearth.services.gpython.GPythonVersionUtils; import gearth.ui.SubForm; import gearth.ui.info.InfoController; import javafx.application.Platform; -import javafx.beans.InvalidationListener; -import javafx.beans.Observable; import javafx.event.ActionEvent; import javafx.scene.control.*; import javafx.scene.layout.FlowPane; @@ -64,10 +61,10 @@ public class ExtraController extends SubForm implements SocksConfiguration { public RadioButton rd_flash; public void initialize() { - TypeCheckerProducer.USE_LONG_DATATYPE = rd_unity.isSelected(); + TypeCheckerProducer.UNITY_PACKETS = rd_unity.isSelected(); tgl_clientMode.selectedToggleProperty().addListener(observable -> { parentController.connectionController.changeClientMode(); - TypeCheckerProducer.USE_LONG_DATATYPE = rd_unity.isSelected(); + TypeCheckerProducer.UNITY_PACKETS = rd_unity.isSelected(); }); url_troubleshooting.setTooltip(new Tooltip("https://github.com/sirjonasxx/G-Earth/wiki/Troubleshooting")); diff --git a/G-Earth/src/main/java/gearth/ui/injection/InjectionController.java b/G-Earth/src/main/java/gearth/ui/injection/InjectionController.java index adb0726..7cc3e52 100644 --- a/G-Earth/src/main/java/gearth/ui/injection/InjectionController.java +++ b/G-Earth/src/main/java/gearth/ui/injection/InjectionController.java @@ -136,8 +136,8 @@ public class InjectionController extends SubForm { public static void main(String[] args) { - HPacket[] packets = parsePackets("{l}{u:3}{i:967585}{i:9589}{s:\"furni_inscriptionfuckfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss\"}{s:\"sirjonasxx-II\"}{s:\"\"}{i:188}{i:0}{i:0}{b:false}"); - System.out.println(new HPacket("{l}{u:2550}{s:\"ClientPerf\"\"ormance\\\"}\"}{s:\"23\"}{s:\"fps\"}{s:\"Avatars: 1, Objects: 0\"}{i:76970180}").toExpression()); + HPacket[] packets = parsePackets("{l}{h:3}{i:967585}{i:9589}{s:\"furni_inscriptionfuckfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionfurni_inscriptionsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss\"}{s:\"sirjonasxx-II\"}{s:\"\"}{i:188}{i:0}{i:0}{b:false}"); + System.out.println(new HPacket("{l}{h:2550}{s:\"ClientPerf\"\"ormance\\\"}\"}{s:\"23\"}{s:\"fps\"}{s:\"Avatars: 1, Objects: 0\"}{i:76970180}").toExpression()); System.out.println("hi"); }