Projects STRLCPY jadx Commits a9bbadd6
🤬
  • feat: add option for deobfuscation map file handle mode (#1351)

  • Loading...
  • Skylot committed 2 years ago
    a9bbadd6
    1 parent 2c570681
Revision indexing in progress... (symbol navigation in revisions will be accurate after indexed)
  • ■ ■ ■ ■ ■
    README.md
    skipped 95 lines
    96 96   --deobf-min - min length of name, renamed if shorter, default: 3
    97 97   --deobf-max - max length of name, renamed if longer, default: 64
    98 98   --deobf-cfg-file - deobfuscation map file, default: same dir and name as input file with '.jobf' extension
    99  - --deobf-rewrite-cfg - force to ignore and overwrite deobfuscation map file
     99 + --deobf-cfg-file-mode - set mode for handle deobfuscation map file:
     100 + 'read' - read if found, don't save (default)
     101 + 'read-or-save' - read if found, save otherwise (don't overwrite)
     102 + 'overwrite' - don't read, always save
     103 + 'ignore' - don't read and don't save
     104 + --deobf-rewrite-cfg - set '--deobf-cfg-file-mode' to 'overwrite' (deprecated)
    100 105   --deobf-use-sourcename - use source file name as class name alias
    101 106   --deobf-parse-kotlin-metadata - parse kotlin metadata to class and package names
    102 107   --use-kotlin-methods-for-var-names - use kotlin intrinsic methods to rename variables, values: disable, apply, apply-and-hide, default: apply
    skipped 37 lines
  • ■ ■ ■ ■
    jadx-cli/src/main/java/jadx/cli/JCommanderWrapper.java
    skipped 93 lines
    94 94   opt.append("- ").append(description);
    95 95   }
    96 96   String defaultValue = getDefaultValue(args, f, opt);
    97  - if (defaultValue != null) {
     97 + if (defaultValue != null && !description.contains("(default)")) {
    98 98   opt.append(", default: ").append(defaultValue);
    99 99   }
    100 100   out.println(opt);
    skipped 49 lines
  • ■ ■ ■ ■ ■ ■
    jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java
    skipped 15 lines
    16 16  import jadx.api.JadxArgs.RenameEnum;
    17 17  import jadx.api.JadxArgs.UseKotlinMethodsForVarNames;
    18 18  import jadx.api.JadxDecompiler;
     19 +import jadx.api.args.DeobfuscationMapFileMode;
    19 20  import jadx.core.utils.exceptions.JadxException;
    20 21  import jadx.core.utils.files.FileUtils;
    21 22   
    skipped 71 lines
    93 94   )
    94 95   protected String deobfuscationMapFile;
    95 96   
    96  - @Parameter(names = { "--deobf-rewrite-cfg" }, description = "force to ignore and overwrite deobfuscation map file")
     97 + @Parameter(
     98 + names = { "--deobf-cfg-file-mode" },
     99 + description = "set mode for handle deobfuscation map file:"
     100 + + "\n 'read' - read if found, don't save (default)"
     101 + + "\n 'read-or-save' - read if found, save otherwise (don't overwrite)"
     102 + + "\n 'overwrite' - don't read, always save"
     103 + + "\n 'ignore' - don't read and don't save",
     104 + converter = DeobfuscationMapFileModeConverter.class
     105 + )
     106 + protected DeobfuscationMapFileMode deobfuscationMapFileMode = DeobfuscationMapFileMode.READ;
     107 + 
     108 + @Parameter(names = { "--deobf-rewrite-cfg" }, description = "set '--deobf-cfg-file-mode' to 'overwrite' (deprecated)")
    97 109   protected boolean deobfuscationForceSave = false;
    98 110   
    99 111   @Parameter(names = { "--deobf-use-sourcename" }, description = "use source file name as class name alias")
    skipped 126 lines
    226 238   args.setReplaceConsts(replaceConsts);
    227 239   args.setDeobfuscationOn(deobfuscationOn);
    228 240   args.setDeobfuscationMapFile(FileUtils.toFile(deobfuscationMapFile));
    229  - args.setDeobfuscationForceSave(deobfuscationForceSave);
     241 + if (deobfuscationForceSave) {
     242 + args.setDeobfuscationMapFileMode(DeobfuscationMapFileMode.OVERWRITE);
     243 + } else {
     244 + args.setDeobfuscationMapFileMode(deobfuscationMapFileMode);
     245 + }
    230 246   args.setDeobfuscationMinLength(deobfuscationMinLength);
    231 247   args.setDeobfuscationMaxLength(deobfuscationMaxLength);
    232 248   args.setUseSourceNameAsClassAlias(deobfuscationUseSourceNameAsAlias);
    skipped 88 lines
    321 337   
    322 338   public String getDeobfuscationMapFile() {
    323 339   return deobfuscationMapFile;
     340 + }
     341 + 
     342 + public DeobfuscationMapFileMode getDeobfuscationMapFileMode() {
     343 + return deobfuscationMapFileMode;
    324 344   }
    325 345   
    326 346   public boolean isDeobfuscationForceSave() {
    skipped 107 lines
    434 454   throw new IllegalArgumentException(
    435 455   '\'' + value + "' is unknown, possible values are: "
    436 456   + JadxCLIArgs.enumValuesString(CommentsLevel.values()));
     457 + }
     458 + }
     459 + }
     460 + 
     461 + public static class DeobfuscationMapFileModeConverter implements IStringConverter<DeobfuscationMapFileMode> {
     462 + @Override
     463 + public DeobfuscationMapFileMode convert(String value) {
     464 + try {
     465 + return DeobfuscationMapFileMode.valueOf(value.toUpperCase());
     466 + } catch (Exception e) {
     467 + throw new IllegalArgumentException(
     468 + '\'' + value + "' is unknown, possible values are: "
     469 + + JadxCLIArgs.enumValuesString(DeobfuscationMapFileMode.values()));
    437 470   }
    438 471   }
    439 472   }
    skipped 8 lines
  • ■ ■ ■ ■ ■
    jadx-core/src/main/java/jadx/api/JadxArgs.java
    skipped 8 lines
    9 9  import java.util.function.Function;
    10 10  import java.util.function.Predicate;
    11 11   
     12 +import jadx.api.args.DeobfuscationMapFileMode;
    12 13  import jadx.api.data.ICodeData;
    13 14  import jadx.api.impl.AnnotatedCodeWriter;
    14 15  import jadx.api.impl.InMemoryCodeCache;
    skipped 39 lines
    54 55   private Predicate<String> classFilter = null;
    55 56   
    56 57   private boolean deobfuscationOn = false;
    57  - private boolean deobfuscationForceSave = false;
    58 58   private boolean useSourceNameAsClassAlias = false;
    59 59   private boolean parseKotlinMetadata = false;
    60 60   private File deobfuscationMapFile = null;
     61 + 
     62 + private DeobfuscationMapFileMode deobfuscationMapFileMode = DeobfuscationMapFileMode.READ;
    61 63   
    62 64   private int deobfuscationMinLength = 0;
    63 65   private int deobfuscationMaxLength = Integer.MAX_VALUE;
    skipped 200 lines
    264 266   this.deobfuscationOn = deobfuscationOn;
    265 267   }
    266 268   
     269 + @Deprecated
    267 270   public boolean isDeobfuscationForceSave() {
    268  - return deobfuscationForceSave;
     271 + return deobfuscationMapFileMode == DeobfuscationMapFileMode.OVERWRITE;
    269 272   }
    270 273   
     274 + @Deprecated
    271 275   public void setDeobfuscationForceSave(boolean deobfuscationForceSave) {
    272  - this.deobfuscationForceSave = deobfuscationForceSave;
     276 + if (deobfuscationForceSave) {
     277 + this.deobfuscationMapFileMode = DeobfuscationMapFileMode.OVERWRITE;
     278 + }
     279 + }
     280 + 
     281 + public DeobfuscationMapFileMode getDeobfuscationMapFileMode() {
     282 + return deobfuscationMapFileMode;
     283 + }
     284 + 
     285 + public void setDeobfuscationMapFileMode(DeobfuscationMapFileMode deobfuscationMapFileMode) {
     286 + this.deobfuscationMapFileMode = deobfuscationMapFileMode;
    273 287   }
    274 288   
    275 289   public boolean isUseSourceNameAsClassAlias() {
    skipped 200 lines
    476 490   + ", skipSources=" + skipSources
    477 491   + ", deobfuscationOn=" + deobfuscationOn
    478 492   + ", deobfuscationMapFile=" + deobfuscationMapFile
    479  - + ", deobfuscationForceSave=" + deobfuscationForceSave
     493 + + ", deobfuscationMapFileMode=" + deobfuscationMapFileMode
    480 494   + ", useSourceNameAsClassAlias=" + useSourceNameAsClassAlias
    481 495   + ", parseKotlinMetadata=" + parseKotlinMetadata
    482 496   + ", useKotlinMethodsForVarNames=" + useKotlinMethodsForVarNames
    skipped 17 lines
  • ■ ■ ■ ■ ■ ■
    jadx-core/src/main/java/jadx/api/args/DeobfuscationMapFileMode.java
     1 +package jadx.api.args;
     2 + 
     3 +public enum DeobfuscationMapFileMode {
     4 + 
     5 + /**
     6 + * Load if found, don't save (default)
     7 + */
     8 + READ,
     9 + 
     10 + /**
     11 + * Load if found, save only if new (don't overwrite)
     12 + */
     13 + READ_OR_SAVE,
     14 + 
     15 + /**
     16 + * Don't load, always save
     17 + */
     18 + OVERWRITE,
     19 + 
     20 + /**
     21 + * Don't load and don't save
     22 + */
     23 + IGNORE;
     24 + 
     25 + public boolean shouldRead() {
     26 + return this == READ || this == READ_OR_SAVE;
     27 + }
     28 + 
     29 + public boolean shouldWrite() {
     30 + return this == READ_OR_SAVE || this == OVERWRITE;
     31 + }
     32 +}
     33 + 
  • ■ ■ ■ ■ ■ ■
    jadx-core/src/main/java/jadx/core/deobf/DeobfPresets.java
    skipped 16 lines
    17 17  import org.slf4j.LoggerFactory;
    18 18   
    19 19  import jadx.api.JadxArgs;
     20 +import jadx.api.args.DeobfuscationMapFileMode;
    20 21  import jadx.core.dex.info.ClassInfo;
    21 22  import jadx.core.dex.info.FieldInfo;
    22 23  import jadx.core.dex.info.MethodInfo;
    skipped 27 lines
    50 51   @Nullable
    51 52   private static Path getPathDeobfMapPath(RootNode root) {
    52 53   JadxArgs jadxArgs = root.getArgs();
     54 + if (jadxArgs.getDeobfuscationMapFileMode() == DeobfuscationMapFileMode.IGNORE) {
     55 + return null;
     56 + }
    53 57   File deobfMapFile = jadxArgs.getDeobfuscationMapFile();
    54 58   if (deobfMapFile != null) {
    55 59   return deobfMapFile.toPath();
    skipped 14 lines
    70 74   /**
    71 75   * Loads deobfuscator presets
    72 76   */
    73  - public void load() {
     77 + public boolean load() {
    74 78   if (!Files.exists(deobfMapFile)) {
    75  - return;
     79 + return false;
    76 80   }
    77 81   LOG.info("Loading obfuscation map from: {}", deobfMapFile.toAbsolutePath());
    78 82   try {
    skipped 27 lines
    106 110   break;
    107 111   }
    108 112   }
     113 + return true;
    109 114   } catch (Exception e) {
    110 115   LOG.error("Failed to load deobfuscation map file '{}'", deobfMapFile.toAbsolutePath(), e);
     116 + return false;
    111 117   }
    112 118   }
    113 119   
    skipped 28 lines
    142 148   }
    143 149   Files.write(deobfMapFile, list, MAP_FILE_CHARSET,
    144 150   StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
    145  - if (LOG.isDebugEnabled()) {
    146  - LOG.debug("Deobfuscation map file saved as: {}", deobfMapFile);
    147  - }
     151 + LOG.info("Deobfuscation map file saved as: {}", deobfMapFile);
    148 152   }
    149 153   
    150 154   public String getForCls(ClassInfo cls) {
    skipped 47 lines
  • ■ ■ ■ ■ ■ ■
    jadx-core/src/main/java/jadx/core/deobf/Deobfuscator.java
    skipped 15 lines
    16 16  import org.slf4j.LoggerFactory;
    17 17   
    18 18  import jadx.api.JadxArgs;
     19 +import jadx.api.args.DeobfuscationMapFileMode;
    19 20  import jadx.api.plugins.input.data.attributes.JadxAttrType;
    20 21  import jadx.api.plugins.input.data.attributes.types.SourceFileAttr;
    21 22  import jadx.core.dex.attributes.AFlag;
    skipped 54 lines
    76 77   }
    77 78   
    78 79   public void execute() {
    79  - if (!args.isDeobfuscationForceSave()) {
    80  - deobfPresets.load();
    81  - for (Map.Entry<String, String> pkgEntry : deobfPresets.getPkgPresetMap().entrySet()) {
    82  - addPackagePreset(pkgEntry.getKey(), pkgEntry.getValue());
     80 + if (args.getDeobfuscationMapFileMode().shouldRead()) {
     81 + if (deobfPresets.load()) {
     82 + for (Map.Entry<String, String> pkgEntry : deobfPresets.getPkgPresetMap().entrySet()) {
     83 + addPackagePreset(pkgEntry.getKey(), pkgEntry.getValue());
     84 + }
     85 + deobfPresets.getPkgPresetMap().clear(); // not needed anymore
     86 + initIndexes();
    83 87   }
    84  - deobfPresets.getPkgPresetMap().clear(); // not needed anymore
    85  - initIndexes();
    86 88   }
    87 89   process();
    88 90   }
    89 91   
    90 92   public void savePresets() {
     93 + DeobfuscationMapFileMode mode = args.getDeobfuscationMapFileMode();
     94 + if (!mode.shouldWrite()) {
     95 + return;
     96 + }
    91 97   Path deobfMapFile = deobfPresets.getDeobfMapFile();
    92  - if (Files.exists(deobfMapFile) && !args.isDeobfuscationForceSave()) {
    93  - LOG.info("Deobfuscation map file '{}' exists. Use command line option '--deobf-rewrite-cfg' to rewrite it",
    94  - deobfMapFile.toAbsolutePath());
     98 + if (mode == DeobfuscationMapFileMode.READ_OR_SAVE && Files.exists(deobfMapFile)) {
    95 99   return;
    96 100   }
    97 101   try {
    skipped 594 lines
  • ■ ■ ■ ■
    jadx-gui/src/main/java/jadx/gui/settings/JadxProject.java
    skipped 209 lines
    210 210   
    211 211   private void upgrade() {
    212 212   int fromVersion = data.getProjectVersion();
    213  - LOG.debug("upgrade settings from version: {} to {}", fromVersion, CURRENT_PROJECT_VERSION);
     213 + if (fromVersion == CURRENT_PROJECT_VERSION) {
     214 + return;
     215 + }
     216 + LOG.debug("upgrade project settings from version: {} to {}", fromVersion, CURRENT_PROJECT_VERSION);
    214 217   if (fromVersion == 0) {
    215 218   fromVersion++;
    216 219   }
    skipped 8 lines
  • ■ ■ ■ ■ ■
    jadx-gui/src/main/java/jadx/gui/settings/JadxSettings.java
    skipped 27 lines
    28 28   
    29 29  import jadx.api.CommentsLevel;
    30 30  import jadx.api.JadxArgs;
     31 +import jadx.api.args.DeobfuscationMapFileMode;
    31 32  import jadx.cli.JadxCLIArgs;
    32 33  import jadx.cli.LogHelper;
    33 34  import jadx.core.utils.exceptions.JadxRuntimeException;
    skipped 9 lines
    43 44   
    44 45   private static final Path USER_HOME = Paths.get(System.getProperty("user.home"));
    45 46   private static final int RECENT_PROJECTS_COUNT = 15;
    46  - private static final int CURRENT_SETTINGS_VERSION = 15;
     47 + private static final int CURRENT_SETTINGS_VERSION = 16;
    47 48   
    48 49   private static final Font DEFAULT_FONT = new RSyntaxTextArea().getFont();
    49 50   
    skipped 276 lines
    326 327   this.deobfuscationMaxLength = deobfuscationMaxLength;
    327 328   }
    328 329   
    329  - public void setDeobfuscationForceSave(boolean deobfuscationForceSave) {
    330  - this.deobfuscationForceSave = deobfuscationForceSave;
     330 + public void setDeobfuscationMapFileMode(DeobfuscationMapFileMode mode) {
     331 + this.deobfuscationMapFileMode = mode;
    331 332   }
    332 333   
    333 334   public void setDeobfuscationUseSourceNameAsAlias(boolean deobfuscationUseSourceNameAsAlias) {
    skipped 254 lines
    588 589   setDeobfuscationMaxLength(64);
    589 590   setDeobfuscationUseSourceNameAsAlias(true);
    590 591   setDeobfuscationParseKotlinMetadata(true);
    591  - setDeobfuscationForceSave(false);
     592 + setDeobfuscationMapFileMode(DeobfuscationMapFileMode.READ);
    592 593   setThreadsCount(JadxArgs.DEFAULT_THREADS_COUNT);
    593 594   setReplaceConsts(true);
    594 595   setSkipResources(false);
    skipped 62 lines
    657 658   }
    658 659   if (fromVersion == 14) {
    659 660   useKotlinMethodsForVarNames = JadxArgs.UseKotlinMethodsForVarNames.APPLY;
     661 + fromVersion++;
     662 + }
     663 + if (fromVersion == 15) {
     664 + if (deobfuscationForceSave) {
     665 + deobfuscationMapFileMode = DeobfuscationMapFileMode.OVERWRITE;
     666 + } else {
     667 + deobfuscationMapFileMode = DeobfuscationMapFileMode.READ;
     668 + }
    660 669   fromVersion++;
    661 670   }
    662 671   if (fromVersion != CURRENT_SETTINGS_VERSION) {
    skipped 12 lines
  • ■ ■ ■ ■ ■ ■
    jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsWindow.java
    skipped 60 lines
    61 61  import jadx.api.CommentsLevel;
    62 62  import jadx.api.JadxArgs;
    63 63  import jadx.api.JadxArgs.UseKotlinMethodsForVarNames;
     64 +import jadx.api.args.DeobfuscationMapFileMode;
    64 65  import jadx.gui.ui.MainWindow;
    65 66  import jadx.gui.ui.codearea.EditorTheme;
    66 67  import jadx.gui.utils.FontUtils;
    skipped 165 lines
    232 233   needReload();
    233 234   });
    234 235   
    235  - JCheckBox deobfForce = new JCheckBox();
    236  - deobfForce.setSelected(settings.isDeobfuscationForceSave());
    237  - deobfForce.addItemListener(e -> {
    238  - settings.setDeobfuscationForceSave(e.getStateChange() == ItemEvent.SELECTED);
    239  - needReload();
    240  - });
    241  - 
    242 236   SpinnerNumberModel minLenModel = new SpinnerNumberModel(settings.getDeobfuscationMinLength(), 0, Integer.MAX_VALUE, 1);
    243 237   JSpinner minLenSpinner = new JSpinner(minLenModel);
    244 238   minLenSpinner.addChangeListener(e -> {
    skipped 22 lines
    267 261   needReload();
    268 262   });
    269 263   
     264 + JComboBox<DeobfuscationMapFileMode> deobfMapFileModeCB = new JComboBox<>(DeobfuscationMapFileMode.values());
     265 + deobfMapFileModeCB.setSelectedItem(settings.getDeobfuscationMapFileMode());
     266 + deobfMapFileModeCB.addActionListener(e -> {
     267 + DeobfuscationMapFileMode newValue = (DeobfuscationMapFileMode) deobfMapFileModeCB.getSelectedItem();
     268 + if (newValue != settings.getDeobfuscationMapFileMode()) {
     269 + settings.setDeobfuscationMapFileMode(newValue);
     270 + needReload();
     271 + }
     272 + });
     273 + 
    270 274   SettingsGroup deobfGroup = new SettingsGroup(NLS.str("preferences.deobfuscation"));
    271 275   deobfGroup.addRow(NLS.str("preferences.deobfuscation_on"), deobfOn);
    272  - deobfGroup.addRow(NLS.str("preferences.deobfuscation_force"), deobfForce);
    273 276   deobfGroup.addRow(NLS.str("preferences.deobfuscation_min_len"), minLenSpinner);
    274 277   deobfGroup.addRow(NLS.str("preferences.deobfuscation_max_len"), maxLenSpinner);
    275 278   deobfGroup.addRow(NLS.str("preferences.deobfuscation_source_alias"), deobfSourceAlias);
    276 279   deobfGroup.addRow(NLS.str("preferences.deobfuscation_kotlin_metadata"), deobfKotlinMetadata);
     280 + deobfGroup.addRow(NLS.str("preferences.deobfuscation_map_file_mode"), deobfMapFileModeCB);
    277 281   deobfGroup.end();
    278 282   
    279 283   Collection<JComponent> connectedComponents =
    280  - Arrays.asList(deobfForce, minLenSpinner, maxLenSpinner, deobfSourceAlias, deobfKotlinMetadata);
     284 + Arrays.asList(minLenSpinner, maxLenSpinner, deobfSourceAlias, deobfKotlinMetadata);
    281 285   deobfOn.addItemListener(e -> enableComponentList(connectedComponents, e.getStateChange() == ItemEvent.SELECTED));
    282 286   enableComponentList(connectedComponents, settings.isDeobfuscationOn());
    283 287   return deobfGroup;
    skipped 448 lines
  • ■ ■ ■ ■
    jadx-gui/src/main/java/jadx/gui/settings/data/ProjectData.java
    skipped 8 lines
    9 9   
    10 10  public class ProjectData {
    11 11   
    12  - private int projectVersion;
     12 + private int projectVersion = 1;
    13 13   private List<Path> files;
    14 14   private List<String[]> treeExpansions = new ArrayList<>();
    15 15   private JadxCodeData codeData = new JadxCodeData();
    skipped 52 lines
  • ■ ■ ■ ■
    jadx-gui/src/main/resources/i18n/Messages_de_DE.properties
    skipped 152 lines
    153 153  preferences.select_font=Ändern
    154 154  preferences.select_smali_font=Ändern
    155 155  preferences.deobfuscation_on=Deobfuskierung aktivieren
    156  -preferences.deobfuscation_force=Überschreiben der Deobfuskierungs-Map-Datei erzwingen
     156 +#preferences.deobfuscation_map_file_mode=Map file handle mode
    157 157  preferences.deobfuscation_min_len=Minimale Namenlänge
    158 158  preferences.deobfuscation_max_len=Maximale Namenlänge
    159 159  preferences.deobfuscation_source_alias=Quelldateiname als Klassennamen-Alias verwenden
    skipped 141 lines
  • ■ ■ ■ ■
    jadx-gui/src/main/resources/i18n/Messages_en_US.properties
    skipped 152 lines
    153 153  preferences.select_font=Change
    154 154  preferences.select_smali_font=Change
    155 155  preferences.deobfuscation_on=Enable deobfuscation
    156  -preferences.deobfuscation_force=Force rewrite deobfuscation map file
     156 +preferences.deobfuscation_map_file_mode=Map file handle mode
    157 157  preferences.deobfuscation_min_len=Minimum name length
    158 158  preferences.deobfuscation_max_len=Maximum name length
    159 159  preferences.deobfuscation_source_alias=Use source file name as class name alias
    skipped 141 lines
  • ■ ■ ■ ■
    jadx-gui/src/main/resources/i18n/Messages_es_ES.properties
    skipped 152 lines
    153 153  preferences.select_font=Seleccionar
    154 154  #preferences.select_smali_font=
    155 155  preferences.deobfuscation_on=Activar desobfuscación
    156  -preferences.deobfuscation_force=Forzar reescritura del fichero de ofuscación
     156 +#preferences.deobfuscation_map_file_mode=Map file handle mode
    157 157  preferences.deobfuscation_min_len=Longitud mínima del nombre
    158 158  preferences.deobfuscation_max_len=Longitud máxima del nombre
    159 159  preferences.deobfuscation_source_alias=Usar el nombre del source como alias para la clase
    skipped 141 lines
  • ■ ■ ■ ■
    jadx-gui/src/main/resources/i18n/Messages_ko_KR.properties
    skipped 152 lines
    153 153  preferences.select_font=변경
    154 154  preferences.select_smali_font=변경
    155 155  preferences.deobfuscation_on=난독 해제 활성화
    156  -preferences.deobfuscation_force=난독 해제 맵 파일 다시 쓰기
     156 +#preferences.deobfuscation_map_file_mode=Map file handle mode
    157 157  preferences.deobfuscation_min_len=최소 이름 길이
    158 158  preferences.deobfuscation_max_len=최대 이름 길이
    159 159  preferences.deobfuscation_source_alias=소스 파일 이름을 클래스 이름 별칭으로 사용
    skipped 141 lines
  • ■ ■ ■ ■
    jadx-gui/src/main/resources/i18n/Messages_zh_CN.properties
    skipped 152 lines
    153 153  preferences.select_font=修改
    154 154  preferences.select_smali_font=修改
    155 155  preferences.deobfuscation_on=启用反混淆
    156  -preferences.deobfuscation_force=强制覆盖反混淆映射文件
     156 +#preferences.deobfuscation_map_file_mode=Map file handle mode
    157 157  preferences.deobfuscation_min_len=最小命名长度
    158 158  preferences.deobfuscation_max_len=最大命名长度
    159 159  preferences.deobfuscation_source_alias=使用资源名作为类的别名
    skipped 141 lines
  • ■ ■ ■ ■
    jadx-gui/src/main/resources/i18n/Messages_zh_TW.properties
    skipped 152 lines
    153 153  preferences.select_font=變更
    154 154  preferences.select_smali_font=變更
    155 155  preferences.deobfuscation_on=啟用去模糊化
    156  -preferences.deobfuscation_force=強制覆寫去模糊化對應檔
     156 +#preferences.deobfuscation_map_file_mode=Map file handle mode
    157 157  preferences.deobfuscation_min_len=最小名稱長度
    158 158  preferences.deobfuscation_max_len=最大名稱長度
    159 159  preferences.deobfuscation_source_alias=將原始檔案名稱作為類別別名
    skipped 141 lines
Please wait...
Page is in error, reload to recover