diff --git a/jadx-core/src/main/java/jadx/core/deobf/NameMapper.java b/jadx-core/src/main/java/jadx/core/deobf/NameMapper.java index 9262f051f03a2a1e95d9e3aba7cab239ffb16d8b..8d6ba622599051ed01509ee3e9f17228deeca631 100644 --- a/jadx-core/src/main/java/jadx/core/deobf/NameMapper.java +++ b/jadx-core/src/main/java/jadx/core/deobf/NameMapper.java @@ -126,7 +126,7 @@ public class NameMapper { *

*/ public static String removeInvalidCharsMiddle(String name) { - if (isValidIdentifier(name) && isAllCharsPrintable(name)) { + if (isValidIdentifier(name)) { return name; } int len = name.length(); diff --git a/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java b/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java index 77822451f04805bb8e6338351ff3dbcffae1756c..2441119c3f576b2a7bafcf599ef7f16455b97787 100644 --- a/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java +++ b/jadx-core/src/main/java/jadx/core/dex/visitors/RenameVisitor.java @@ -92,10 +92,11 @@ public class RenameVisitor extends AbstractVisitor { if (firstChar == '$') { return 'C' + NameMapper.removeInvalidCharsMiddle(clsName); } - if (!NameMapper.isValidIdentifier(clsName)) { - return 'C' + clsName; + String cleanClsName = NameMapper.removeInvalidChars(clsName, "C"); + if (!NameMapper.isValidIdentifier(cleanClsName)) { + return 'C' + cleanClsName; } - return NameMapper.removeInvalidChars(clsName, "C"); + return cleanClsName; } private void checkFields(ClassNode cls) { diff --git a/jadx-core/src/test/java/jadx/tests/integration/names/TestClassNameWithInvalidChar.java b/jadx-core/src/test/java/jadx/tests/integration/names/TestClassNameWithInvalidChar.java new file mode 100644 index 0000000000000000000000000000000000000000..7d0a98f885d0693783b2c9fd3ef874c6497c4bd4 --- /dev/null +++ b/jadx-core/src/test/java/jadx/tests/integration/names/TestClassNameWithInvalidChar.java @@ -0,0 +1,36 @@ +package jadx.tests.integration.names; + +import org.junit.jupiter.api.Test; + +import jadx.api.JadxDecompiler; +import jadx.api.JadxInternalAccess; +import jadx.core.dex.nodes.ClassNode; +import jadx.core.dex.nodes.RootNode; +import jadx.tests.api.SmaliTest; + +public class TestClassNameWithInvalidChar extends SmaliTest { + /* + public class do- {} + public class i-f {} + */ + + @Test + public void test() { + JadxDecompiler d = loadSmaliFiles("names", "TestClassNameWithInvalidChar"); + RootNode root = JadxInternalAccess.getRoot(d); + for (ClassNode cls : root.getClasses(false)) { + decompileAndCheckCls(d, cls); + } + } + + @Test + public void testWithDeobfuscation() { + enableDeobfuscation(); + + JadxDecompiler d = loadSmaliFiles("names", "TestClassNameWithInvalidChar"); + RootNode root = JadxInternalAccess.getRoot(d); + for (ClassNode cls : root.getClasses(false)) { + decompileAndCheckCls(d, cls); + } + } +} diff --git a/jadx-core/src/test/smali/names/TestClassNameWithInvalidChar/a.smali b/jadx-core/src/test/smali/names/TestClassNameWithInvalidChar/a.smali new file mode 100644 index 0000000000000000000000000000000000000000..cdd749958457824a9ede6198d229ee821ad97ccd --- /dev/null +++ b/jadx-core/src/test/smali/names/TestClassNameWithInvalidChar/a.smali @@ -0,0 +1,2 @@ +.class public Ldo-; +.super Ljava/lang/Object; diff --git a/jadx-core/src/test/smali/names/TestClassNameWithInvalidChar/b.smali b/jadx-core/src/test/smali/names/TestClassNameWithInvalidChar/b.smali new file mode 100644 index 0000000000000000000000000000000000000000..b2edc2f7d029753e0c084f33b57e2834de72c662 --- /dev/null +++ b/jadx-core/src/test/smali/names/TestClassNameWithInvalidChar/b.smali @@ -0,0 +1,2 @@ +.class public Li-f; +.super Ljava/lang/Object;