skylot / jadx

Dex to Java decompiler
Apache License 2.0
41.46k stars 4.86k forks source link

Bug: Crash when the path contains a folder named ! #1316

Open meir555 opened 2 years ago

meir555 commented 2 years ago

OS: Windows 10 Steps to reproduce:

  1. Download jadx-gui for windows
  2. Move the files to a folder named ! (for instance: C:\temp!\jadx-gui-1.3.1-no-jre-win.exe)
  3. Run jadx-gui
  4. The program does not start.

Diagnosis of the problem: Using Procmon I see that jadx-gui starts the process: "C:\Program Files\Java\jdk-17.0.1\bin\javaw.exe" -Xms328m -Xmx4601m -Dawt.useSystemAAFontSettings=lcd -Dswing.aatext=true -XX:+UseG1GC -classpath "C:\Temp\!\jadx-gui-1.3.1-no-jre-win.exe;lib\jadx-gui-1.3.1-all.jar" jadx.gui.JadxGUI

If I replace javaw.exe with java.exe and run in CMD, I get the error log:

C:\>"C:\Program Files\Java\jdk-17.0.1\bin\java.exe" -Xms328m -Xmx4601m -Dawt.useSystemAAFontSettings=lcd -Dswing.aatext=true -XX:+UseG1GC -classpath "C:\Temp\!\jadx-gui-1.3.1-no-jre-win.exe;lib\jadx-gui-1.3.1-all.jar" jadx.gui.JadxGUI
Failed to auto configure default logger context
Reported exception:
ch.qos.logback.core.joran.spi.JoranException: Could not open URL [jar:file:/C:/Temp/!/jadx-gui-1.3.1-no-jre-win.exe!/logback.xml].
        at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:57)
        at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)
        at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)
        at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
        at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
        at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
        at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
        at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:417)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:362)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:388)
        at jadx.gui.JadxGUI.<clinit>(JadxGUI.java:18)
Caused by: java.io.FileNotFoundException: C:\Temp (Access is denied)
        at java.base/java.io.RandomAccessFile.open0(Native Method)
        at java.base/java.io.RandomAccessFile.open(RandomAccessFile.java:344)
        at java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:259)
        at java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:213)
        at java.base/java.util.zip.ZipFile$Source.<init>(ZipFile.java:1312)
        at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1277)
        at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:709)
        at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:243)
        at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:172)
        at java.base/java.util.jar.JarFile.<init>(JarFile.java:347)
        at java.base/sun.net.www.protocol.jar.URLJarFile.<init>(URLJarFile.java:103)
        at java.base/sun.net.www.protocol.jar.URLJarFile.getJarFile(URLJarFile.java:72)
        at java.base/sun.net.www.protocol.jar.JarFileFactory.get(JarFileFactory.java:191)
        at java.base/sun.net.www.protocol.jar.JarFileFactory.getOrCreate(JarFileFactory.java:91)
        at java.base/sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:132)
        at java.base/sun.net.www.protocol.jar.JarURLConnection.getInputStream(JarURLConnection.java:175)
        at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:52)
        ... 10 more
15:13:15,892 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
15:13:15,893 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
15:13:15,893 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [jar:file:/C:/Temp/!/jadx-gui-1.3.1-no-jre-win.exe!/logback.xml]
15:13:15,902 |-INFO in ch.qos.logback.core.joran.spi.ConfigurationWatchList@470e2030 - URL [jar:file:/C:/Temp/!/jadx-gui-1.3.1-no-jre-win.exe!/logback.xml] is not of type file
15:13:15,903 |-ERROR in ch.qos.logback.classic.joran.JoranConfigurator@3fb4f649 - Could not open URL [jar:file:/C:/Temp/!/jadx-gui-1.3.1-no-jre-win.exe!/logback.xml]. java.io.FileNotFoundException: C:\Temp (Access is denied)
        at java.io.FileNotFoundException: C:\Temp (Access is denied)
        at      at java.base/java.io.RandomAccessFile.open0(Native Method)
        at      at java.base/java.io.RandomAccessFile.open(RandomAccessFile.java:344)
        at      at java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:259)
        at      at java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:213)
        at      at java.base/java.util.zip.ZipFile$Source.<init>(ZipFile.java:1312)
        at      at java.base/java.util.zip.ZipFile$Source.get(ZipFile.java:1277)
        at      at java.base/java.util.zip.ZipFile$CleanableResource.<init>(ZipFile.java:709)
        at      at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:243)
        at      at java.base/java.util.zip.ZipFile.<init>(ZipFile.java:172)
        at      at java.base/java.util.jar.JarFile.<init>(JarFile.java:347)
        at      at java.base/sun.net.www.protocol.jar.URLJarFile.<init>(URLJarFile.java:103)
        at      at java.base/sun.net.www.protocol.jar.URLJarFile.getJarFile(URLJarFile.java:72)
        at      at java.base/sun.net.www.protocol.jar.JarFileFactory.get(JarFileFactory.java:191)
        at      at java.base/sun.net.www.protocol.jar.JarFileFactory.getOrCreate(JarFileFactory.java:91)
        at      at java.base/sun.net.www.protocol.jar.JarURLConnection.connect(JarURLConnection.java:132)
        at      at java.base/sun.net.www.protocol.jar.JarURLConnection.getInputStream(JarURLConnection.java:175)
        at      at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:52)
        at      at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)
        at      at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:150)
        at      at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:84)
        at      at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
        at      at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
        at      at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
        at      at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:417)
        at      at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:362)
        at      at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:388)
        at      at jadx.gui.JadxGUI.<clinit>(JadxGUI.java:18)

Exception in thread "main" java.lang.ExceptionInInitializerError
        at org.fife.ui.rsyntaxtextarea.RSyntaxTextAreaUI.<clinit>(RSyntaxTextAreaUI.java:43)
        at org.fife.ui.rsyntaxtextarea.RSyntaxTextArea.createRTextAreaUI(RSyntaxTextArea.java:801)
        at org.fife.ui.rtextarea.RTextAreaBase.init(RTextAreaBase.java:656)
        at org.fife.ui.rtextarea.RTextArea.init(RTextArea.java:886)
        at org.fife.ui.rsyntaxtextarea.RSyntaxTextArea.init(RSyntaxTextArea.java:1996)
        at org.fife.ui.rtextarea.RTextAreaBase.<init>(RTextAreaBase.java:82)
        at org.fife.ui.rtextarea.RTextArea.<init>(RTextArea.java:181)
        at org.fife.ui.rsyntaxtextarea.RSyntaxTextArea.<init>(RSyntaxTextArea.java:341)
        at jadx.gui.settings.JadxSettings.<clinit>(JadxSettings.java:48)
        at jadx.gui.settings.JadxSettingsAdapter$1.shouldSkipField(JadxSettingsAdapter.java:37)
        at com.google.gson.internal.Excluder.excludeField(Excluder.java:184)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.excludeField(ReflectiveTypeAdapterFactory.java:69)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.excludeField(ReflectiveTypeAdapterFactory.java:65)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:154)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
        at com.google.gson.Gson.getAdapter(Gson.java:489)
        at com.google.gson.Gson.fromJson(Gson.java:962)
        at com.google.gson.Gson.fromJson(Gson.java:928)
        at com.google.gson.Gson.fromJson(Gson.java:877)
        at com.google.gson.Gson.fromJson(Gson.java:848)
        at jadx.gui.settings.JadxSettingsAdapter.fromString(JadxSettingsAdapter.java:86)
        at jadx.gui.settings.JadxSettingsAdapter.load(JadxSettingsAdapter.java:61)
        at jadx.gui.JadxGUI.main(JadxGUI.java:23)
Caused by: java.util.MissingResourceException: Can't find bundle for base name org.fife.ui.rsyntaxtextarea.RSyntaxTextArea, locale en_US
        at java.base/java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:2045)
        at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1683)
        at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1586)
        at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1549)
        at java.base/java.util.ResourceBundle.getBundle(ResourceBundle.java:858)
        at org.fife.ui.rsyntaxtextarea.RSyntaxTextAreaEditorKit.<clinit>(RSyntaxTextAreaEditorKit.java:90)
        ... 23 more
Caused by: java.lang.ClassCastException: org.fife.ui.rsyntaxtextarea.RSyntaxTextArea cannot be cast to ResourceBundle
        at java.base/java.util.ResourceBundle$Control.newBundle0(ResourceBundle.java:3211)
        at java.base/java.util.ResourceBundle$Control.newBundle(ResourceBundle.java:3151)
        at java.base/java.util.ResourceBundle.loadBundle(ResourceBundle.java:1984)
        at java.base/java.util.ResourceBundle.findBundle(ResourceBundle.java:1770)
        at java.base/java.util.ResourceBundle.findBundle(ResourceBundle.java:1722)
        at java.base/java.util.ResourceBundle.findBundle(ResourceBundle.java:1722)
        at java.base/java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1656)
        ... 27 more
skylot commented 2 years ago

@meir555 looks like this is a known and very old java issue: https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4730642

The '!' in the directory name is interfering with the syntax of a jar url. According to the specification for Jar URLs found in java.net.JarURLConnection, "!/" should be recognized as the separator for a jar entry

So only solution is to not use path with directory ends with !. Best I can do is to add additional check and print error message to notice user about that issue.