From bd9e1096cc6b7efc9884c4f551f21130b5fa8463 Mon Sep 17 00:00:00 2001 From: Skylot Date: Fri, 30 Aug 2019 15:11:06 +0100 Subject: [PATCH] fix: handle methods with all NOPs (#744) --- .../java/jadx/core/dex/attributes/AFlag.java | 1 + .../visitors/blocksmaker/BlockProcessor.java | 2 +- .../visitors/blocksmaker/BlockSplitter.java | 7 +- .../visitors/regions/RegionMakerVisitor.java | 2 +- .../tests/integration/others/TestAllNops.java | 22 +++++ .../src/test/smali/others/TestAllNops.smali | 92 +++++++++++++++++++ 6 files changed, 122 insertions(+), 4 deletions(-) create mode 100644 jadx-core/src/test/java/jadx/tests/integration/others/TestAllNops.java create mode 100644 jadx-core/src/test/smali/others/TestAllNops.smali diff --git a/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java b/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java index 27c2e389..44ef4573 100644 --- a/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java +++ b/jadx-core/src/main/java/jadx/core/dex/attributes/AFlag.java @@ -1,6 +1,7 @@ package jadx.core.dex.attributes; public enum AFlag { + MTH_ENTER_BLOCK, TRY_ENTER, TRY_LEAVE, diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockProcessor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockProcessor.java index 66383b84..01dd37d3 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockProcessor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockProcessor.java @@ -39,7 +39,7 @@ public class BlockProcessor extends AbstractVisitor { @Override public void visit(MethodNode mth) { - if (mth.isNoCode()) { + if (mth.isNoCode() || mth.getBasicBlocks().isEmpty()) { return; } processBlocksTree(mth); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockSplitter.java b/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockSplitter.java index a94edf58..ae2f95fb 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockSplitter.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/blocksmaker/BlockSplitter.java @@ -77,6 +77,7 @@ public class BlockSplitter extends AbstractVisitor { InsnNode prevInsn = null; Map blocksMap = new HashMap<>(); BlockNode curBlock = startNewBlock(mth, 0); + curBlock.add(AFlag.MTH_ENTER_BLOCK); mth.setEnterBlock(curBlock); // split into blocks @@ -331,7 +332,8 @@ public class BlockSplitter extends AbstractVisitor { static boolean removeEmptyDetachedBlocks(MethodNode mth) { return mth.getBasicBlocks().removeIf(block -> block.getInstructions().isEmpty() && block.getPredecessors().isEmpty() - && block.getSuccessors().isEmpty()); + && block.getSuccessors().isEmpty() + && !block.contains(AFlag.MTH_ENTER_BLOCK)); } private static boolean removeUnreachableBlocks(MethodNode mth) { @@ -385,7 +387,8 @@ public class BlockSplitter extends AbstractVisitor { return block.getInstructions().isEmpty() && block.isAttrStorageEmpty() && block.getSuccessors().size() <= 1 - && !block.getPredecessors().isEmpty(); + && !block.getPredecessors().isEmpty() + && !block.contains(AFlag.MTH_ENTER_BLOCK); } private static void collectSuccessors(BlockNode startBlock, Set toRemove) { diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java index a5d2f92c..9a3f1a7b 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/regions/RegionMakerVisitor.java @@ -39,7 +39,7 @@ public class RegionMakerVisitor extends AbstractVisitor { @Override public void visit(MethodNode mth) throws JadxException { - if (mth.isNoCode()) { + if (mth.isNoCode() || mth.getBasicBlocks().isEmpty()) { return; } RegionMaker rm = new RegionMaker(mth); diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestAllNops.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestAllNops.java new file mode 100644 index 00000000..e7f10e16 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestAllNops.java @@ -0,0 +1,22 @@ +package jadx.tests.integration.others; + +import org.junit.jupiter.api.Test; + +import jadx.core.dex.nodes.ClassNode; +import jadx.tests.api.SmaliTest; + +import static jadx.tests.api.utils.JadxMatchers.containsLines; +import static org.hamcrest.MatcherAssert.assertThat; + +public class TestAllNops extends SmaliTest { + + @Test + public void test() { + disableCompilation(); + ClassNode cls = getClassNodeFromSmali(); + String code = cls.getCode().toString(); + + assertThat(code, containsLines(1, "private boolean test() {", "}")); + assertThat(code, containsLines(1, "private boolean testWithTryCatch() {", "}")); + } +} diff --git a/jadx-core/src/test/smali/others/TestAllNops.smali b/jadx-core/src/test/smali/others/TestAllNops.smali new file mode 100644 index 00000000..cad23630 --- /dev/null +++ b/jadx-core/src/test/smali/others/TestAllNops.smali @@ -0,0 +1,92 @@ +.class public Lothers/TestAllNops; +.super Ljava/lang/Object; + +.method public constructor ()V + .registers 1 + + .line 55 + nop + + nop + + nop + + nop +.end method + +.method private test()Z + .registers 11 + + .line 1480 + nop + + nop + + .line 1481 + nop + + nop + + nop + + nop + + nop + + nop + + .line 1485 + nop + + nop + + .line 1486 + nop + + nop + + .line 1487 + nop + +.end method + +.method private testWithTryCatch()Z + .registers 11 + + .line 1480 + :try_start_0 + nop + nop + + .line 1481 + nop + + nop + + nop + + nop + + nop + + nop + + .line 1485 + nop + + nop + + :try_end_35 + .catch Ljava/security/NoSuchAlgorithmException; {:try_start_0 .. :try_end_35} :catch_36 + + nop + + .line 1547 + :catch_36 + + nop + + .line 1487 + nop + +.end method -- GitLab