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 ab22bca..8cc59eb 100644 --- a/G-Earth/src/main/java/gearth/misc/packetrepresentation/PacketStringUtils.java +++ b/G-Earth/src/main/java/gearth/misc/packetrepresentation/PacketStringUtils.java @@ -51,11 +51,29 @@ public class PacketStringUtils { packet = replaceAll(packet, "\\{b:([0-9]{1,3})}", m -> "[" + Integer.parseInt(m.group(1)) + "]"); - packet = replaceAll(packet, "\\{s:\"(([^\"]|(\\\\\"))*)\"}", - m -> { - String match = m.group(1).replace("\\\"", "\""); - return toString(new HPacket(0, match).readBytes(match.length() + 2, 6)); - }); + // results in regex stackoverflow for long strings +// packet = replaceAll(packet, "\\{s:\"(([^\"]|(\\\\\"))*)\"}", +// m -> { +// String match = m.group(1).replace("\\\"", "\""); +// return toString(new HPacket(0, match).readBytes(match.length() + 2, 6)); +// }); + + while (packet.contains("{s:\"")) { + int start = packet.indexOf("{s:\""); + int end = packet.indexOf("\"}"); + while (end != -1 && packet.charAt(end - 1) == '\\') { + end = packet.indexOf("\"}", end + 1); + } + if (end == -1) { + throw new InvalidPacketException(); + } + + String match = packet.substring(start + 4, end).replace("\\\"", "\"");; + packet = packet.substring(0, start) + + toString(new HPacket(0, match).readBytes(match.length() + 2, 6)) + + packet.substring(end + 2); + } + if (packet.contains("{") || packet.contains("}")) { throw new InvalidPacketException(); 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 82a0d29..adb0726 100644 --- a/G-Earth/src/main/java/gearth/ui/injection/InjectionController.java +++ b/G-Earth/src/main/java/gearth/ui/injection/InjectionController.java @@ -27,7 +27,7 @@ public class InjectionController extends SubForm { inputPacket.textProperty().addListener(event -> Platform.runLater(this::updateUI)); } - private boolean isPacketIncomplete(String line) { + private static boolean isPacketIncomplete(String line) { boolean unmatchedBrace = false; boolean ignoreBrace = false; @@ -51,7 +51,7 @@ public class InjectionController extends SubForm { return unmatchedBrace; } - private HPacket[] parsePackets(String fullText) { + private static HPacket[] parsePackets(String fullText) { LinkedList packets = new LinkedList<>(); String[] lines = fullText.split("\n"); @@ -133,4 +133,12 @@ public class InjectionController extends SubForm { writeToLog(Color.RED, "CS -> packet with id: " + packet.headerId()); } } + + + 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()); + + System.out.println("hi"); + } }