From c93e7fb9cdfaae8a8f03618df1ba846a974a528c Mon Sep 17 00:00:00 2001 From: Skylot Date: Fri, 29 Jan 2021 11:31:00 +0000 Subject: [PATCH] fix: detect loaded class duplication (#1107) --- .../main/java/jadx/core/dex/nodes/RootNode.java | 16 +++++++++++++++- .../input/javaconvert/JavaConvertLoader.java | 4 +++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java b/jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java index f697475a..6cfb6286 100644 --- a/jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java +++ b/jadx-core/src/main/java/jadx/core/dex/nodes/RootNode.java @@ -5,6 +5,7 @@ import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -20,6 +21,7 @@ import jadx.api.plugins.input.data.IClassData; import jadx.api.plugins.input.data.ILoadResult; import jadx.core.Jadx; import jadx.core.clsp.ClspGraph; +import jadx.core.dex.attributes.AType; import jadx.core.dex.info.ClassInfo; import jadx.core.dex.info.ConstStorage; import jadx.core.dex.info.FieldInfo; @@ -60,8 +62,8 @@ public class RootNode { private final ICodeCache codeCache; - private final List classes = new ArrayList<>(); private final Map clsMap = new HashMap<>(); + private List classes = new ArrayList<>(); private ClspGraph clsp; @Nullable @@ -91,6 +93,18 @@ public class RootNode { } }); } + if (classes.size() != clsMap.size()) { + // class name duplication detected + classes.stream().collect(Collectors.groupingBy(ClassNode::getClassInfo)) + .entrySet().stream() + .filter(entry -> entry.getValue().size() > 1) + .forEach(entry -> { + LOG.warn("Found duplicated class: {}, count: {}. Only one will be loaded!", entry.getKey(), + entry.getValue().size()); + entry.getValue().forEach(cls -> cls.addAttr(AType.COMMENTS, "WARNING: Classes with same name are omitted")); + }); + } + classes = new ArrayList<>(clsMap.values()); // sort classes by name, expect top classes before inner classes.sort(Comparator.comparing(ClassNode::getFullName)); initInnerClasses(); 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 124c6555..288c7be8 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 @@ -82,9 +82,11 @@ public class JavaConvertLoader { .filter(aarMatcher::matches) .forEach(path -> ZipSecurity.readZipEntries(path.toFile(), (entry, in) -> { try { - if (entry.getName().endsWith(".jar")) { + String entryName = entry.getName(); + if (entryName.endsWith(".jar")) { Path tempJar = saveInputStreamToFile(in, ".jar"); result.addTempPath(tempJar); + LOG.debug("Loading jar: {} ...", entryName); convertJar(result, tempJar); } } catch (Exception e) { -- GitLab