From 3a6d645ea392273d55b257ca228818b67c8a8695 Mon Sep 17 00:00:00 2001 From: Jan S Date: Mon, 30 Nov 2020 12:00:58 +0100 Subject: [PATCH] fix(res): do not rename resources names for building res-map.txt (PR #1035) fix: do not rename resources names for building res-map.txt allow loading of resources.arsc from android.jar files res-map.txt bases on resources.arsc from API 3, 4, 7-30 (taken from https://github.com/Sable/android-platforms) --- .../java/jadx/cli/tools/ConvertArscFile.java | 30 +++++++++++++++---- .../java/jadx/core/xmlgen/ResTableParser.java | 14 ++++++++- .../src/main/resources/android/res-map.txt | 19 ++++++++++++ 3 files changed, 56 insertions(+), 7 deletions(-) diff --git a/jadx-cli/src/main/java/jadx/cli/tools/ConvertArscFile.java b/jadx-cli/src/main/java/jadx/cli/tools/ConvertArscFile.java index 1e885b349..350f1c07a 100644 --- a/jadx-cli/src/main/java/jadx/cli/tools/ConvertArscFile.java +++ b/jadx-cli/src/main/java/jadx/cli/tools/ConvertArscFile.java @@ -11,6 +11,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,13 +53,29 @@ public class ConvertArscFile { RootNode root = new RootNode(new JadxArgs()); // not really needed rewritesCount = 0; for (Path resFile : inputPaths) { - try (InputStream inputStream = new BufferedInputStream(Files.newInputStream(resFile))) { - ResTableParser resTableParser = new ResTableParser(root); - resTableParser.decode(inputStream); - Map singleResMap = resTableParser.getResStorage().getResourcesNames(); - mergeResMaps(resMap, singleResMap); - LOG.info("{} entries count: {}, after merge: {}", resFile.getFileName(), singleResMap.size(), resMap.size()); + LOG.info("Processing {}", resFile); + ResTableParser resTableParser = new ResTableParser(root, true); + if (resFile.getFileName().toString().endsWith(".jar")) { + // Load resources.arsc from android.jar + try (ZipFile zip = new ZipFile(resFile.toFile())) { + ZipEntry entry = zip.getEntry("resources.arsc"); + if (entry == null) { + LOG.error("Failed to load \"resources.arsc\" from {}", resFile); + continue; + } + try (InputStream inputStream = zip.getInputStream(entry)) { + resTableParser.decode(inputStream); + } + } + } else { + // Load resources.arsc from extracted file + try (InputStream inputStream = new BufferedInputStream(Files.newInputStream(resFile))) { + resTableParser.decode(inputStream); + } } + Map singleResMap = resTableParser.getResStorage().getResourcesNames(); + mergeResMaps(resMap, singleResMap); + LOG.info("{} entries count: {}, after merge: {}", resFile.getFileName(), singleResMap.size(), resMap.size()); } LOG.info("Output entries count: {}", resMap.size()); LOG.info("Total rewrites count: {}", rewritesCount); diff --git a/jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java b/jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java index e1695e228..80eba6421 100644 --- a/jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java +++ b/jadx-core/src/main/java/jadx/core/xmlgen/ResTableParser.java @@ -27,7 +27,7 @@ import jadx.core.xmlgen.entry.ValuesParser; public class ResTableParser extends CommonBinaryParser { private static final Logger LOG = LoggerFactory.getLogger(ResTableParser.class); - private static final Pattern VALID_RES_KEY_PATTERN = Pattern.compile("[\\w\\d-_.]+"); + private static final Pattern VALID_RES_KEY_PATTERN = Pattern.compile("\\$+[\\w\\d-_.]+"); private static final class PackageChunk { private final int id; @@ -59,12 +59,21 @@ public class ResTableParser extends CommonBinaryParser { } } + /** + * No renaming, pattern checking or name generation. Required for res-map.txt building + */ + private final boolean useRawResName; private final RootNode root; private final ResourceStorage resStorage = new ResourceStorage(); private String[] strings; public ResTableParser(RootNode root) { + this(root, false); + } + + public ResTableParser(RootNode root, boolean useRawResNames) { this.root = root; + this.useRawResName = useRawResNames; } public void decode(InputStream inputStream) throws IOException { @@ -291,6 +300,9 @@ public class ResTableParser extends CommonBinaryParser { } private String getResName(int resRef, String origKeyName) { + if (this.useRawResName) { + return origKeyName; + } String renamedKey = resStorage.getRename(resRef); if (renamedKey != null) { return renamedKey; diff --git a/jadx-core/src/main/resources/android/res-map.txt b/jadx-core/src/main/resources/android/res-map.txt index 2685a4c4b..37201dbb2 100644 --- a/jadx-core/src/main/resources/android/res-map.txt +++ b/jadx-core/src/main/resources/android/res-map.txt @@ -10686,6 +10686,7 @@ 010b0009=animator/leanback_setup_fragment_close_exit 010b000a=animator/leanback_setup_fragment_open_enter 010b000b=animator/leanback_setup_fragment_open_exit +010b000c=xml/time_zones_by_country 010c0000=interpolator/accelerate_quad 010c0001=interpolator/decelerate_quad 010c0002=interpolator/accelerate_cubic @@ -10740,6 +10741,23 @@ 010d0001=mipmap/sym_def_app_icon_foreground 010d0002=mipmap/sym_def_app_icon_maskable 010d0003=mipmap/sym_def_app_icon_maskable +010d0004=bool/config_bypass_keyguard_if_slider_open +010d0005=bool/config_automatic_brightness_available +010d0006=bool/config_annoy_dianne +010d0007=bool/config_unplugTurnsOnScreen +010d0008=bool/config_animateScreenLights +010d0009=bool/config_deskDockEnablesAccelerometer +010d000a=bool/config_carDockEnablesAccelerometer +010d000b=bool/config_batterySdCardAccessibility +010d000c=bool/config_use_strict_phone_number_comparation +010d000d=bool/config_disableMenuKeyInLockScreen +010d000e=bool/config_swipeDisambiguation +010d000f=bool/config_filterTouchEvents +010d0010=bool/config_filterJumpyTouchEvents +010d0011=bool/config_bluetooth_sco_off_call +010d0012=bool/config_sip_wifi_only +010d0013=bool/skip_restoring_network_selection +010d0014=bool/lockscreen_isPortrait 010e0000=integer/config_shortAnimTime 010e0001=integer/config_mediumAnimTime 010e0002=integer/config_longAnimTime @@ -11040,6 +11058,7 @@ 010f000f=xml/sms_short_codes 010f0010=xml/storage_list 010f0011=xml/time_zones_by_country +010f0012=plurals/wifi_available_detailed 01100000=raw/loaderror 01100001=raw/nodomain 01100002=raw/color_fade_frag