From 17aba1eeca117538f1fd8bd149952a279c585df1 Mon Sep 17 00:00:00 2001 From: EpicPlayerA10 Date: Mon, 18 Nov 2024 18:30:34 +0100 Subject: [PATCH 1/3] Fix computed sizes of WideInstruction --- .../instruction/WideInstruction.java | 23 ++++++++++-------- .../coley/cafedude/RegressionTests.java | 5 +++- .../software/coley/cafedude/SizeTest.java | 10 ++++---- .../obfuscated/crasher-dude/WideInsn.class | Bin 0 -> 113572 bytes 4 files changed, 22 insertions(+), 16 deletions(-) create mode 100644 core/src/test/resources/samples/obfuscated/crasher-dude/WideInsn.class diff --git a/core/src/main/java/software/coley/cafedude/classfile/instruction/WideInstruction.java b/core/src/main/java/software/coley/cafedude/classfile/instruction/WideInstruction.java index 1eabcc5..98e9876 100644 --- a/core/src/main/java/software/coley/cafedude/classfile/instruction/WideInstruction.java +++ b/core/src/main/java/software/coley/cafedude/classfile/instruction/WideInstruction.java @@ -26,16 +26,19 @@ public Instruction getBacking() { @Override public int computeSize() { - switch (backing.getOpcode()) { - case Opcodes.IINC: - return 6; - case Opcodes.LLOAD: - case Opcodes.DLOAD: - case Opcodes.LSTORE: - case Opcodes.DSTORE: - return 4; - default: - return 3; + if (backing.getOpcode() == Opcodes.IINC) { + // opcode + // iinc + // indexbyte1 + // indexbyte2 + // constbyte1 + // constbyte2 + return 6; } + // opcode + // input opcode + // indexbyte1 + // indexbyte2 + return 4; } } diff --git a/core/src/test/java/software/coley/cafedude/RegressionTests.java b/core/src/test/java/software/coley/cafedude/RegressionTests.java index 54d1b22..ab99e19 100644 --- a/core/src/test/java/software/coley/cafedude/RegressionTests.java +++ b/core/src/test/java/software/coley/cafedude/RegressionTests.java @@ -1,8 +1,10 @@ package software.coley.cafedude; +import software.coley.cafedude.classfile.ClassFile; import software.coley.cafedude.io.ClassFileReader; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +import software.coley.cafedude.io.ClassFileWriter; import java.io.File; import java.io.IOException; @@ -23,7 +25,8 @@ public void testNoErrors(File sample) { try { byte[] code = Files.readAllBytes(sample.toPath()); assertDoesNotThrow(() -> { - new ClassFileReader().read(code); + ClassFile classFile = new ClassFileReader().read(code); + new ClassFileWriter().write(classFile); }, "Library crashes when reading: " + sample.getName()); } catch (IOException error) { fail("Failed to read class, IO error", error); diff --git a/core/src/test/java/software/coley/cafedude/SizeTest.java b/core/src/test/java/software/coley/cafedude/SizeTest.java index 6bda439..b404520 100644 --- a/core/src/test/java/software/coley/cafedude/SizeTest.java +++ b/core/src/test/java/software/coley/cafedude/SizeTest.java @@ -51,13 +51,13 @@ void testWideInstruction() { // Wide type variable insns are 4 for (int op : four_byte_ops) { - instruction = new WideInstruction(new IntOperandInstruction(op, 0)); - assertEquals(4, instruction.computeSize()); + WideInstruction instruction1 = new WideInstruction(new IntOperandInstruction(op, 0)); + assertEquals(4, instruction1.computeSize()); } - // Normal variable insns are 3 + // Normal variable insns are 2 for (int op : three_byte_ops) { - instruction = new WideInstruction(new IntOperandInstruction(op, 0)); - assertEquals(3, instruction.computeSize()); + IntOperandInstruction instruction2 = new IntOperandInstruction(op, 0); + assertEquals(2, instruction2.computeSize()); } } diff --git a/core/src/test/resources/samples/obfuscated/crasher-dude/WideInsn.class b/core/src/test/resources/samples/obfuscated/crasher-dude/WideInsn.class new file mode 100644 index 0000000000000000000000000000000000000000..ceca42b3190300637e7c925ff4568e44202e3bee GIT binary patch literal 113572 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 KHp7cy*#84Y#0f|M literal 0 HcmV?d00001 From 8bd2b4884c5a1d27e5a0f56ab64f81d859733fd2 Mon Sep 17 00:00:00 2001 From: EpicPlayerA10 Date: Mon, 18 Nov 2024 18:43:40 +0100 Subject: [PATCH 2/3] changes in test --- .../java/software/coley/cafedude/SizeTest.java | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/core/src/test/java/software/coley/cafedude/SizeTest.java b/core/src/test/java/software/coley/cafedude/SizeTest.java index b404520..35e0327 100644 --- a/core/src/test/java/software/coley/cafedude/SizeTest.java +++ b/core/src/test/java/software/coley/cafedude/SizeTest.java @@ -38,27 +38,19 @@ void testIincInstruction() { @Test void testWideInstruction() { - int[] four_byte_ops = { - LLOAD, DLOAD, LSTORE, DSTORE - }; - int[] three_byte_ops = { - RET, ILOAD, FLOAD, ALOAD, ISTORE, FSTORE, ASTORE - }; - // IINC is 6 bytes WideInstruction instruction = new WideInstruction(new IincInstruction(0, 0)); assertEquals(6, instruction.computeSize()); + int[] four_byte_ops = { + LLOAD, DLOAD, LSTORE, DSTORE, RET, ILOAD, FLOAD, ALOAD, ISTORE, FSTORE, ASTORE + }; + // Wide type variable insns are 4 for (int op : four_byte_ops) { WideInstruction instruction1 = new WideInstruction(new IntOperandInstruction(op, 0)); assertEquals(4, instruction1.computeSize()); } - // Normal variable insns are 2 - for (int op : three_byte_ops) { - IntOperandInstruction instruction2 = new IntOperandInstruction(op, 0); - assertEquals(2, instruction2.computeSize()); - } } @Test From 7dffd6fcbfc20fb178e6849c9e57c2a79693411f Mon Sep 17 00:00:00 2001 From: Matt Date: Sun, 24 Nov 2024 01:46:45 -0500 Subject: [PATCH 3/3] Add link to wide handling --- .../coley/cafedude/classfile/instruction/WideInstruction.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/src/main/java/software/coley/cafedude/classfile/instruction/WideInstruction.java b/core/src/main/java/software/coley/cafedude/classfile/instruction/WideInstruction.java index 98e9876..055c46a 100644 --- a/core/src/main/java/software/coley/cafedude/classfile/instruction/WideInstruction.java +++ b/core/src/main/java/software/coley/cafedude/classfile/instruction/WideInstruction.java @@ -27,6 +27,9 @@ public Instruction getBacking() { @Override public int computeSize() { if (backing.getOpcode() == Opcodes.IINC) { + // IINC is unique in that it becomes 6 bytes: + // https://docs.oracle.com/javase/specs/jvms/se21/html/jvms-6.html#jvms-6.5.wide + // // opcode // iinc // indexbyte1