From 868fa9009713ebfe7be90be4c2cf2d6e87ab3cf2 Mon Sep 17 00:00:00 2001 From: Skylot Date: Sun, 15 Aug 2021 14:44:55 +0100 Subject: [PATCH] feat: allow to load directories --- .../main/java/jadx/api/JadxArgsValidator.java | 3 --- .../main/java/jadx/api/JadxDecompiler.java | 4 +++- .../main/java/jadx/api/ResourcesLoader.java | 2 +- .../java/jadx/core/utils/files/FileUtils.java | 21 +++++++++++++++++++ .../src/main/java/jadx/gui/ui/MainWindow.java | 1 + .../input/javaconvert/JavaConvertLoader.java | 3 --- .../plugins/input/smali/SmaliConvert.java | 6 ++---- 7 files changed, 28 insertions(+), 12 deletions(-) diff --git a/jadx-core/src/main/java/jadx/api/JadxArgsValidator.java b/jadx-core/src/main/java/jadx/api/JadxArgsValidator.java index eac2c28fc..8f01d97a5 100644 --- a/jadx-core/src/main/java/jadx/api/JadxArgsValidator.java +++ b/jadx-core/src/main/java/jadx/api/JadxArgsValidator.java @@ -85,9 +85,6 @@ public class JadxArgsValidator { if (!file.exists()) { throw new JadxArgsValidateException("File not found " + file.getAbsolutePath()); } - if (file.isDirectory()) { - throw new JadxArgsValidateException("Expected file but found directory instead: " + file.getAbsolutePath()); - } } private static void checkDir(File dir, String desc) { diff --git a/jadx-core/src/main/java/jadx/api/JadxDecompiler.java b/jadx-core/src/main/java/jadx/api/JadxDecompiler.java index bea1469de..dda47b6ef 100644 --- a/jadx-core/src/main/java/jadx/api/JadxDecompiler.java +++ b/jadx-core/src/main/java/jadx/api/JadxDecompiler.java @@ -40,6 +40,7 @@ import jadx.core.dex.visitors.SaveCode; import jadx.core.export.ExportGradleProject; import jadx.core.utils.Utils; import jadx.core.utils.exceptions.JadxRuntimeException; +import jadx.core.utils.files.FileUtils; import jadx.core.xmlgen.BinaryXMLParser; import jadx.core.xmlgen.ProtoXMLParser; import jadx.core.xmlgen.ResContainer; @@ -113,8 +114,9 @@ public final class JadxDecompiler implements Closeable { private void loadInputFiles() { loadedInputs.clear(); List inputPaths = Utils.collectionMap(args.getInputFiles(), File::toPath); + List inputFiles = FileUtils.expandDirs(inputPaths); for (JadxInputPlugin inputPlugin : pluginManager.getInputPlugins()) { - ILoadResult loadResult = inputPlugin.loadFiles(inputPaths); + ILoadResult loadResult = inputPlugin.loadFiles(inputFiles); if (loadResult != null && !loadResult.isEmpty()) { loadedInputs.add(loadResult); } diff --git a/jadx-core/src/main/java/jadx/api/ResourcesLoader.java b/jadx-core/src/main/java/jadx/api/ResourcesLoader.java index 3cbd7d4ce..5200ac521 100644 --- a/jadx-core/src/main/java/jadx/api/ResourcesLoader.java +++ b/jadx-core/src/main/java/jadx/api/ResourcesLoader.java @@ -136,7 +136,7 @@ public final class ResourcesLoader { } private void loadFile(List list, File file) { - if (file == null) { + if (file == null || file.isDirectory()) { return; } if (FileUtils.isZipFile(file)) { diff --git a/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java b/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java index 4d83857b1..1f38f47bd 100644 --- a/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java +++ b/jadx-core/src/main/java/jadx/core/utils/files/FileUtils.java @@ -8,6 +8,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.nio.file.FileVisitOption; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -41,6 +42,26 @@ public class FileUtils { private FileUtils() { } + public static List expandDirs(List paths) { + List files = new ArrayList<>(paths.size()); + for (Path path : paths) { + if (Files.isDirectory(path)) { + expandDir(path, files); + } else { + files.add(path); + } + } + return files; + } + + private static void expandDir(Path dir, List files) { + try (Stream walk = Files.walk(dir, FileVisitOption.FOLLOW_LINKS)) { + walk.filter(Files::isRegularFile).forEach(files::add); + } catch (Exception e) { + LOG.error("Failed to list files in directory: {}", dir, e); + } + } + public static void addFileToJar(JarOutputStream jar, File source, String entryName) throws IOException { try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(source))) { JarEntry entry = new JarEntry(entryName); diff --git a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java index ce2f4c58b..785e4e3db 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/MainWindow.java @@ -323,6 +323,7 @@ public class MainWindow extends JFrame { fileChooser.setFileFilter(new FileNameExtensionFilter(description, exts)); fileChooser.setMultiSelectionEnabled(true); fileChooser.setToolTipText(toolTipText); + fileChooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES); Path currentDirectory = settings.getLastOpenFilePath(); if (currentDirectory != null) { fileChooser.setCurrentDirectory(currentDirectory.toFile()); 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 288c7be8f..6635e63a3 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 @@ -36,7 +36,6 @@ public class JavaConvertLoader { private static void processJars(List input, ConvertResult result) { PathMatcher jarMatcher = FileSystems.getDefault().getPathMatcher("glob:**.jar"); input.stream() - .filter(path -> Files.isRegularFile(path, LinkOption.NOFOLLOW_LINKS)) .filter(jarMatcher::matches) .forEach(path -> { try { @@ -50,7 +49,6 @@ public class JavaConvertLoader { private static void processClassFiles(List input, ConvertResult result) { PathMatcher jarMatcher = FileSystems.getDefault().getPathMatcher("glob:**.class"); List clsFiles = input.stream() - .filter(path -> Files.isRegularFile(path, LinkOption.NOFOLLOW_LINKS)) .filter(jarMatcher::matches) .collect(Collectors.toList()); if (clsFiles.isEmpty()) { @@ -78,7 +76,6 @@ public class JavaConvertLoader { private static void processAars(List input, ConvertResult result) { PathMatcher aarMatcher = FileSystems.getDefault().getPathMatcher("glob:**.aar"); input.stream() - .filter(path -> Files.isRegularFile(path, LinkOption.NOFOLLOW_LINKS)) .filter(aarMatcher::matches) .forEach(path -> ZipSecurity.readZipEntries(path.toFile(), (entry, in) -> { try { diff --git a/jadx-plugins/jadx-smali-input/src/main/java/jadx/plugins/input/smali/SmaliConvert.java b/jadx-plugins/jadx-smali-input/src/main/java/jadx/plugins/input/smali/SmaliConvert.java index ccaa7747a..8fa62e18e 100644 --- a/jadx-plugins/jadx-smali-input/src/main/java/jadx/plugins/input/smali/SmaliConvert.java +++ b/jadx-plugins/jadx-smali-input/src/main/java/jadx/plugins/input/smali/SmaliConvert.java @@ -7,7 +7,6 @@ import java.io.OutputStream; import java.io.PrintStream; import java.nio.file.FileSystems; import java.nio.file.Files; -import java.nio.file.LinkOption; import java.nio.file.Path; import java.nio.file.PathMatcher; import java.util.Collections; @@ -32,10 +31,10 @@ public class SmaliConvert implements Closeable { if (smaliFiles.isEmpty()) { return false; } + LOG.debug("Compiling smali files: {}", smaliFiles.size()); try { this.tmpDex = Files.createTempFile("jadx-", ".dex"); - boolean result = compileSmali(tmpDex, smaliFiles); - if (result) { + if (compileSmali(tmpDex, smaliFiles)) { return true; } } catch (Exception e) { @@ -82,7 +81,6 @@ public class SmaliConvert implements Closeable { private List filterSmaliFiles(List input) { PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**.smali"); return input.stream() - .filter(p -> Files.isRegularFile(p, LinkOption.NOFOLLOW_LINKS)) .filter(matcher::matches) .collect(Collectors.toList()); }