From f43f411047fe55408ddfc4580f9b90fc6bb191d0 Mon Sep 17 00:00:00 2001 From: Ryan Kurtz Date: Thu, 9 Mar 2023 11:24:35 -0500 Subject: [PATCH] GP-3154: Updating Guava to 31.1-jre, and other dependent jars --- .../plugin/core/script/BundleHostTest.java | 2 +- Ghidra/Features/FileFormats/Module.manifest | 16 ++--- Ghidra/Features/FileFormats/build.gradle | 25 ++++--- .../android/dex/DexToSmaliFileSystem.java | 63 +++++++---------- Ghidra/Framework/Generic/Module.manifest | 3 +- Ghidra/Framework/Generic/build.gradle | 3 +- .../Framework/Generic/certification.manifest | 67 ------------------- .../src/main/java/ghidra/GhidraLauncher.java | 4 ++ gradle/support/fetchDependencies.gradle | 10 +-- 9 files changed, 61 insertions(+), 132 deletions(-) diff --git a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/script/BundleHostTest.java b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/script/BundleHostTest.java index 9e7a070568..4fe9671132 100644 --- a/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/script/BundleHostTest.java +++ b/Ghidra/Features/Base/src/test.slow/java/ghidra/app/plugin/core/script/BundleHostTest.java @@ -36,7 +36,7 @@ public class BundleHostTest extends AbstractGhidraHeadlessIntegrationTest { private static final String TEMP_NAME_PREFIX = "sourcebundle"; // the version of Guava Ghidra is currently using. - private static final int GUAVA_MAJOR_VERSION = 19; + private static final int GUAVA_MAJOR_VERSION = 31; private BundleHost bundleHost; private CapturingBundleHostListener capturingBundleHostListener; diff --git a/Ghidra/Features/FileFormats/Module.manifest b/Ghidra/Features/FileFormats/Module.manifest index d321911f64..c6b8d5346d 100644 --- a/Ghidra/Features/FileFormats/Module.manifest +++ b/Ghidra/Features/FileFormats/Module.manifest @@ -1,12 +1,12 @@ -MODULE FILE LICENSE: lib/dex-ir-2.0.jar Apache License 2.0 -MODULE FILE LICENSE: lib/dexlib-1.4.0.jar Apache License 2.0 -MODULE FILE LICENSE: lib/dex-reader-2.0.jar Apache License 2.0 -MODULE FILE LICENSE: lib/dex-reader-api-2.0.jar Apache License 2.0 -MODULE FILE LICENSE: lib/dex-translator-2.0.jar Apache License 2.0 -MODULE FILE LICENSE: lib/asm-debug-all-4.1.jar INRIA License -MODULE FILE LICENSE: lib/baksmali-1.4.0.jar BSD-3-GRUVER +MODULE FILE LICENSE: lib/dex-ir-2.1.jar Apache License 2.0 +MODULE FILE LICENSE: lib/dex-reader-2.1.jar Apache License 2.0 +MODULE FILE LICENSE: lib/dex-reader-api-2.1.jar Apache License 2.0 +MODULE FILE LICENSE: lib/dex-translator-2.1.jar Apache License 2.0 +MODULE FILE LICENSE: lib/asm-debug-all-5.0.3.jar INRIA License +MODULE FILE LICENSE: lib/baksmali-2.5.2.jar BSD-3-GRUVER +MODULE FILE LICENSE: lib/dexlib2-2.5.2.jar BSD-3-GRUVER +MODULE FILE LICENSE: lib/util-2.5.2.jar BSD-3-GRUVER MODULE FILE LICENSE: lib/sevenzipjbinding-16.02-2.01.jar LGPL 2.1 MODULE FILE LICENSE: lib/sevenzipjbinding-all-platforms-16.02-2.01.jar LGPL 2.1 MODULE FILE LICENSE: lib/AXMLPrinter2.jar Apache License 2.0 -MODULE FILE LICENSE: lib/util-1.4.0.jar BSD-3-GRUVER diff --git a/Ghidra/Features/FileFormats/build.gradle b/Ghidra/Features/FileFormats/build.gradle index d80fc45184..d08615ec53 100644 --- a/Ghidra/Features/FileFormats/build.gradle +++ b/Ghidra/Features/FileFormats/build.gradle @@ -28,20 +28,23 @@ dependencies { api project(':Recognizers') api project(':PDB') - api ':dex-ir:2.0' - api ':dex-reader:2.0' - api ':dex-reader-api:2.0' - api ':dex-translator:2.0' + // Used by "Android DEX to JAR" file system + api ':dex-ir:2.1' + api ':dex-reader:2.1' + api ':dex-reader-api:2.1' + api ':dex-translator:2.1' + api 'org.ow2.asm:asm-debug-all:5.0.3' - api 'org.ow2.asm:asm-debug-all:4.1' + // Used by "Android DEX to SMALI" file system + api 'org.smali:baksmali:2.5.2' // requires guava-27.1-android or later + api 'org.smali:dexlib2:2.5.2' // requires guava-27.1-android or later + api 'org.smali:util:2.5.2' // requires guava-27.1-android or later - api 'org.smali:baksmali:1.4.0' // TODO: upgrade to 2.2.6 - api 'org.smali:dexlib:1.4.0' - api 'org.smali:util:1.4.0' - - api 'net.sf.sevenzipjbinding:sevenzipjbinding:16.02-2.01' + // Used by "Android XML" file system api ':AXMLPrinter2' - + + // Used by "ZIP" and "7zip" file systems + api 'net.sf.sevenzipjbinding:sevenzipjbinding:16.02-2.01' runtimeOnly 'net.sf.sevenzipjbinding:sevenzipjbinding-all-platforms:16.02-2.01' helpPath project(path: ":Base", configuration: 'helpPath') diff --git a/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/android/dex/DexToSmaliFileSystem.java b/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/android/dex/DexToSmaliFileSystem.java index e3e167c04a..b01ad19280 100644 --- a/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/android/dex/DexToSmaliFileSystem.java +++ b/Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/android/dex/DexToSmaliFileSystem.java @@ -22,8 +22,11 @@ import java.util.*; import org.apache.commons.io.FileUtils; import org.apache.commons.io.filefilter.TrueFileFilter; -import org.jf.baksmali.baksmali; -import org.jf.dexlib.DexFile; +import org.jf.baksmali.Baksmali; +import org.jf.baksmali.BaksmaliOptions; +import org.jf.dexlib2.Opcodes; +import org.jf.dexlib2.dexbacked.DexBackedDexFile; +import org.jf.dexlib2.iface.DexFile; import ghidra.app.util.bin.ByteProvider; import ghidra.app.util.bin.FileByteProvider; @@ -31,6 +34,7 @@ import ghidra.file.formats.android.dex.format.DexConstants; import ghidra.formats.gfilesystem.*; import ghidra.formats.gfilesystem.annotations.FileSystemInfo; import ghidra.formats.gfilesystem.factory.GFileSystemBaseFactory; +import ghidra.framework.Application; import ghidra.util.exception.CancelledException; import ghidra.util.exception.CryptoException; import ghidra.util.task.TaskMonitor; @@ -85,48 +89,31 @@ public class DexToSmaliFileSystem extends GFileSystemBase { public void open(TaskMonitor monitor) throws IOException, CryptoException, CancelledException { monitor.setMessage("Converting DEX to SMALI..."); - File dexFileFile = provider.getFile(); - boolean isFixRegisters = false; - boolean isNoParameterRegisters = false; - boolean isUseLocalsDirective = false; - boolean isUseSequentialLabels = false; - boolean isOutputDebugInfo = true; - boolean isAddCodeOffsets = false; - boolean isDeOdex = false;//TODO DexConstants.isODEX( provider ); - boolean isVerify = false; - boolean isIgnoreErrors = false; - int registerInfo = 0; - boolean isNoAccessorComments = false;//TODO - String inlineTable = null;//TODO - boolean isCheckPackagePrivateAccess = false; - - final String baseTempPath = System.getProperty("java.io.tmpdir"); int rand = new Random().nextInt() & 0xffff; - File tempOutputDirectory = - new File(baseTempPath + File.separator + "ghidra_file_system_" + rand); + File outputDir = new File(Application.getUserTempDirectory(), "ghidra_file_system_" + rand); - String bootClassPath = "core.jar:ext.jar:framework.jar:android.policy.jar:services.jar"; - StringBuffer extraBootClassPathEntries = new StringBuffer(); + DexFile dexFile = + DexBackedDexFile.fromInputStream(Opcodes.getDefault(), provider.getInputStream(0)); - List bootClassPathDirs = new ArrayList<>(); - bootClassPathDirs.add("."); -//TODO bootClassPathDirs.add( "~/Android/smali/required-libs/" ); + BaksmaliOptions options = new BaksmaliOptions(); + options.apiLevel = 15; + options.parameterRegisters = true; + options.localsDirective = false; + options.sequentialLabels = false; + options.debugInfo = true; + options.codeOffsets = false; + options.accessorComments = true; + options.allowOdex = false; + options.deodex = false; + options.implicitReferences = false; + options.normalizeVirtualMethods = false; + options.registerInfo = 0; - DexFile dexFile = new DexFile(dexFileFile, !isFixRegisters, false); - - String[] bootClassPathDirsArray = new String[bootClassPathDirs.size()]; - for (int i = 0; i < bootClassPathDirsArray.length; i++) { - bootClassPathDirsArray[i] = bootClassPathDirs.get(i); + if (!Baksmali.disassembleDexFile(dexFile, outputDir, 1, options)) { + throw new IOException("Failed to disassemble DEX file: " + provider.getName()); } - baksmali.disassembleDexFile(dexFileFile.getPath(), dexFile, isDeOdex, - tempOutputDirectory.getPath(), bootClassPathDirsArray, bootClassPath, - extraBootClassPathEntries.toString(), isNoParameterRegisters, isUseLocalsDirective, - isUseSequentialLabels, isOutputDebugInfo, isAddCodeOffsets, isNoAccessorComments, - registerInfo, isVerify, isIgnoreErrors, inlineTable, isCheckPackagePrivateAccess); - - getFileListing(tempOutputDirectory, root, monitor); - + getFileListing(outputDir, root, monitor); } private void getFileListing(File startingDirectory, GFileImpl currentRoot, diff --git a/Ghidra/Framework/Generic/Module.manifest b/Ghidra/Framework/Generic/Module.manifest index 830f7b173e..a10b5fa3d0 100644 --- a/Ghidra/Framework/Generic/Module.manifest +++ b/Ghidra/Framework/Generic/Module.manifest @@ -1,4 +1,5 @@ -MODULE FILE LICENSE: lib/guava-19.0.jar Apache License 2.0 +MODULE FILE LICENSE: lib/guava-31.1-jre.jar Apache License 2.0 +MODULE FILE LICENSE: lib/failureaccess-1.0.1.jar Apache License 2.0 MODULE FILE LICENSE: lib/jdom-legacy-1.1.3.jar JDOM License MODULE FILE LICENSE: lib/log4j-api-2.17.1.jar Apache License 2.0 MODULE FILE LICENSE: lib/log4j-core-2.17.1.jar Apache License 2.0 diff --git a/Ghidra/Framework/Generic/build.gradle b/Ghidra/Framework/Generic/build.gradle index c470719743..2b2022a9a2 100644 --- a/Ghidra/Framework/Generic/build.gradle +++ b/Ghidra/Framework/Generic/build.gradle @@ -26,7 +26,8 @@ eclipse.project.name = 'Framework Generic' dependencies { api project(':Utility') - api "com.google.guava:guava:19.0" + api "com.google.guava:guava:31.1-jre" + api 'com.google.guava:failureaccess:1.0.1' api "org.jdom:jdom-legacy:1.1.3" api "org.apache.logging.log4j:log4j-api:2.17.1" api "org.apache.logging.log4j:log4j-core:2.17.1" diff --git a/Ghidra/Framework/Generic/certification.manifest b/Ghidra/Framework/Generic/certification.manifest index 7369bdae92..6f5194ad66 100644 --- a/Ghidra/Framework/Generic/certification.manifest +++ b/Ghidra/Framework/Generic/certification.manifest @@ -13,82 +13,15 @@ .gitignore||GHIDRA||||END| Module.manifest||GHIDRA||||END| data/ExtensionPoint.manifest||GHIDRA||||END| -data/generic.theme.properties||GHIDRA||||END| -src/main/java/ghidra/framework/options/package.html||GHIDRA||||END| src/main/java/ghidra/util/datastruct/package.html||GHIDRA||||END| src/main/java/ghidra/util/graph/attributes/package.html||GHIDRA||||END| src/main/java/ghidra/util/graph/package.html||GHIDRA||||END| -src/main/java/ghidra/util/layout/package.html||GHIDRA||||END| src/main/java/ghidra/util/map/package.html||GHIDRA||||END| src/main/java/ghidra/util/xml/package.html||GHIDRA||||END| src/main/resources/generic.log4j.xml||GHIDRA||||END| src/main/resources/generic.log4jdev.xml||GHIDRA||||END| src/main/resources/generic.log4jfile.xml||GHIDRA||||END| src/main/resources/generic.log4jtest.xml||GHIDRA||||END| -src/main/resources/images/EmptyIcon.gif||GHIDRA||||END| -src/main/resources/images/EmptyIcon16.gif||GHIDRA||||END| -src/main/resources/images/GhidraIcon128.png||GHIDRA||||END| -src/main/resources/images/GhidraIcon16.png||GHIDRA||||END| -src/main/resources/images/GhidraIcon24.png||GHIDRA||||END| -src/main/resources/images/GhidraIcon256.png||GHIDRA||||END| -src/main/resources/images/GhidraIcon32.png||GHIDRA||||END| -src/main/resources/images/GhidraIcon40.png||GHIDRA||||END| -src/main/resources/images/GhidraIcon48.png||GHIDRA||||END| -src/main/resources/images/GhidraIcon64.png||GHIDRA||||END| -src/main/resources/images/Plus2.png||GHIDRA||||END| -src/main/resources/images/applications-multimedia16.png||Tango Icons - Public Domain|||tango|END| -src/main/resources/images/checkmark_green.gif||GHIDRA||||END| -src/main/resources/images/closedSmallFolder.png||Modified Nuvola Icons - LGPL 2.1||||END| -src/main/resources/images/collapse_all.png||GHIDRA||||END| -src/main/resources/images/core.png||Nuvola Icons - LGPL 2.1|||Nuvola icon set|END| -src/main/resources/images/core24.png||Nuvola Icons - LGPL 2.1|||Nuvola icon set|END| -src/main/resources/images/dialog-cancel.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| -src/main/resources/images/disk.png||FAMFAMFAM Icons - CC 2.5|||famfamfam silk icon set|END| -src/main/resources/images/disk_save_as.png||FAMFAMFAM Icons - CC 2.5||||END| -src/main/resources/images/down.png||GHIDRA||||END| -src/main/resources/images/dragon16.gif||GHIDRA||||END| -src/main/resources/images/edit-cut.png||Tango Icons - Public Domain|||tango icon set|END| -src/main/resources/images/edit-cut22.png||Tango Icons - Public Domain|||tango icon set|END| -src/main/resources/images/edit-delete.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| -src/main/resources/images/emblem-important.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| -src/main/resources/images/erase16.png||GHIDRA||||END| -src/main/resources/images/error.png||Nuvola Icons - LGPL 2.1|||Nuvola icon set|END| -src/main/resources/images/exec.png||Crystal Clear Icons - LGPL 2.1||||END| -src/main/resources/images/expand_all.png||GHIDRA||||END| -src/main/resources/images/flag.png||Oxygen Icons - LGPL 3.0|||Oxygen icon theme (dual license; LGPL or CC-SA-3.0)|END| -src/main/resources/images/go-home.png||Tango Icons - Public Domain|||tango icon set|END| -src/main/resources/images/greenDragon16.png||GHIDRA||||END| -src/main/resources/images/greenDragon24.png||GHIDRA||||END| -src/main/resources/images/help-browser.png||Tango Icons - Public Domain|||tango icon set|END| -src/main/resources/images/information.png||FAMFAMFAM Icons - CC 2.5|||famfamfam silk icon set|END| -src/main/resources/images/internet-web-browser16.png||Tango Icons - Public Domain|||originally internet-web-browser.png from tango|END| -src/main/resources/images/kgpg.png||Nuvola Icons - LGPL 2.1|||Nuvola icon set|END| -src/main/resources/images/left.alternate.png||GHIDRA||||END| -src/main/resources/images/left.png||GHIDRA||||END| -src/main/resources/images/locationIn.gif||GHIDRA||||END| -src/main/resources/images/locationOut.gif||GHIDRA||||END| -src/main/resources/images/mergemgr16.gif||GHIDRA||||END| -src/main/resources/images/network-receive16.png||Tango Icons - Public Domain|||originally network-receive.png from tango|END| -src/main/resources/images/openFolder.png||Modified Nuvola Icons - LGPL 2.1||||END| -src/main/resources/images/openSmallFolder.png||Modified Nuvola Icons - LGPL 2.1||||END| -src/main/resources/images/page_paste.png||FAMFAMFAM Icons - CC 2.5|||famfamfam silk icon set|END| -src/main/resources/images/page_white_copy.png||FAMFAMFAM Icons - CC 2.5|||famfamfam silk icon set|END| -src/main/resources/images/process-stop.png||Tango Icons - Public Domain|||Theirs: Oxygen icon theme (dual license; LGPL or CC-SA-3.0)tango icon set|END| -src/main/resources/images/program_obj.png||GHIDRA|||Custom Icon|END| -src/main/resources/images/redDragon16.png||GHIDRA|||Renamed GIF version of redDragon16.png|END| -src/main/resources/images/redDragon24.png||GHIDRA||||END| -src/main/resources/images/redDragon32.png||GHIDRA||||END| -src/main/resources/images/reload3.png||Crystal Clear Icons - LGPL 2.1||||END| -src/main/resources/images/right.alternate.png||GHIDRA||||END| -src/main/resources/images/right.png||GHIDRA||||END| -src/main/resources/images/software-update-urgent.png||Tango Icons - Public Domain|||tango icon set|END| -src/main/resources/images/sortascending.png||GHIDRA||||END| -src/main/resources/images/sortdescending.png||GHIDRA||||END| -src/main/resources/images/text_align_justify.png||FAMFAMFAM Icons - CC 2.5|||famfamfam silk icon set|END| -src/main/resources/images/up.png||GHIDRA||||END| -src/main/resources/images/video-x-generic16.png||Tango Icons - Public Domain|||tango|END| -src/main/resources/images/viewmagfit.png||Nuvola Icons - LGPL 2.1|||Nuvola icon set|END| -src/main/resources/images/warning.png||FAMFAMFAM Icons - CC 2.5|||famfamfam silk icon set|END| src/main/resources/log4j-appender-console-with-links.xml||GHIDRA||||END| src/main/resources/log4j-appender-console.xml||GHIDRA||||END| src/main/resources/log4j-appender-logpanel.xml||GHIDRA||||END| diff --git a/Ghidra/Framework/Utility/src/main/java/ghidra/GhidraLauncher.java b/Ghidra/Framework/Utility/src/main/java/ghidra/GhidraLauncher.java index 4e753e4911..3da7eb087e 100644 --- a/Ghidra/Framework/Utility/src/main/java/ghidra/GhidraLauncher.java +++ b/Ghidra/Framework/Utility/src/main/java/ghidra/GhidraLauncher.java @@ -238,6 +238,10 @@ public class GhidraLauncher { String path = line.trim(); if (!path.startsWith("Module:") && path.endsWith(".jar")) { ResourceFile jarFile = new ResourceFile(path); + if (path.startsWith("#") || path.startsWith("//")) { + System.err.println("Skipping jar file: " + jarFile); + continue; + } if (!jarFile.isFile()) { System.err.println("Failed to find required jar file: " + jarFile); continue; diff --git a/gradle/support/fetchDependencies.gradle b/gradle/support/fetchDependencies.gradle index 29b360d569..d5e88ca45c 100644 --- a/gradle/support/fetchDependencies.gradle +++ b/gradle/support/fetchDependencies.gradle @@ -59,12 +59,12 @@ file("${REPO_DIR}/Ghidra/application.properties").withReader { reader -> ext.deps = [ [ - name: "dex-tools-2.0.zip", - url: "https://github.com/pxb1988/dex2jar/releases/download/2.0/dex-tools-2.0.zip", - sha256: "7907eb4d6e9280b6e17ddce7ee0507eae2ef161ee29f70a10dbc6944fdca75bc", + name: "dex2jar-2.1.zip", + url: "https://github.com/pxb1988/dex2jar/releases/download/v2.1/dex2jar-2.1.zip", + sha256: "7a9bdf843d43de4d1e94ec2e7b6f55825017b0c4a7ee39ff82660e2493a46f08", destination: { - unzip(DOWNLOADS_DIR, DOWNLOADS_DIR, "dex-tools-2.0.zip") - FileUtils.copyDirectory(new File(DOWNLOADS_DIR, "dex2jar-2.0/lib/"), FLAT_REPO_DIR, new WildcardFileFilter("dex-*")); + unzip(DOWNLOADS_DIR, DOWNLOADS_DIR, "dex2jar-2.1.zip") + FileUtils.copyDirectory(new File(DOWNLOADS_DIR, "dex-tools-2.1/lib/"), FLAT_REPO_DIR, new WildcardFileFilter("dex-*")); } ], [