From 0f00fb9a270b621cf447a004f005b288e26548f9 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sat, 11 Dec 2021 15:28:17 +0000 Subject: [PATCH] fix: handle move-result after invoke-custom with string concat --- .../dex/visitors/ProcessInstructionsVisitor.java | 7 +++++++ .../test/java/jadx/tests/api/IntegrationTest.java | 2 ++ .../integration/others/TestStringConcatJava11.java | 14 +++++++++++++- .../input/javaconvert/JavaConvertLoader.java | 8 ++++++-- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessInstructionsVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessInstructionsVisitor.java index edec27c2860..c9c9ba4f269 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessInstructionsVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/ProcessInstructionsVisitor.java @@ -80,6 +80,13 @@ private static void initJumps(MethodNode mth, InsnNode[] insnByOffset) { } break; + case STR_CONCAT: + // invoke-custom with string concatenation translated directly to STR_CONCAT, merge next move-result + if (insn.getResult() == null) { + mergeMoveResult(insnByOffset, offset, insn, ArgType.STRING); + } + break; + case FILLED_NEW_ARRAY: ArgType arrType = ((FilledNewArrayNode) insn).getArrayType(); mergeMoveResult(insnByOffset, offset, insn, arrType); diff --git a/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java b/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java index 05f4a2e783a..fa041f47f38 100644 --- a/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java +++ b/jadx-core/src/test/java/jadx/tests/api/IntegrationTest.java @@ -47,6 +47,7 @@ import jadx.core.xmlgen.ResourceStorage; import jadx.core.xmlgen.entry.ResourceEntry; import jadx.tests.api.compiler.DynamicCompiler; +import jadx.tests.api.compiler.JavaUtils; import jadx.tests.api.compiler.StaticCompiler; import jadx.tests.api.utils.TestUtils; @@ -490,6 +491,7 @@ protected void useEclipseCompiler() { } protected void useTargetJavaVersion(int version) { + Assumptions.assumeTrue(JavaUtils.checkJavaVersion(version), "skip test for higher java version"); this.targetJavaVersion = version; } diff --git a/jadx-core/src/test/java/jadx/tests/integration/others/TestStringConcatJava11.java b/jadx-core/src/test/java/jadx/tests/integration/others/TestStringConcatJava11.java index aa68b238f8c..cf7f95a9797 100644 --- a/jadx-core/src/test/java/jadx/tests/integration/others/TestStringConcatJava11.java +++ b/jadx-core/src/test/java/jadx/tests/integration/others/TestStringConcatJava11.java @@ -3,6 +3,8 @@ import org.junit.jupiter.api.Test; import jadx.tests.api.RaungTest; +import jadx.tests.api.extensions.inputs.InputPlugin; +import jadx.tests.api.extensions.inputs.TestWithInputPlugins; import static jadx.tests.api.utils.assertj.JadxAssertions.assertThat; @@ -40,7 +42,7 @@ public void test() { } @Test - public void testJava() { + public void testJava8() { noDebugInfo(); assertThat(getClassNode(TestCls.class)) .code() @@ -49,4 +51,14 @@ public void testJava() { "return str + \"test\" + str + 7;", "return str + \"test\" + str + \"7\";"); // dynamic concat add const to string recipe } + + @TestWithInputPlugins({ InputPlugin.DEX, InputPlugin.JAVA }) + public void testJava11() { + useTargetJavaVersion(11); + noDebugInfo(); + assertThat(getClassNode(TestCls.class)) + .code() + .containsOne("return str + \"test\";") + .containsOne("return str + \"test\" + str + \"7\";"); + } } diff --git a/jadx-plugins/jadx-java-convert/src/main/java/jadx/plugins/input/javaconvert/JavaConvertLoader.java b/jadx-plugins/jadx-java-convert/src/main/java/jadx/plugins/input/javaconvert/JavaConvertLoader.java index d84faa8b12e..14dfbdbc4eb 100644 --- a/jadx-plugins/jadx-java-convert/src/main/java/jadx/plugins/input/javaconvert/JavaConvertLoader.java +++ b/jadx-plugins/jadx-java-convert/src/main/java/jadx/plugins/input/javaconvert/JavaConvertLoader.java @@ -158,9 +158,13 @@ private static void convertSimpleJar(ConvertResult result, Path path) throws Exc try { DxConverter.run(path, tempDirectory); - } catch (Exception e) { + } catch (Throwable e) { LOG.warn("DX convert failed, trying D8, path: {}", path); - D8Converter.run(path, tempDirectory); + try { + D8Converter.run(path, tempDirectory); + } catch (Throwable ex) { + LOG.error("D8 convert failed: {}", ex.getMessage()); + } } LOG.debug("Converted to dex: {}", path.toAbsolutePath());