Skip to content

Commit

Permalink
feat: add options to configure "renaming" (#570) (PR #582)
Browse files Browse the repository at this point in the history
  • Loading branch information
asashour authored and skylot committed Apr 12, 2019
1 parent a1bfdc6 commit 74a72a5
Show file tree
Hide file tree
Showing 10 changed files with 309 additions and 47 deletions.
89 changes: 86 additions & 3 deletions jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
package jadx.cli;

import java.util.ArrayList;
import java.util.EnumSet;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.stream.Collectors;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import com.beust.jcommander.Parameter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.beust.jcommander.IStringConverter;
import com.beust.jcommander.Parameter;

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.Appender;
import jadx.api.JadxArgs;
import jadx.api.JadxArgs.RENAME;
import jadx.api.JadxDecompiler;
import jadx.core.utils.exceptions.JadxException;
import jadx.core.utils.files.FileUtils;
Expand Down Expand Up @@ -83,6 +90,10 @@ public class JadxCLIArgs {
@Parameter(names = {"-f", "--fallback"}, description = "make simple dump (using goto instead of 'if', 'for', etc)")
protected boolean fallbackMode = false;

@Parameter(names = {"--rename-flags"}, description = "what to rename, comma-separated, 'case' for system case sensitivity, 'valid' for java identifiers, 'printable' characters, 'none' or 'all'",
converter = RenameConverter.class)
protected Set<RENAME> renameFlags = EnumSet.allOf(RENAME.class);

@Parameter(names = {"-v", "--verbose"}, description = "verbose output")
protected boolean verbose = false;

Expand Down Expand Up @@ -164,6 +175,9 @@ public JadxArgs toJadxArgs() {
args.setExportAsGradleProject(exportAsGradleProject);
args.setUseImports(useImports);
args.setDebugInfo(debugInfo);
args.setRenameCaseSensitive(isRenameCaseSensitive());
args.setRenameValid(isRenameValid());
args.setRenamePrintable(isRenamePrintable());
return args;
}

Expand Down Expand Up @@ -254,4 +268,73 @@ public boolean isRespectBytecodeAccessModifiers() {
public boolean isExportAsGradleProject() {
return exportAsGradleProject;
}

public boolean isRenameCaseSensitive() {
return renameFlags.contains(RENAME.CASE);
}

public void setRenameCaseSensitive(boolean renameCase) {
if (renameCase && !isRenameCaseSensitive()) {
renameFlags.add(RENAME.CASE);
} else if (!renameCase && isRenameCaseSensitive()) {
renameFlags.remove(RENAME.CASE);
}
}

public boolean isRenameValid() {
return renameFlags.contains(RENAME.VALID);
}

public void setRenameValid(boolean renameValid) {
if (renameValid && !isRenameValid()) {
renameFlags.add(RENAME.VALID);
} else if (!renameValid && isRenameValid()) {
renameFlags.remove(RENAME.VALID);
}
}

public boolean isRenamePrintable() {
return renameFlags.contains(RENAME.PRINTABLE);
}

public void setRenamePrintable(boolean renamePrintable) {
if (renamePrintable && !isRenamePrintable()) {
renameFlags.add(RENAME.PRINTABLE);
} else if (!renamePrintable && isRenamePrintable()) {
renameFlags.remove(RENAME.PRINTABLE);
}
}

static class RenameConverter implements IStringConverter<Set<RENAME>> {

private final String paramName;

RenameConverter(String paramName) {
this.paramName = paramName;
}

@Override
public Set<RENAME> convert(String value) {
Set<RENAME> set = new HashSet<>();
if (value.equalsIgnoreCase("ALL")) {
set.add(RENAME.CASE);
set.add(RENAME.VALID);
set.add(RENAME.PRINTABLE);
} else if (!value.equalsIgnoreCase("NONE")) {
for (String s : value.split(",")) {
try {
set.add(RENAME.valueOf(s.toUpperCase(Locale.ROOT)));
} catch (IllegalArgumentException e) {
String values = "'" + RENAME.CASE
+ "', '" + RENAME.VALID
+ "' and '" + RENAME.PRINTABLE + '\'';
throw new IllegalArgumentException(
s + " is unknown for parameter " + paramName
+ ", possible values are " + values.toLowerCase(Locale.ROOT));
}
}
}
return set;
}
}
}
49 changes: 49 additions & 0 deletions jadx-cli/src/test/java/jadx/cli/RenameConverterTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package jadx.cli;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.Set;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import jadx.api.JadxArgs.RENAME;
import jadx.cli.JadxCLIArgs.RenameConverter;

public class RenameConverterTest {

private RenameConverter converter;

@BeforeEach
public void init() {
converter = new RenameConverter("someParam");
}

@Test
public void all() {
Set<RENAME> set = converter.convert("all");
assertEquals(3, set.size());
assertTrue(set.contains(RENAME.CASE));
assertTrue(set.contains(RENAME.VALID));
assertTrue(set.contains(RENAME.PRINTABLE));
}

@Test
public void none() {
Set<RENAME> set = converter.convert("none");
assertTrue(set.isEmpty());
}

@Test
public void wrong() {
IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class,
() -> converter.convert("wrong"),
"Expected convert() to throw, but it didn't");

assertEquals("wrong is unknown for parameter someParam, "
+ "possible values are 'case', 'valid' and 'printable'",
thrown.getMessage());
}
}
82 changes: 63 additions & 19 deletions jadx-core/src/main/java/jadx/api/JadxArgs.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;

public class JadxArgs {

Expand All @@ -30,11 +32,11 @@ public class JadxArgs {
private boolean useImports = true;
private boolean debugInfo = true;

private boolean isSkipResources = false;
private boolean isSkipSources = false;
private boolean skipResources = false;
private boolean skipSources = false;

private boolean isDeobfuscationOn = false;
private boolean isDeobfuscationForceSave = false;
private boolean deobfuscationOn = false;
private boolean deobfuscationForceSave = false;
private boolean useSourceNameAsClassAlias = false;

private int deobfuscationMinLength = 0;
Expand All @@ -45,7 +47,11 @@ public class JadxArgs {
private boolean respectBytecodeAccModifiers = false;
private boolean exportAsGradleProject = false;

private boolean isFsCaseSensitive;
private boolean fsCaseSensitive;

public enum RENAME {CASE, VALID, PRINTABLE}

private Set<RENAME> renameFlags = EnumSet.allOf(RENAME.class);

public JadxArgs() {
// use default options
Expand Down Expand Up @@ -150,35 +156,35 @@ public void setDebugInfo(boolean debugInfo) {
}

public boolean isSkipResources() {
return isSkipResources;
return skipResources;
}

public void setSkipResources(boolean skipResources) {
isSkipResources = skipResources;
this.skipResources = skipResources;
}

public boolean isSkipSources() {
return isSkipSources;
return skipSources;
}

public void setSkipSources(boolean skipSources) {
isSkipSources = skipSources;
this.skipSources = skipSources;
}

public boolean isDeobfuscationOn() {
return isDeobfuscationOn;
return deobfuscationOn;
}

public void setDeobfuscationOn(boolean deobfuscationOn) {
isDeobfuscationOn = deobfuscationOn;
this.deobfuscationOn = deobfuscationOn;
}

public boolean isDeobfuscationForceSave() {
return isDeobfuscationForceSave;
return deobfuscationForceSave;
}

public void setDeobfuscationForceSave(boolean deobfuscationForceSave) {
isDeobfuscationForceSave = deobfuscationForceSave;
this.deobfuscationForceSave = deobfuscationForceSave;
}

public boolean isUseSourceNameAsClassAlias() {
Expand Down Expand Up @@ -238,11 +244,47 @@ public void setExportAsGradleProject(boolean exportAsGradleProject) {
}

public boolean isFsCaseSensitive() {
return isFsCaseSensitive;
return fsCaseSensitive;
}

public void setFsCaseSensitive(boolean fsCaseSensitive) {
isFsCaseSensitive = fsCaseSensitive;
this.fsCaseSensitive = fsCaseSensitive;
}

public boolean isRenameCaseSensitive() {
return renameFlags.contains(RENAME.CASE);
}

public void setRenameCaseSensitive(boolean renameCaseSensitive) {
if (renameCaseSensitive && !isRenameCaseSensitive()) {
renameFlags.add(RENAME.CASE);
} else if (!renameCaseSensitive && isRenameCaseSensitive()) {
renameFlags.remove(RENAME.CASE);
}
}

public boolean isRenameValid() {
return renameFlags.contains(RENAME.VALID);
}

public void setRenameValid(boolean renameValid) {
if (renameValid && !isRenameValid()) {
renameFlags.add(RENAME.VALID);
} else if (!renameValid && isRenameValid()) {
renameFlags.remove(RENAME.VALID);
}
}

public boolean isRenamePrintable() {
return renameFlags.contains(RENAME.PRINTABLE);
}

public void setRenamePrintable(boolean renamePrintable) {
if (renamePrintable && !isRenamePrintable()) {
renameFlags.add(RENAME.PRINTABLE);
} else if (!renamePrintable && isRenamePrintable()) {
renameFlags.remove(RENAME.PRINTABLE);
}
}

@Override
Expand All @@ -257,17 +299,19 @@ public String toString() {
", fallbackMode=" + fallbackMode +
", showInconsistentCode=" + showInconsistentCode +
", useImports=" + useImports +
", isSkipResources=" + isSkipResources +
", isSkipSources=" + isSkipSources +
", isDeobfuscationOn=" + isDeobfuscationOn +
", isDeobfuscationForceSave=" + isDeobfuscationForceSave +
", skipResources=" + skipResources +
", skipSources=" + skipSources +
", deobfuscationOn=" + deobfuscationOn +
", deobfuscationForceSave=" + deobfuscationForceSave +
", useSourceNameAsClassAlias=" + useSourceNameAsClassAlias +
", deobfuscationMinLength=" + deobfuscationMinLength +
", deobfuscationMaxLength=" + deobfuscationMaxLength +
", escapeUnicode=" + escapeUnicode +
", replaceConsts=" + replaceConsts +
", respectBytecodeAccModifiers=" + respectBytecodeAccModifiers +
", exportAsGradleProject=" + exportAsGradleProject +
", fsCaseSensitive=" + fsCaseSensitive +
", renameFlags=" + renameFlags +
'}';
}
}
6 changes: 2 additions & 4 deletions jadx-core/src/main/java/jadx/core/deobf/NameMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -80,15 +80,13 @@ public static boolean isReserved(String str) {
public static boolean isValidIdentifier(String str) {
return notEmpty(str)
&& !isReserved(str)
&& VALID_JAVA_IDENTIFIER.matcher(str).matches()
&& isAllCharsPrintable(str);
&& VALID_JAVA_IDENTIFIER.matcher(str).matches();
}

public static boolean isValidFullIdentifier(String str) {
return notEmpty(str)
&& !isReserved(str)
&& VALID_JAVA_FULL_IDENTIFIER.matcher(str).matches()
&& isAllCharsPrintable(str);
&& VALID_JAVA_FULL_IDENTIFIER.matcher(str).matches();
}

public static boolean isValidIdentifierStart(int codePoint) {
Expand Down
Loading

0 comments on commit 74a72a5

Please sign in to comment.