From c7915cd6cb5b5af6da4ad8a6f982f913710b6923 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Tue, 29 Aug 2023 06:18:18 -0400 Subject: [PATCH 01/34] feat: add sponsors to readme (#3301) --- .../sponsors/emerge-tools-vertical-black.svg | 1 + .../sponsors/emerge-tools-vertical-white.svg | 1 + .../assets/sponsors/sourcetoad-horizontal.svg | 217 ++++++++++++++++++ README.md | 33 ++- 4 files changed, 244 insertions(+), 8 deletions(-) create mode 100644 .github/assets/sponsors/emerge-tools-vertical-black.svg create mode 100644 .github/assets/sponsors/emerge-tools-vertical-white.svg create mode 100644 .github/assets/sponsors/sourcetoad-horizontal.svg diff --git a/.github/assets/sponsors/emerge-tools-vertical-black.svg b/.github/assets/sponsors/emerge-tools-vertical-black.svg new file mode 100644 index 00000000..7a27559f --- /dev/null +++ b/.github/assets/sponsors/emerge-tools-vertical-black.svg @@ -0,0 +1 @@ + diff --git a/.github/assets/sponsors/emerge-tools-vertical-white.svg b/.github/assets/sponsors/emerge-tools-vertical-white.svg new file mode 100644 index 00000000..310e2e32 --- /dev/null +++ b/.github/assets/sponsors/emerge-tools-vertical-white.svg @@ -0,0 +1 @@ + diff --git a/.github/assets/sponsors/sourcetoad-horizontal.svg b/.github/assets/sponsors/sourcetoad-horizontal.svg new file mode 100644 index 00000000..2c8c55e0 --- /dev/null +++ b/.github/assets/sponsors/sourcetoad-horizontal.svg @@ -0,0 +1,217 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/README.md b/README.md index f0b88302..b60a497a 100644 --- a/README.md +++ b/README.md @@ -12,14 +12,6 @@ It is NOT intended for piracy and other non-legal uses. It could be used for loc - [Project Page](https://ibotpeaches.github.io/Apktool/) - [#apktool on libera.chat](https://web.libera.chat/) -#### Sponsored by - -* [Sourcetoad](https://www.sourcetoad.com/cool-tools/apktool/) - helping with a weekly sponsorship for continued improvement and maintenance of the project. - -#### IDE of Choice - -* [JetBrains IntelliJ](https://www.jetbrains.com/idea/) - #### Security Vulnerabilities If you discover a security vulnerability within Apktool, please send an e-mail to Connor Tumbleson at connor.tumbleson(at)gmail.com. All security vulnerabilities will be promptly addressed. @@ -35,3 +27,28 @@ If you discover a security vulnerability within Apktool, please send an e-mail t - [Source (Github)](https://github.com/iBotPeaches/Apktool) - [Source (Bitbucket)](https://bitbucket.org/iBotPeaches/apktool/) + +## Sponsors + +Special thanks goes to the following sponsors: + +### Sourcetoad +[Sourcetoad](https://sourcetoad.com/) is an award-winning software and app development firm committed to the co-creation of technology solutions that solve complex business problems, delight users, and help our clients achieve their goals. + + + + + + + +### Emerge Tools + +[Emerge Tools](https://www.emergetools.com) is a suite of revolutionary products designed to supercharge mobile apps and the teams that build them. + + + + + + + + From dcb678824394a7b061bae9bd039f37086a6fd742 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sun, 3 Sep 2023 07:06:44 -0400 Subject: [PATCH 02/34] refactor: verbose doesn't adapt handler (#3310) --- .../src/main/java/brut/apktool/Main.java | 21 +++++++++---------- .../androlib/res/decoder/ARSCDecoder.java | 2 +- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java b/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java index 396406aa..d747b585 100644 --- a/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java +++ b/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java @@ -592,11 +592,18 @@ public class Main { return; } - Handler handler = new Handler(){ + Handler handler = new Handler() { @Override public void publish(LogRecord record) { if (getFormatter() == null) { - setFormatter(new SimpleFormatter()); + setFormatter(new Formatter() { + @Override + public String format(LogRecord record) { + return record.getLevel().toString().charAt(0) + ": " + + record.getMessage() + + System.getProperty("line.separator"); + } + }); } try { @@ -616,6 +623,7 @@ public class Main { reportError(null, exception, ErrorManager.FORMAT_FAILURE); } } + @Override public void close() throws SecurityException {} @Override @@ -627,15 +635,6 @@ public class Main { if (verbosity == Verbosity.VERBOSE) { handler.setLevel(Level.ALL); logger.setLevel(Level.ALL); - } else { - handler.setFormatter(new Formatter() { - @Override - public String format(LogRecord record) { - return record.getLevel().toString().charAt(0) + ": " - + record.getMessage() - + System.getProperty("line.separator"); - } - }); } } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java index 38c20897..cb702f44 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java @@ -207,7 +207,7 @@ public class ARSCDecoder { mHeader.checkForUnreadHeader(mIn); for (int i = 0; i < count; i++) { - LOGGER.fine(String.format("Skipping staged alias stagedId (%h) finalId: %h", mIn.readInt(), mIn.readInt())); + LOGGER.fine(String.format("Staged alias: 0x%08x -> 0x%08x", mIn.readInt(), mIn.readInt())); } } From f0ca6d11f94b89c10a031ff6f9f6876f20edd0b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Sep 2023 11:30:18 -0400 Subject: [PATCH 03/34] build(deps): bump gradle/gradle-build-action from 2.7.1 to 2.8.0 (#3316) Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 2.7.1 to 2.8.0. - [Release notes](https://github.com/gradle/gradle-build-action/releases) - [Commits](https://github.com/gradle/gradle-build-action/compare/v2.7.1...v2.8.0) --- updated-dependencies: - dependency-name: gradle/gradle-build-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 12247ab0..10e99caf 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -76,7 +76,7 @@ jobs: distribution: 'zulu' java-version: ${{ matrix.java }} - name: Build and test - uses: gradle/gradle-build-action@v2.7.1 + uses: gradle/gradle-build-action@v2.8.0 with: arguments: build shadowJar proguard @@ -95,7 +95,7 @@ jobs: distribution: 'zulu' java-version: 17 - name: Build - uses: gradle/gradle-build-action@v2.7.1 + uses: gradle/gradle-build-action@v2.8.0 with: arguments: build shadowJar proguard - name: Upload From a117132e39e982aee5609f19498769f62f86650b Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sat, 9 Sep 2023 07:29:39 -0400 Subject: [PATCH 04/34] Feat: Introduce "res-mode" options. (#3318) * Revert "Remove Apktool Dummys. (#3258)" This reverts commit 0e226928ce428077aa3177b11c7da62b3c1aef27. * feat: properly add dummys * refactor: shorten ResTypeSpec * style: remove extra space * refactor: extract FlagItem into own class * refactor: notate which type is null * fix: only add dummys if enabled * feat: skip unknown (if enabled) * feat: introduce "res-mode" * feat: expose config on res table * feat: add method to base attr for res skips * fix: ensure autobuild doesn't choke * refactor: remove java17 enhanced switch * refactor: rename methods * refactor: cleanup res-mode param * test: introduction of test/sample apk * refactor: make ResXmlPatcher public for loading XML * test: assertions for dummy|leave|retain * fix: prevent using `@null` as a name * refactor: shorten long param for 'resm' * refactor: leave for preserve --- .../src/main/java/brut/apktool/Main.java | 35 ++++- .../src/main/java/brut/androlib/Config.java | 30 +++- .../brut/androlib/res/data/ResResSpec.java | 4 + .../java/brut/androlib/res/data/ResTable.java | 4 + .../brut/androlib/res/data/arsc/FlagItem.java | 41 +++++ .../androlib/res/data/value/ResEnumAttr.java | 15 +- .../androlib/res/data/value/ResFlagsAttr.java | 40 ++--- .../res/data/value/ResScalarValue.java | 5 + .../res/data/value/ResStyleValue.java | 2 +- .../androlib/res/data/value/ResValue.java | 6 +- .../androlib/res/decoder/ARSCDecoder.java | 34 ++++- .../brut/androlib/res/xml/ResXmlPatcher.java | 2 +- .../test/java/brut/androlib/TestUtils.java | 12 ++ .../androlib/decode/ResourceModeTest.java | 140 ++++++++++++++++++ .../resources/decode/issue2836/issue2836.apk | Bin 0 -> 54987 bytes 15 files changed, 335 insertions(+), 35 deletions(-) create mode 100644 brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/arsc/FlagItem.java create mode 100644 brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ResourceModeTest.java create mode 100644 brut.apktool/apktool-lib/src/test/resources/decode/issue2836/issue2836.apk diff --git a/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java b/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java index d747b585..e329cc2e 100644 --- a/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java +++ b/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java @@ -167,6 +167,30 @@ public class Main { if (cli.hasOption("m") || cli.hasOption("match-original")) { config.analysisMode = true; } + if (cli.hasOption("res-mode") || cli.hasOption("resolve-resources-mode")) { + String mode = cli.getOptionValue("res-mode"); + if (mode == null) { + mode = cli.getOptionValue("resolve-resources-mode"); + } + switch (mode) { + case "remove": + case "delete": + config.setDecodeResolveMode(Config.DECODE_RES_RESOLVE_REMOVE); + break; + case "dummy": + case "dummies": + config.setDecodeResolveMode(Config.DECODE_RES_RESOLVE_DUMMY); + break; + case "keep": + case "preserve": + config.setDecodeResolveMode(Config.DECODE_RES_RESOLVE_RETAIN); + break; + default: + System.err.println("Unknown resolve resources mode: " + mode); + System.err.println("Expect: 'remove', 'dummy' or 'keep'."); + System.exit(1); + } + } File outDir; if (cli.hasOption("o") || cli.hasOption("output")) { @@ -301,8 +325,6 @@ public class Main { } private static void _Options() { - - // create options Option versionOption = Option.builder("version") .longOpt("version") .desc("Print the version.") @@ -409,6 +431,13 @@ public class Main { .desc("Skip changes detection and build all files.") .build(); + Option resolveResModeOption = Option.builder("resm") + .longOpt("resource-mode") + .desc("Sets the resolve resources mode. Possible values are: 'remove' (default), 'dummy' or 'keep'.") + .hasArg(true) + .argName("mode") + .build(); + Option aaptOption = Option.builder("a") .longOpt("aapt") .hasArg(true) @@ -469,6 +498,7 @@ public class Main { decodeOptions.addOption(apiLevelOption); decodeOptions.addOption(noAssetOption); decodeOptions.addOption(forceManOption); + decodeOptions.addOption(resolveResModeOption); buildOptions.addOption(apiLevelOption); buildOptions.addOption(debugBuiOption); @@ -525,6 +555,7 @@ public class Main { allOptions.addOption(debugDecOption); allOptions.addOption(noDbgOption); allOptions.addOption(forceManOption); + allOptions.addOption(resolveResModeOption); allOptions.addOption(noAssetOption); allOptions.addOption(keepResOption); allOptions.addOption(debugBuiOption); diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/Config.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/Config.java index 9aad41e1..7fa561b0 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/Config.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/Config.java @@ -23,6 +23,7 @@ import java.io.File; import java.util.logging.Logger; public class Config { + private static Config instance = null; private final static Logger LOGGER = Logger.getLogger(Config.class.getName()); public final static short DECODE_SOURCES_NONE = 0x0000; @@ -38,6 +39,10 @@ public class Config { public final static short DECODE_ASSETS_NONE = 0x0000; public final static short DECODE_ASSETS_FULL = 0x0001; + public final static short DECODE_RES_RESOLVE_REMOVE = 0x0000; + public final static short DECODE_RES_RESOLVE_DUMMY = 0x0001; + public final static short DECODE_RES_RESOLVE_RETAIN = 0x0002; + // Build options public boolean forceBuildAll = false; public boolean forceDeleteFramework = false; @@ -55,6 +60,7 @@ public class Config { public short decodeResources = DECODE_RESOURCES_FULL; public short forceDecodeManifest = FORCE_DECODE_MANIFEST_NONE; public short decodeAssets = DECODE_ASSETS_FULL; + public short decodeResolveMode = DECODE_RES_RESOLVE_REMOVE; public int apiLevel = 0; public boolean analysisMode = false; public boolean forceDelete = false; @@ -72,8 +78,23 @@ public class Config { return this.useAapt2 || this.aaptVersion == 2; } - private Config() { + public boolean isDecodeResolveModeUsingDummies() { + return decodeResolveMode == DECODE_RES_RESOLVE_DUMMY; + } + public boolean isDecodeResolveModeRemoving() { + return decodeResolveMode == DECODE_RES_RESOLVE_REMOVE; + } + + private Config() { + instance = this; + } + + public static Config getInstance() { + if (instance == null) { + instance = new Config(); + } + return instance; } private void setDefaultFrameworkDirectory() { @@ -105,6 +126,13 @@ public class Config { decodeSources = mode; } + public void setDecodeResolveMode(short mode) throws AndrolibException { + if (mode != DECODE_RES_RESOLVE_REMOVE && mode != DECODE_RES_RESOLVE_DUMMY && mode != DECODE_RES_RESOLVE_RETAIN) { + throw new AndrolibException("Invalid decode resources mode"); + } + decodeResolveMode = mode; + } + public void setDecodeResources(short mode) throws AndrolibException { if (mode != DECODE_RESOURCES_NONE && mode != DECODE_RESOURCES_FULL) { throw new AndrolibException("Invalid decode resources mode"); diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResResSpec.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResResSpec.java index 338a4e9c..c12b8240 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResResSpec.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResResSpec.java @@ -105,6 +105,10 @@ public class ResResSpec { return mType; } + public boolean isDummyResSpec() { + return getName().startsWith("APKTOOL_DUMMY_"); + } + public void addResource(ResResource res) throws AndrolibException { addResource(res, false); } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTable.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTable.java index f4341d18..1c29ef4f 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTable.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTable.java @@ -70,6 +70,10 @@ public class ResTable { return mConfig.analysisMode; } + public Config getConfig() { + return mConfig; + } + public boolean isMainPkgLoaded() { return mMainPkgLoaded; } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/arsc/FlagItem.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/arsc/FlagItem.java new file mode 100644 index 00000000..4c2dfb4a --- /dev/null +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/arsc/FlagItem.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2010 Ryszard Wiśniewski + * Copyright (C) 2010 Connor Tumbleson + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package brut.androlib.res.data.arsc; + +import brut.androlib.exceptions.AndrolibException; +import brut.androlib.res.data.value.ResReferenceValue; + +public class FlagItem { + public final ResReferenceValue ref; + public final int flag; + public String value; + + public FlagItem(ResReferenceValue ref, int flag) { + this.ref = ref; + this.flag = flag; + } + + public String getValue() throws AndrolibException { + if (value == null) { + if (ref.referentIsNull()) { + return String.format("APKTOOL_MISSING_0x%08x", ref.getRawIntValue()); + } + value = ref.getReferent().getName(); + } + return value; + } +} diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResEnumAttr.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResEnumAttr.java index 1cffc3b6..ed755e2e 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResEnumAttr.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResEnumAttr.java @@ -25,6 +25,7 @@ import org.xmlpull.v1.XmlSerializer; import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.logging.Logger; public class ResEnumAttr extends ResAttr { ResEnumAttr(ResReferenceValue parent, int type, Integer min, Integer max, @@ -46,15 +47,21 @@ public class ResEnumAttr extends ResAttr { } @Override - protected void serializeBody(XmlSerializer serializer, ResResource res) - throws AndrolibException, IOException { + protected void serializeBody(XmlSerializer serializer, ResResource res) throws AndrolibException, IOException { for (Duo duo : mItems) { int intVal = duo.m2.getValue(); + + // #2836 - Support skipping items if the resource cannot be identified. ResResSpec m1Referent = duo.m1.getReferent(); + if (m1Referent == null && shouldRemoveUnknownRes()) { + LOGGER.fine(String.format("null enum reference: m1=0x%08x(%s), m2=0x%08x(%s)", + duo.m1.getRawIntValue(), duo.m1.getType(), duo.m2.getRawIntValue(), duo.m2.getType())); + continue; + } serializer.startTag(null, "enum"); serializer.attribute(null, "name", - m1Referent != null ? m1Referent.getName() : "@null" + m1Referent != null ? m1Referent.getName() : String.format("APKTOOL_MISSING_0x%08x", duo.m1.getRawIntValue()) ); serializer.attribute(null, "value", String.valueOf(intVal)); serializer.endTag(null, "enum"); @@ -81,4 +88,6 @@ public class ResEnumAttr extends ResAttr { private final Duo[] mItems; private final Map mItemsCache = new HashMap<>(); + + private static final Logger LOGGER = Logger.getLogger(ResEnumAttr.class.getName()); } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResFlagsAttr.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResFlagsAttr.java index d69ea509..cb8f89c0 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResFlagsAttr.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResFlagsAttr.java @@ -17,12 +17,15 @@ package brut.androlib.res.data.value; import brut.androlib.exceptions.AndrolibException; +import brut.androlib.res.data.ResResSpec; import brut.androlib.res.data.ResResource; +import brut.androlib.res.data.arsc.FlagItem; import brut.util.Duo; import org.xmlpull.v1.XmlSerializer; import java.io.IOException; import java.util.Arrays; +import java.util.logging.Logger; public class ResFlagsAttr extends ResAttr { ResFlagsAttr(ResReferenceValue parent, int type, Integer min, Integer max, @@ -38,7 +41,7 @@ public class ResFlagsAttr extends ResAttr { @Override public String convertToResXmlFormat(ResScalarValue value) throws AndrolibException { - if(value instanceof ResReferenceValue) { + if (value instanceof ResReferenceValue) { return value.encodeAsResXml(); } if (!(value instanceof ResIntValue)) { @@ -70,13 +73,19 @@ public class ResFlagsAttr extends ResAttr { } @Override - protected void serializeBody(XmlSerializer serializer, ResResource res) - throws AndrolibException, IOException { + protected void serializeBody(XmlSerializer serializer, ResResource res) throws AndrolibException, IOException { for (FlagItem item : mItems) { + ResResSpec referent = item.ref.getReferent(); + + // #2836 - Support skipping items if the resource cannot be identified. + if (referent == null && shouldRemoveUnknownRes()) { + LOGGER.fine(String.format("null flag reference: 0x%08x(%s)", item.ref.getValue(), item.ref.getType())); + continue; + } + serializer.startTag(null, "flag"); serializer.attribute(null, "name", item.getValue()); - serializer.attribute(null, "value", - String.format("0x%08x", item.flag)); + serializer.attribute(null, "value", String.format("0x%08x", item.flag)); serializer.endTag(null, "flag"); } } @@ -130,24 +139,5 @@ public class ResFlagsAttr extends ResAttr { private FlagItem[] mZeroFlags; private FlagItem[] mFlags; - private static class FlagItem { - public final ResReferenceValue ref; - public final int flag; - public String value; - - public FlagItem(ResReferenceValue ref, int flag) { - this.ref = ref; - this.flag = flag; - } - - public String getValue() throws AndrolibException { - if (value == null) { - if (ref.referentIsNull()) { - return "@null"; - } - value = ref.getReferent().getName(); - } - return value; - } - } + private static final Logger LOGGER = Logger.getLogger(ResFlagsAttr.class.getName()); } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResScalarValue.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResScalarValue.java index 21978f77..30ee763b 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResScalarValue.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResScalarValue.java @@ -81,6 +81,11 @@ public abstract class ResScalarValue extends ResIntBasedValue implements } } + // Dummy attributes should be with type attribute + if (res.getResSpec().isDummyResSpec()) { + item = true; + } + // Android does not allow values (false) for ids.xml anymore // https://issuetracker.google.com/issues/80475496 // But it decodes as a ResBoolean, which makes no sense. So force it to empty diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResStyleValue.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResStyleValue.java index ab8dc271..2a81b4db 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResStyleValue.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResStyleValue.java @@ -53,7 +53,7 @@ public class ResStyleValue extends ResBagValue implements ResResSpec spec = mItem.m1.getReferent(); if (spec == null) { - LOGGER.fine(String.format("null reference: m1=0x%08x(%s), m2=0x%08x(%s)", + LOGGER.fine(String.format("null style reference: m1=0x%08x(%s), m2=0x%08x(%s)", mItem.m1.getRawIntValue(), mItem.m1.getType(), mItem.m2.getRawIntValue(), mItem.m2.getType())); continue; } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValue.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValue.java index 1d12f497..dec2394e 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValue.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValue.java @@ -16,6 +16,10 @@ */ package brut.androlib.res.data.value; -public class ResValue { +import brut.androlib.Config; +public class ResValue { + public boolean shouldRemoveUnknownRes() { + return Config.getInstance().isDecodeResolveModeRemoving(); + } } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java index cb702f44..17e15b51 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java @@ -59,11 +59,11 @@ public class ARSCDecoder { mIn = new ExtCountingDataInput(new LittleEndianDataInputStream(arscStream)); mResTable = resTable; mKeepBroken = keepBroken; + mMissingResSpecMap = new LinkedHashMap<>(); } private ResPackage[] readResourceTable() throws IOException, AndrolibException { Set pkgs = new LinkedHashSet<>(); - ResTypeSpec typeSpec; int chunkNumber = 1; @@ -118,6 +118,10 @@ public class ARSCDecoder { } } + if (mResTable.getConfig().isDecodeResolveModeUsingDummies() && mPkg != null && mPkg.getResSpecCount() > 0) { + addMissingResSpecs(); + } + return pkgs.toArray(new ResPackage[0]); } @@ -300,6 +304,7 @@ public class ARSCDecoder { mResId = (mResId & 0xffff0000) | i; int offset = entryOffsetMap.get(i); if (offset == NO_ENTRY) { + mMissingResSpecMap.put(mResId, typeId); continue; } @@ -315,6 +320,8 @@ public class ARSCDecoder { EntryData entryData = readEntryData(); if (entryData != null) { readEntry(entryData); + } else { + mMissingResSpecMap.put(mResId, typeId); } } @@ -589,6 +596,30 @@ public class ARSCDecoder { mResTypeSpecs.put(resTypeSpec.getId(), resTypeSpec); } + private void addMissingResSpecs() throws AndrolibException { + for (int resId : mMissingResSpecMap.keySet()) { + int typeId = mMissingResSpecMap.get(resId); + String resName = "APKTOOL_DUMMY_" + Integer.toHexString(resId); + ResID id = new ResID(resId); + ResResSpec spec = new ResResSpec(id, resName, mPkg, mResTypeSpecs.get(typeId)); + + // If we already have this resID don't add it again. + if (! mPkg.hasResSpec(id)) { + mPkg.addResSpec(spec); + spec.getType().addResSpec(spec); + ResType resType = mPkg.getOrCreateConfig(new ResConfigFlags()); + + // We are going to make dummy attributes a null reference (@null) now instead of a boolean false. + // This is because aapt2 is stricter when it comes to what we can put in an application. + ResValue value = new ResReferenceValue(mPkg, 0, ""); + + ResResource res = new ResResource(resType, spec, value); + resType.addResource(res); + spec.addResource(res); + } + } + } + private ARSCHeader nextChunk() throws IOException { return mHeader = ARSCHeader.read(mIn); } @@ -614,6 +645,7 @@ public class ARSCDecoder { private ResType mType; private int mResId; private int mTypeIdOffset = 0; + private final HashMap mMissingResSpecMap; private final HashMap mResTypeSpecs = new HashMap<>(); private final static short ENTRY_FLAG_COMPLEX = 0x0001; diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/xml/ResXmlPatcher.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/xml/ResXmlPatcher.java index 53cdf52c..0acd9328 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/xml/ResXmlPatcher.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/xml/ResXmlPatcher.java @@ -365,7 +365,7 @@ public final class ResXmlPatcher { * @throws SAXException * @throws ParserConfigurationException */ - private static Document loadDocument(File file) + public static Document loadDocument(File file) throws IOException, SAXException, ParserConfigurationException { DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/TestUtils.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/TestUtils.java index b2b9d2a5..855326ff 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/TestUtils.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/TestUtils.java @@ -18,15 +18,19 @@ package brut.androlib; import brut.androlib.exceptions.AndrolibException; import brut.androlib.res.Framework; +import brut.androlib.res.xml.ResXmlPatcher; import brut.common.BrutException; import brut.directory.DirUtil; import brut.directory.Directory; import brut.directory.FileDirectory; import brut.util.OS; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserFactory; +import javax.xml.parsers.ParserConfigurationException; import java.io.*; import java.net.URL; import java.net.URLDecoder; @@ -77,6 +81,14 @@ public abstract class TestUtils { } } + public static Document getDocumentFromFile(File file) throws BrutException { + try { + return ResXmlPatcher.loadDocument(file); + } catch (ParserConfigurationException | SAXException | IOException ex) { + throw new BrutException(ex); + } + } + public static void copyResourceDir(Class class_, String dirPath, File out) throws BrutException { if (!out.exists()) { out.mkdirs(); diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ResourceModeTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ResourceModeTest.java new file mode 100644 index 00000000..1fbe855d --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ResourceModeTest.java @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2010 Ryszard Wiśniewski + * Copyright (C) 2010 Connor Tumbleson + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package brut.androlib.decode; + +import brut.androlib.ApkDecoder; +import brut.androlib.BaseTest; +import brut.androlib.Config; +import brut.androlib.TestUtils; +import brut.directory.ExtFile; +import brut.common.BrutException; +import brut.util.OS; +import java.io.File; +import java.io.IOException; + +import org.junit.*; +import org.w3c.dom.Document; + +import static org.junit.Assert.*; + +public class ResourceModeTest extends BaseTest { + + @BeforeClass + public static void beforeClass() throws Exception { + TestUtils.cleanFrameworkFile(); + sTmpDir = new ExtFile(OS.createTempDirectory()); + TestUtils.copyResourceDir(ResourceModeTest.class, "decode/issue2836/", sTmpDir); + } + + @AfterClass + public static void afterClass() throws BrutException { + OS.rmdir(sTmpDir); + } + + @Test + public void checkDecodingModeAsRemove() throws BrutException, IOException { + String apk = "issue2836.apk"; + + Config config = Config.getDefaultConfig(); + config.setDecodeResolveMode(Config.DECODE_RES_RESOLVE_REMOVE); + + // decode issue2836.apk + ApkDecoder apkDecoder = new ApkDecoder(config, new File(sTmpDir + File.separator + apk)); + sTestOrigDir = new ExtFile(sTmpDir + File.separator + apk + "remove.out"); + + File outDir = new File(sTmpDir + File.separator + apk + "remove.out"); + apkDecoder.decode(outDir); + + File stringsXml = new File(sTestOrigDir,"res/values/strings.xml"); + assertTrue(stringsXml.isFile()); + + File attrXml = new File(sTestOrigDir,"res/values/attrs.xml"); + Document attrDocument = TestUtils.getDocumentFromFile(attrXml); + assertEquals(3, attrDocument.getElementsByTagName("enum").getLength()); + + File colorXml = new File(sTestOrigDir,"res/values/colors.xml"); + Document colorDocument = TestUtils.getDocumentFromFile(colorXml); + assertEquals(8, colorDocument.getElementsByTagName("color").getLength()); + assertEquals(0, colorDocument.getElementsByTagName("item").getLength()); + + File publicXml = new File(sTestOrigDir,"res/values/public.xml"); + Document publicDocument = TestUtils.getDocumentFromFile(publicXml); + assertEquals(21, publicDocument.getElementsByTagName("public").getLength()); + } + + @Test + public void checkDecodingModeAsDummies() throws BrutException, IOException { + String apk = "issue2836.apk"; + + Config config = Config.getDefaultConfig(); + config.setDecodeResolveMode(Config.DECODE_RES_RESOLVE_DUMMY); + + // decode issue2836.apk + ApkDecoder apkDecoder = new ApkDecoder(config, new File(sTmpDir + File.separator + apk)); + sTestOrigDir = new ExtFile(sTmpDir + File.separator + apk + "dummies.out"); + + File outDir = new File(sTmpDir + File.separator + apk + "dummies.out"); + apkDecoder.decode(outDir); + + File stringsXml = new File(sTestOrigDir,"res/values/strings.xml"); + assertTrue(stringsXml.isFile()); + + File attrXml = new File(sTestOrigDir,"res/values/attrs.xml"); + Document attrDocument = TestUtils.getDocumentFromFile(attrXml); + assertEquals(4, attrDocument.getElementsByTagName("enum").getLength()); + + File colorXml = new File(sTestOrigDir,"res/values/colors.xml"); + Document colorDocument = TestUtils.getDocumentFromFile(colorXml); + assertEquals(8, colorDocument.getElementsByTagName("color").getLength()); + assertEquals(1, colorDocument.getElementsByTagName("item").getLength()); + + File publicXml = new File(sTestOrigDir,"res/values/public.xml"); + Document publicDocument = TestUtils.getDocumentFromFile(publicXml); + assertEquals(22, publicDocument.getElementsByTagName("public").getLength()); + } + + @Test + public void checkDecodingModeAsLeave() throws BrutException, IOException { + String apk = "issue2836.apk"; + + Config config = Config.getDefaultConfig(); + config.setDecodeResolveMode(Config.DECODE_RES_RESOLVE_RETAIN); + + // decode issue2836.apk + ApkDecoder apkDecoder = new ApkDecoder(config, new File(sTmpDir + File.separator + apk)); + sTestOrigDir = new ExtFile(sTmpDir + File.separator + apk + "leave.out"); + + File outDir = new File(sTmpDir + File.separator + apk + "leave.out"); + apkDecoder.decode(outDir); + + File stringsXml = new File(sTestOrigDir,"res/values/strings.xml"); + assertTrue(stringsXml.isFile()); + + File attrXml = new File(sTestOrigDir,"res/values/attrs.xml"); + Document attrDocument = TestUtils.getDocumentFromFile(attrXml); + assertEquals(4, attrDocument.getElementsByTagName("enum").getLength()); + + File colorXml = new File(sTestOrigDir,"res/values/colors.xml"); + Document colorDocument = TestUtils.getDocumentFromFile(colorXml); + assertEquals(8, colorDocument.getElementsByTagName("color").getLength()); + assertEquals(0, colorDocument.getElementsByTagName("item").getLength()); + + File publicXml = new File(sTestOrigDir,"res/values/public.xml"); + Document publicDocument = TestUtils.getDocumentFromFile(publicXml); + assertEquals(21, publicDocument.getElementsByTagName("public").getLength()); + } +} diff --git a/brut.apktool/apktool-lib/src/test/resources/decode/issue2836/issue2836.apk b/brut.apktool/apktool-lib/src/test/resources/decode/issue2836/issue2836.apk new file mode 100644 index 0000000000000000000000000000000000000000..367304fd052bf1df41891941d8bc5d66e94eca98 GIT binary patch literal 54987 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 I$C9G|0mh7$HUIzs literal 0 HcmV?d00001 From 6e3fac2414903d3bdc33f3beeb83e105732d4def Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sat, 9 Sep 2023 09:47:41 -0400 Subject: [PATCH 05/34] refactor: make _options lowercase (#3324) --- .../apktool-cli/src/main/java/brut/apktool/Main.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java b/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java index e329cc2e..6928f886 100644 --- a/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java +++ b/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java @@ -55,7 +55,7 @@ public class Main { CommandLine commandLine; // load options - _Options(); + _options(); try { commandLine = parser.parse(allOptions, args, false); @@ -324,7 +324,7 @@ public class Main { System.out.println(ApktoolProperties.getVersion()); } - private static void _Options() { + private static void _options() { Option versionOption = Option.builder("version") .longOpt("version") .desc("Print the version.") @@ -578,7 +578,7 @@ public class Main { } private static void usage() { - _Options(); + _options(); HelpFormatter formatter = new HelpFormatter(); formatter.setWidth(120); From dd32a3c301607f66de1be61cfe512ffa580ddd5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 06:19:27 -0400 Subject: [PATCH 06/34] build(deps): bump actions/checkout from 3 to 4 (#3327) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/analyze.yml | 2 +- .github/workflows/build.yml | 10 +++++----- .github/workflows/gradle.yml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/analyze.yml b/.github/workflows/analyze.yml index e646dce5..2fe6ed30 100644 --- a/.github/workflows/analyze.yml +++ b/.github/workflows/analyze.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Initialize CodeQL uses: github/codeql-action/init@v2 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 10e99caf..1b098c90 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,7 +27,7 @@ jobs: matrix: file: [ aapt_64, aapt2_64 ] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Verify Executable run: ${{ env.BINARY_PATH }}/macosx/${{ matrix.file }} version - name: Output Static @@ -39,7 +39,7 @@ jobs: matrix: file: [ aapt, aapt_64, aapt2, aapt2_64 ] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Verify Executable run: ${{ env.BINARY_PATH }}/linux/${{ matrix.file }} version - name: Output Static @@ -51,7 +51,7 @@ jobs: matrix: file: [ aapt.exe, aapt_64.exe, aapt2.exe, aapt2_64.exe ] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Verify Executable run: ${{ env.BINARY_PATH }}/windows/${{ matrix.file }} version - name: Output Static @@ -70,7 +70,7 @@ jobs: os: [ ubuntu-latest, macOS-latest, windows-latest ] java: [ 8, 11, 17, 18, 19, 20 ] steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-java@v3 with: distribution: 'zulu' @@ -87,7 +87,7 @@ jobs: needs: - build-and-test-with-Java-8-and-later steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/setup-java@v3 diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 3fad6652..592a77cb 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -16,7 +16,7 @@ jobs: validate-gradle-wrapper: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-java@v3 with: distribution: 'zulu' From c07e4a92e663ce6457d4f430e311a4cf14bbbea6 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Mon, 11 Sep 2023 06:24:23 -0400 Subject: [PATCH 07/34] fix: load type spec if no TYPE_SPEC chunks (#3325) --- .../main/java/brut/androlib/res/decoder/ARSCDecoder.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java index 17e15b51..90bc296c 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java @@ -260,10 +260,16 @@ public class ARSCDecoder { private ResType readTableType() throws IOException, AndrolibException { checkChunkType(ARSCHeader.XML_TYPE_TYPE); int typeId = mIn.readUnsignedByte() - mTypeIdOffset; + + // #3311 - Some older applications have no TYPE_SPEC chunks, but still define TYPE chunks. if (mResTypeSpecs.containsKey(typeId)) { - mResId = (0xff000000 & mResId) | mResTypeSpecs.get(typeId).getId() << 16; mTypeSpec = mResTypeSpecs.get(typeId); + } else { + mTypeSpec = new ResTypeSpec(mTypeNames.getString(typeId - 1), typeId); + addTypeSpec(mTypeSpec); + mPkg.addType(mTypeSpec); } + mResId = (0xff000000 & mResId) | mTypeSpec.getId() << 16; int typeFlags = mIn.readByte(); mIn.skipBytes(2); // reserved From 515af4faf82b12d306a7c1cfe58e2d2787c65f28 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Mon, 11 Sep 2023 19:01:09 -0400 Subject: [PATCH 08/34] Reworks Attr/Array Handler (#3326) * test: add example pkcs key * fix: rework towards ResScalarValue instead of ResIntValue * fix: prefer res name instead of "guessing" based on ids --- .../brut/androlib/res/data/ResTypeSpec.java | 8 ++-- .../res/data/value/ResArrayValue.java | 2 - .../brut/androlib/res/data/value/ResAttr.java | 20 +++++----- .../androlib/res/data/value/ResEnumAttr.java | 12 +++--- .../androlib/res/data/value/ResFlagsAttr.java | 4 +- .../res/data/value/ResPluralsValue.java | 1 - .../res/data/value/ResValueFactory.java | 40 +++++++------------ .../testapp/res/values-mcc001/arrays.xml | 3 ++ 8 files changed, 41 insertions(+), 49 deletions(-) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTypeSpec.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTypeSpec.java index 72a97d50..f1b0cd24 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTypeSpec.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTypeSpec.java @@ -23,9 +23,11 @@ import java.util.*; public final class ResTypeSpec { public static final String RES_TYPE_NAME_ARRAY = "array"; - public static final String RES_TYPE_NAME_PLURALS = "plurals"; - public static final String RES_TYPE_NAME_STYLES = "style"; public static final String RES_TYPE_NAME_ATTR = "attr"; + public static final String RES_TYPE_NAME_ATTR_PRIVATE = "^attr-private"; + public static final String RES_TYPE_NAME_PLURALS = "plurals"; + public static final String RES_TYPE_NAME_STRING = "string"; + public static final String RES_TYPE_NAME_STYLES = "style"; private final String mName; private final Map mResSpecs = new LinkedHashMap<>(); @@ -46,7 +48,7 @@ public final class ResTypeSpec { } public boolean isString() { - return mName.equalsIgnoreCase("string"); + return mName.equalsIgnoreCase(RES_TYPE_NAME_STRING); } public ResResSpec getResSpec(String name) throws AndrolibException { diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResArrayValue.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResArrayValue.java index 732d2e2d..2b1e2046 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResArrayValue.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResArrayValue.java @@ -91,6 +91,4 @@ public class ResArrayValue extends ResBagValue implements ResValuesXmlSerializab private final ResScalarValue[] mItems; private final String[] AllowedArrayTypes = {"string", "integer"}; - - public static final int BAG_KEY_ARRAY_START = 0x02000000; } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResAttr.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResAttr.java index f47b2243..c7324333 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResAttr.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResAttr.java @@ -64,38 +64,39 @@ public class ResAttr extends ResBagValue implements ResValuesXmlSerializable { public static ResAttr factory(ResReferenceValue parent, Duo[] items, ResValueFactory factory, ResPackage pkg) throws AndrolibException { - - int type = ((ResIntValue) items[0].m2).getValue(); - int scalarType = type & 0xffff; Integer min = null, max = null; Boolean l10n = null; int i; for (i = 1; i < items.length; i++) { switch (items[i].m1) { case BAG_KEY_ATTR_MIN: - min = ((ResIntValue) items[i].m2).getValue(); + min = (items[i].m2).getRawIntValue(); continue; case BAG_KEY_ATTR_MAX: - max = ((ResIntValue) items[i].m2).getValue(); + max = (items[i].m2).getRawIntValue(); continue; case BAG_KEY_ATTR_L10N: - l10n = ((ResIntValue) items[i].m2).getValue() != 0; + l10n = (items[i].m2).getRawIntValue() != 0; continue; } break; } + // #2806 - Make sure we handle int-based values and not just ResIntValue + int rawValue = items[0].m2.getRawIntValue(); + int scalarType = rawValue & 0xffff; + if (i == items.length) { return new ResAttr(parent, scalarType, min, max, l10n); } - Duo[] attrItems = new Duo[items.length - i]; + Duo[] attrItems = new Duo[items.length - i]; int j = 0; for (; i < items.length; i++) { int resId = items[i].m1; pkg.addSynthesizedRes(resId); - attrItems[j++] = new Duo<>(factory.newReference(resId, null), (ResIntValue) items[i].m2); + attrItems[j++] = new Duo<>(factory.newReference(resId, null), items[i].m2); } - switch (type & 0xff0000) { + switch (rawValue & 0xff0000) { case TYPE_ENUM: return new ResEnumAttr(parent, scalarType, min, max, l10n, attrItems); case TYPE_FLAGS: @@ -145,7 +146,6 @@ public class ResAttr extends ResBagValue implements ResValuesXmlSerializable { private final Integer mMax; private final Boolean mL10n; - public static final int BAG_KEY_ATTR_TYPE = 0x01000000; private static final int BAG_KEY_ATTR_MIN = 0x01000001; private static final int BAG_KEY_ATTR_MAX = 0x01000002; private static final int BAG_KEY_ATTR_L10N = 0x01000003; diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResEnumAttr.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResEnumAttr.java index ed755e2e..d8ffced4 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResEnumAttr.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResEnumAttr.java @@ -29,7 +29,7 @@ import java.util.logging.Logger; public class ResEnumAttr extends ResAttr { ResEnumAttr(ResReferenceValue parent, int type, Integer min, Integer max, - Boolean l10n, Duo[] items) { + Boolean l10n, Duo[] items) { super(parent, type, min, max, l10n); mItems = items; } @@ -48,8 +48,8 @@ public class ResEnumAttr extends ResAttr { @Override protected void serializeBody(XmlSerializer serializer, ResResource res) throws AndrolibException, IOException { - for (Duo duo : mItems) { - int intVal = duo.m2.getValue(); + for (Duo duo : mItems) { + int intVal = duo.m2.getRawIntValue(); // #2836 - Support skipping items if the resource cannot be identified. ResResSpec m1Referent = duo.m1.getReferent(); @@ -72,8 +72,8 @@ public class ResEnumAttr extends ResAttr { String value2 = mItemsCache.get(value); if (value2 == null) { ResReferenceValue ref = null; - for (Duo duo : mItems) { - if (duo.m2.getValue() == value) { + for (Duo duo : mItems) { + if (duo.m2.getRawIntValue() == value) { ref = duo.m1; break; } @@ -86,7 +86,7 @@ public class ResEnumAttr extends ResAttr { return value2; } - private final Duo[] mItems; + private final Duo[] mItems; private final Map mItemsCache = new HashMap<>(); private static final Logger LOGGER = Logger.getLogger(ResEnumAttr.class.getName()); diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResFlagsAttr.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResFlagsAttr.java index cb8f89c0..c37519f6 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResFlagsAttr.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResFlagsAttr.java @@ -29,12 +29,12 @@ import java.util.logging.Logger; public class ResFlagsAttr extends ResAttr { ResFlagsAttr(ResReferenceValue parent, int type, Integer min, Integer max, - Boolean l10n, Duo[] items) { + Boolean l10n, Duo[] items) { super(parent, type, min, max, l10n); mItems = new FlagItem[items.length]; for (int i = 0; i < items.length; i++) { - mItems[i] = new FlagItem(items[i].m1, items[i].m2.getValue()); + mItems[i] = new FlagItem(items[i].m1, items[i].m2.getRawIntValue()); } } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResPluralsValue.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResPluralsValue.java index 50b3cda5..3be81bdd 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResPluralsValue.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResPluralsValue.java @@ -59,6 +59,5 @@ public class ResPluralsValue extends ResBagValue implements private final ResScalarValue[] mItems; public static final int BAG_KEY_PLURALS_START = 0x01000004; - public static final int BAG_KEY_PLURALS_END = 0x01000009; private static final String[] QUANTITY_MAP = new String[] { "other", "zero", "one", "two", "few", "many" }; } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java index 99e6811c..052621e0 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java @@ -80,39 +80,29 @@ public class ResValueFactory { return new ResStringValue(value, rawValue); } - public ResBagValue bagFactory(int parent, Duo[] items, ResTypeSpec resTypeSpec) throws AndrolibException { + public ResBagValue bagFactory(int parent, Duo[] items, ResTypeSpec resTypeSpec) + throws AndrolibException { ResReferenceValue parentVal = newReference(parent, null); if (items.length == 0) { return new ResBagValue(parentVal); } - int key = items[0].m1; - if (key == ResAttr.BAG_KEY_ATTR_TYPE) { - return ResAttr.factory(parentVal, items, this, mPackage); - } - String resTypeName = resTypeSpec.getName(); - // Android O Preview added an unknown enum for c. This is hardcoded as 0 for now. - if (ResTypeSpec.RES_TYPE_NAME_ARRAY.equals(resTypeName) - || key == ResArrayValue.BAG_KEY_ARRAY_START || key == 0) { - return new ResArrayValue(parentVal, items); + switch (resTypeName) { + case ResTypeSpec.RES_TYPE_NAME_ATTR: + case ResTypeSpec.RES_TYPE_NAME_ATTR_PRIVATE: + return ResAttr.factory(parentVal, items, this, mPackage); + case ResTypeSpec.RES_TYPE_NAME_ARRAY: + return new ResArrayValue(parentVal, items); + case ResTypeSpec.RES_TYPE_NAME_PLURALS: + return new ResPluralsValue(parentVal, items); + default: + if (resTypeName.startsWith(ResTypeSpec.RES_TYPE_NAME_STYLES)) { + return new ResStyleValue(parentVal, items, this); + } + throw new AndrolibException("unsupported res type name for bags. Found: " + resTypeName); } - - if (ResTypeSpec.RES_TYPE_NAME_PLURALS.equals(resTypeName) || - (key >= ResPluralsValue.BAG_KEY_PLURALS_START && key <= ResPluralsValue.BAG_KEY_PLURALS_END)) { - return new ResPluralsValue(parentVal, items); - } - - if (ResTypeSpec.RES_TYPE_NAME_ATTR.equals(resTypeName)) { - return new ResAttr(parentVal, 0, null, null, null); - } - - if (resTypeName.startsWith(ResTypeSpec.RES_TYPE_NAME_STYLES)) { - return new ResStyleValue(parentVal, items, this); - } - - throw new AndrolibException("unsupported res type name for bags. Found: " + resTypeName); } public ResReferenceValue newReference(int resID, String rawValue) { diff --git a/brut.apktool/apktool-lib/src/test/resources/aapt1/testapp/res/values-mcc001/arrays.xml b/brut.apktool/apktool-lib/src/test/resources/aapt1/testapp/res/values-mcc001/arrays.xml index 141babbe..697a79d5 100644 --- a/brut.apktool/apktool-lib/src/test/resources/aapt1/testapp/res/values-mcc001/arrays.xml +++ b/brut.apktool/apktool-lib/src/test/resources/aapt1/testapp/res/values-mcc001/arrays.xml @@ -35,4 +35,7 @@ res/ view/ + + MIICXAIBAAKBgQCjcGqTkOq0CR3rTx0ZSQSIdTrDrFAYl29611xN8aVgMQIWtDB/lD0W5TpKPuU9iaiG/sSn/VYt6EzN7Sr332jj7cyl2WrrHI6ujRswNy4HojMuqtfab5FFDpRmCuvl35fge18OvoQTJELhhJ1EvJ5KUeZiuJ3u3YyMnxxXzLuKbQIDAQABAoGAPrNDz7TKtaLBvaIuMaMXgBopHyQd3jFKbT/tg2Fu5kYm3PrnmCoQfZYXFKCoZUFIS/G1FBVWWGpD/MQ9tbYZkKpwuH+t2rGndMnLXiTC296/s9uix7gsjnT4Naci5N6EN9pVUBwQmGrYUTHFc58ThtelSiPARX7LSU2ibtJSv8ECQQDWBRrrAYmbCUN7ra0DFT6SppaDtvvuKtb+mUeKbg0B8U4y4wCIK5GH8EyQSwUWcXnNBO05rlUPbifsDLv/u82lAkEAw39sTJ0KmJJyaChqvqAJ8guulKlgucQJ0Et9ppZyet9iVwNKX/aW9UlwGBMQdafQ36nd1QMEA8AbAw4D+hw/KQJBANJbHDUGQtk2hrSmZNoV5HXB9Uiq7v4N71k5ER8XwgM5yVGs2tX8dMM3RhnBEtQXXs9LW1uJZSOQcv7JGXNnhN0CQBZenzrJAWxh3XtznHtBfsHWelyCYRIAj4rpCHCmaGUM6IjCVKFUawOYKp5mmAyObkUZf8ue87emJLEdynC1CLkCQHduNjP1hemAGWrd6v8BHhE3kKtcK6KHsPvJR5dOfzbdHAqVePERhISfN6cwZt5p8B3/JUwSR8el66DF7Jm57BM= + From f3936cbd22f931659f7bd47e5a5aaf23ea354006 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Wed, 13 Sep 2023 06:25:47 -0400 Subject: [PATCH 09/34] fix: enforce java 1.8 compatibility with built artifacts (#3330) --- build.gradle.kts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 19784431..04cb52f0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -72,11 +72,6 @@ plugins { signing } -java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - tasks.withType { options.compilerArgs.add("-Xlint:-options") options.compilerArgs.add("--release 8") @@ -95,6 +90,11 @@ subprojects { apply(plugin = "java") apply(plugin = "java-library") + java { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + val mavenProjects = arrayOf("apktool-lib", "apktool-cli", "brut.j.common", "brut.j.util", "brut.j.dir") if (project.name in mavenProjects) { From aea1d68dbc0fdf45fa7737799655b084410613ab Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Mon, 18 Sep 2023 06:18:44 -0400 Subject: [PATCH 10/34] refactor: adjust line to fit 120 length line endings in /value (#3338) --- .../main/java/brut/androlib/res/data/value/ResAttr.java | 3 +-- .../java/brut/androlib/res/data/value/ResBagValue.java | 9 +++------ .../brut/androlib/res/data/value/ResPluralsValue.java | 6 ++---- .../brut/androlib/res/data/value/ResStringValue.java | 1 - .../java/brut/androlib/res/data/value/ResStyleValue.java | 6 ++---- 5 files changed, 8 insertions(+), 17 deletions(-) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResAttr.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResAttr.java index c7324333..982a78c5 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResAttr.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResAttr.java @@ -26,8 +26,7 @@ import org.xmlpull.v1.XmlSerializer; import java.io.IOException; public class ResAttr extends ResBagValue implements ResValuesXmlSerializable { - ResAttr(ResReferenceValue parentVal, int type, Integer min, Integer max, - Boolean l10n) { + ResAttr(ResReferenceValue parentVal, int type, Integer min, Integer max, Boolean l10n) { super(parentVal); mType = type; mMin = min; diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResBagValue.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResBagValue.java index faa36f81..ea77c39e 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResBagValue.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResBagValue.java @@ -36,18 +36,15 @@ public class ResBagValue extends ResValue implements ResValuesXmlSerializable { ResResource res) throws IOException, AndrolibException { String type = res.getResSpec().getType().getName(); if ("style".equals(type)) { - new ResStyleValue(mParent, new Duo[0], null) - .serializeToResValuesXml(serializer, res); + new ResStyleValue(mParent, new Duo[0], null).serializeToResValuesXml(serializer, res); return; } if ("array".equals(type)) { - new ResArrayValue(mParent, new Duo[0]).serializeToResValuesXml( - serializer, res); + new ResArrayValue(mParent, new Duo[0]).serializeToResValuesXml(serializer, res); return; } if ("plurals".equals(type)) { - new ResPluralsValue(mParent, new Duo[0]).serializeToResValuesXml( - serializer, res); + new ResPluralsValue(mParent, new Duo[0]).serializeToResValuesXml(serializer, res); return; } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResPluralsValue.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResPluralsValue.java index 3be81bdd..34e90a42 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResPluralsValue.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResPluralsValue.java @@ -25,10 +25,8 @@ import org.xmlpull.v1.XmlSerializer; import java.io.IOException; -public class ResPluralsValue extends ResBagValue implements - ResValuesXmlSerializable { - ResPluralsValue(ResReferenceValue parent, - Duo[] items) { +public class ResPluralsValue extends ResBagValue implements ResValuesXmlSerializable { + ResPluralsValue(ResReferenceValue parent, Duo[] items) { super(parent); mItems = new ResScalarValue[6]; diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResStringValue.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResStringValue.java index e9ccc684..0cbb49b4 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResStringValue.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResStringValue.java @@ -25,7 +25,6 @@ import java.io.IOException; import java.util.regex.Pattern; public class ResStringValue extends ResScalarValue { - public ResStringValue(String value, int rawValue) { this(value, rawValue, "string"); } diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResStyleValue.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResStyleValue.java index 2a81b4db..397431bf 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResStyleValue.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResStyleValue.java @@ -26,10 +26,8 @@ import org.xmlpull.v1.XmlSerializer; import java.io.IOException; import java.util.logging.Logger; -public class ResStyleValue extends ResBagValue implements - ResValuesXmlSerializable { - ResStyleValue(ResReferenceValue parent, - Duo[] items, ResValueFactory factory) { +public class ResStyleValue extends ResBagValue implements ResValuesXmlSerializable { + ResStyleValue(ResReferenceValue parent, Duo[] items, ResValueFactory factory) { super(parent); mItems = new Duo[items.length]; From f63bbc0be22ba7fea659e88298af78b066433092 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sat, 30 Sep 2023 07:21:58 -0400 Subject: [PATCH 11/34] fix: handle duplicate res entries during a complex resource (#3347) --- .../main/java/brut/androlib/res/decoder/ARSCDecoder.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java index 90bc296c..371aedd5 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java @@ -415,6 +415,12 @@ public class ARSCDecoder { resId = mIn.readInt(); resValue = readValue(); + // #2824 - In some applications the res entries are duplicated with the 2nd being malformed. + // AOSP skips this, so we will do the same. + if (resValue == null) { + continue; + } + if (!(resValue instanceof ResScalarValue)) { resValue = new ResStringValue(resValue.toString(), resValue.getRawIntValue()); } From 9c465321f1c059d313ca36f4b7588a989d7d0904 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sat, 30 Sep 2023 07:27:20 -0400 Subject: [PATCH 12/34] refactor: use static inner classes for AbstractDirectory (#3348) --- .../src/main/java/brut/directory/AbstractDirectory.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/brut.j.dir/src/main/java/brut/directory/AbstractDirectory.java b/brut.j.dir/src/main/java/brut/directory/AbstractDirectory.java index ef7ddf50..ecd5da77 100644 --- a/brut.j.dir/src/main/java/brut/directory/AbstractDirectory.java +++ b/brut.j.dir/src/main/java/brut/directory/AbstractDirectory.java @@ -267,8 +267,7 @@ public abstract class AbstractDirectory implements Directory { protected abstract AbstractDirectory createDirLocal(String name) throws DirectoryException; protected abstract void removeFileLocal(String name); - - private class ParsedPath { + private static class ParsedPath { public final String dir; public final String subpath; public ParsedPath(String dir, String subpath) { @@ -277,7 +276,7 @@ public abstract class AbstractDirectory implements Directory { } } - private class SubPath { + private static class SubPath { public final AbstractDirectory dir; public final String path; From 77b4229d1052aaa36d92f92c5090a5eeb2ed909b Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sat, 30 Sep 2023 07:33:06 -0400 Subject: [PATCH 13/34] refactor: suppress last unused method return (#3349) --- .../apktool-lib/src/main/java/brut/androlib/ApkDecoder.java | 1 + 1 file changed, 1 insertion(+) diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkDecoder.java index 859f589a..1d04985b 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkDecoder.java @@ -88,6 +88,7 @@ public class ApkDecoder { } catch (BrutException ex) { throw new AndrolibException(ex); } + //noinspection ResultOfMethodCallIgnored outDir.mkdirs(); LOGGER.info("Using Apktool " + ApktoolProperties.getVersion() + " on " + mApkInfo.apkFileName); From 93c66ef3734e1d45bcb0205a13e3a82aa90ace62 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sun, 1 Oct 2023 06:08:47 -0400 Subject: [PATCH 14/34] build: migrate towards "libs.versions.toml" (#3353) --- brut.apktool/apktool-cli/build.gradle.kts | 7 +++--- brut.apktool/apktool-lib/build.gradle.kts | 28 +++++++--------------- brut.j.dir/build.gradle.kts | 4 +--- brut.j.util/build.gradle.kts | 7 ++---- build.gradle.kts | 13 +--------- gradle/libs.versions.toml | 29 +++++++++++++++++++++++ settings.gradle.kts | 6 +++++ 7 files changed, 51 insertions(+), 43 deletions(-) create mode 100644 gradle/libs.versions.toml diff --git a/brut.apktool/apktool-cli/build.gradle.kts b/brut.apktool/apktool-cli/build.gradle.kts index 722e8924..f9070836 100644 --- a/brut.apktool/apktool-cli/build.gradle.kts +++ b/brut.apktool/apktool-cli/build.gradle.kts @@ -1,10 +1,9 @@ import proguard.gradle.ProGuardTask -val commonsCliVersion: String by rootProject.extra val apktoolVersion: String by rootProject.extra plugins { - id("com.github.johnrengelman.shadow") + alias(libs.plugins.shadow) application } @@ -14,12 +13,12 @@ plugins { buildscript { dependencies { // Proguard doesn't support plugin DSL - https://github.com/Guardsquare/proguard/issues/225 - classpath("com.guardsquare:proguard-gradle:7.3.2") + classpath(libs.proguard) } } dependencies { - implementation("commons-cli:commons-cli:$commonsCliVersion") + implementation(libs.commons.cli) implementation(project(":brut.apktool:apktool-lib")) } diff --git a/brut.apktool/apktool-lib/build.gradle.kts b/brut.apktool/apktool-lib/build.gradle.kts index 9e7295b4..6a0c8030 100644 --- a/brut.apktool/apktool-lib/build.gradle.kts +++ b/brut.apktool/apktool-lib/build.gradle.kts @@ -1,13 +1,3 @@ -val baksmaliVersion: String by rootProject.extra -val smaliVersion: String by rootProject.extra -val xmlpullVersion: String by rootProject.extra -val guavaVersion: String by rootProject.extra -val commonsLangVersion: String by rootProject.extra -val commonsIoVersion: String by rootProject.extra -val commonsTextVersion: String by rootProject.extra -val junitVersion: String by rootProject.extra -val xmlunitVersion: String by rootProject.extra - val gitRevision: String by rootProject.extra val apktoolVersion: String by rootProject.extra @@ -39,14 +29,14 @@ dependencies { api(project(":brut.j.util")) api(project(":brut.j.common")) - implementation("com.android.tools.smali:smali-baksmali:$baksmaliVersion") - implementation("com.android.tools.smali:smali:$smaliVersion") - implementation("xpp3:xpp3:$xmlpullVersion") - implementation("com.google.guava:guava:$guavaVersion") - implementation("org.apache.commons:commons-lang3:$commonsLangVersion") - implementation("commons-io:commons-io:$commonsIoVersion") - implementation("org.apache.commons:commons-text:$commonsTextVersion") + implementation(libs.baksmali) + implementation(libs.smali) + implementation(libs.xmlpull) + implementation(libs.guava) + implementation(libs.commons.lang3) + implementation(libs.commons.io) + implementation(libs.commons.text) - testImplementation("junit:junit:$junitVersion") - testImplementation("org.xmlunit:xmlunit-legacy:$xmlunitVersion") + testImplementation(libs.junit) + testImplementation(libs.xmlunit) } diff --git a/brut.j.dir/build.gradle.kts b/brut.j.dir/build.gradle.kts index 2792b209..d4865c80 100644 --- a/brut.j.dir/build.gradle.kts +++ b/brut.j.dir/build.gradle.kts @@ -1,7 +1,5 @@ -val commonsIoVersion: String by rootProject.extra - dependencies { implementation(project(":brut.j.common")) implementation(project(":brut.j.util")) - implementation("commons-io:commons-io:$commonsIoVersion") + implementation(libs.commons.io) } diff --git a/brut.j.util/build.gradle.kts b/brut.j.util/build.gradle.kts index b717cd3b..1f3a9234 100644 --- a/brut.j.util/build.gradle.kts +++ b/brut.j.util/build.gradle.kts @@ -1,8 +1,5 @@ -val commonsIoVersion: String by rootProject.extra -val guavaVersion: String by rootProject.extra - dependencies { implementation(project(":brut.j.common")) - implementation("commons-io:commons-io:$commonsIoVersion") - implementation("com.google.guava:guava:$guavaVersion") + implementation(libs.commons.io) + implementation(libs.guava) } diff --git a/build.gradle.kts b/build.gradle.kts index 04cb52f0..f8fd85c0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,16 +1,5 @@ import java.io.ByteArrayOutputStream -val baksmaliVersion by extra("3.0.3") -val commonsCliVersion by extra("1.5.0") -val commonsIoVersion by extra("2.13.0") -val commonsLangVersion by extra("3.13.0") -val commonsTextVersion by extra("1.10.0") -val guavaVersion by extra("32.0.1-jre") -val junitVersion by extra("4.13.2") -val smaliVersion by extra("3.0.3") -val xmlpullVersion by extra("1.1.4c") -val xmlunitVersion by extra("2.9.1") - val version = "2.8.2" val suffix = "SNAPSHOT" @@ -66,7 +55,7 @@ if ("release" !in gradle.startParameter.taskNames) { } plugins { - id("com.github.johnrengelman.shadow") version "8.1.1" + alias(libs.plugins.shadow) `java-library` `maven-publish` signing diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..1ffebb4a --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,29 @@ +[versions] +baksmali = "3.0.3" +commons_io = "2.13.0" +commons_cli = "1.5.0" +commons_lang3 = "3.13.0" +commons_text = "1.10.0" +guava = "32.0.1-jre" +junit = "4.13.2" +proguard = "7.3.2" +shadow = "8.1.1" +smali = "3.0.3" +xmlpull = "1.1.4c" +xmlunit = "2.9.1" + +[libraries] +baksmali = { module = "com.android.tools.smali:smali-baksmali", version.ref = "baksmali" } +commons_cli = { module = "commons-cli:commons-cli", version.ref = "commons_cli"} +commons_io = { module = "commons-io:commons-io", version.ref = "commons_io" } +commons_lang3 = { module = "org.apache.commons:commons-lang3", version.ref = "commons_lang3" } +commons_text = { module = "org.apache.commons:commons-text", version.ref = "commons_text" } +guava = { module = "com.google.guava:guava", version.ref = "guava" } +junit = { module = "junit:junit", version.ref = "junit" } +proguard = { module = "com.guardsquare:proguard-gradle", version.ref = "proguard" } +smali = { module = "com.android.tools.smali:smali", version.ref = "smali" } +xmlpull = { module = "xpp3:xpp3", version.ref = "xmlpull" } +xmlunit = { module = "org.xmlunit:xmlunit-legacy", version.ref = "xmlunit" } + +[plugins] +shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 9fffe0ae..db82a26b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,2 +1,8 @@ rootProject.name = "apktool-cli" include("brut.j.common", "brut.j.util", "brut.j.dir", "brut.apktool:apktool-lib", "brut.apktool:apktool-cli") + +dependencyResolutionManagement { + versionCatalogs { + create("libs") {} + } +} From 23d9ec0e585220199da288ab839be2b3e9fd1333 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sun, 1 Oct 2023 06:26:54 -0400 Subject: [PATCH 15/34] refactor: support more resource-mode params (#3354) --- .../apktool-cli/src/main/java/brut/apktool/Main.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java b/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java index 6928f886..403801dc 100644 --- a/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java +++ b/brut.apktool/apktool-cli/src/main/java/brut/apktool/Main.java @@ -167,11 +167,15 @@ public class Main { if (cli.hasOption("m") || cli.hasOption("match-original")) { config.analysisMode = true; } - if (cli.hasOption("res-mode") || cli.hasOption("resolve-resources-mode")) { - String mode = cli.getOptionValue("res-mode"); + if (cli.hasOption("resm") || cli.hasOption("res-mode") || cli.hasOption("resolve-resources-mode")) { + String mode = cli.getOptionValue("resm"); + if (mode == null) { + mode = cli.getOptionValue("res-mode"); + } if (mode == null) { mode = cli.getOptionValue("resolve-resources-mode"); } + switch (mode) { case "remove": case "delete": From ce6e4c6cf6b47da5f50dc664843be4bce1099fe6 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sun, 1 Oct 2023 06:48:22 -0400 Subject: [PATCH 16/34] build: add dependency graph support (#3355) --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1b098c90..375840d7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -97,6 +97,7 @@ jobs: - name: Build uses: gradle/gradle-build-action@v2.8.0 with: + dependency-graph: generate-and-submit arguments: build shadowJar proguard - name: Upload uses: actions/upload-artifact@v3 From 9265c8bfde50c4174de32049c5af21836a0d00c1 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Sun, 1 Oct 2023 07:42:03 -0400 Subject: [PATCH 17/34] refactor: remake android-framework jar file (#3356) --- .../brut/androlib/android-framework.jar | Bin 4273031 -> 4233851 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/brut.apktool/apktool-lib/src/main/resources/brut/androlib/android-framework.jar b/brut.apktool/apktool-lib/src/main/resources/brut/androlib/android-framework.jar index 02854940b3b238df67d660f49d91c12c193adf5d..769741473d9e82e6a9503a0ed4f24da61bb1425a 100644 GIT binary patch delta 366 zcmXBQyHdhX5P;!u5(0`E3{k_y7;oHEynrHjI~G=%v9zFfcn**m+BBInK7<`J_!Pbd z4s|q6;x3}9Va-&85%gp z1uk)gCR(`04cfRx2VLCZ9uIiL(=@VW|J6tcPgi~@UCZSs|1lZR)l2iak&eglv((~O W`XUIFHPi$!b delta 39832 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 Date: Mon, 2 Oct 2023 06:17:33 -0400 Subject: [PATCH 18/34] build: run ci on changes to "libs.versions.toml" --- .github/workflows/build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 375840d7..6f6e6b53 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,6 +10,7 @@ on: - 'brut.apktool/apktool-lib/src/main/resources/**' - 'brut.apktool/apktool-lib/src/test/**' - '.github/workflows/**' + - 'gradle/libs.versions.toml' - 'gradle/wrapper/**' - 'gradlew' - 'gradlew.bat' From 9b92ddb78ce3d46aa413a76ecf79bf61c79ace95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 06:43:55 -0400 Subject: [PATCH 19/34] build(deps): bump gradle/gradle-build-action from 2.8.0 to 2.9.0 (#3359) Bumps [gradle/gradle-build-action](https://github.com/gradle/gradle-build-action) from 2.8.0 to 2.9.0. - [Release notes](https://github.com/gradle/gradle-build-action/releases) - [Commits](https://github.com/gradle/gradle-build-action/compare/v2.8.0...v2.9.0) --- updated-dependencies: - dependency-name: gradle/gradle-build-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6f6e6b53..77d76a13 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -77,7 +77,7 @@ jobs: distribution: 'zulu' java-version: ${{ matrix.java }} - name: Build and test - uses: gradle/gradle-build-action@v2.8.0 + uses: gradle/gradle-build-action@v2.9.0 with: arguments: build shadowJar proguard @@ -96,7 +96,7 @@ jobs: distribution: 'zulu' java-version: 17 - name: Build - uses: gradle/gradle-build-action@v2.8.0 + uses: gradle/gradle-build-action@v2.9.0 with: dependency-graph: generate-and-submit arguments: build shadowJar proguard From a1f4a4b6c8adb8c2b6fd434426ecc9ca49afd4b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Oct 2023 06:44:03 -0400 Subject: [PATCH 20/34] build(deps): bump commons-io:commons-io from 2.13.0 to 2.14.0 (#3358) Bumps commons-io:commons-io from 2.13.0 to 2.14.0. --- updated-dependencies: - dependency-name: commons-io:commons-io dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1ffebb4a..611f22ae 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] baksmali = "3.0.3" -commons_io = "2.13.0" +commons_io = "2.14.0" commons_cli = "1.5.0" commons_lang3 = "3.13.0" commons_text = "1.10.0" From 45d0a00088b79931ffb0f8eb9ca0df6e278a4b87 Mon Sep 17 00:00:00 2001 From: Ben Curtis Date: Mon, 2 Oct 2023 06:47:40 -0400 Subject: [PATCH 21/34] Add Docker support (#3351) * add Docker image * use latest version in Docker image * Dockerfile optimizations from PR feedback --- .dockerignore | 1 + DOCKER.md | 25 +++++++++++++++++++++++++ Dockerfile | 42 ++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + 4 files changed, 69 insertions(+) create mode 100644 .dockerignore create mode 100644 DOCKER.md create mode 100644 Dockerfile diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..f59ec20a --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +* \ No newline at end of file diff --git a/DOCKER.md b/DOCKER.md new file mode 100644 index 00000000..372c3af9 --- /dev/null +++ b/DOCKER.md @@ -0,0 +1,25 @@ +# Apktool in Docker +We provide an easy way to leverage `apktool`, along with common Android tools such as `zipalign` and `apksigner`, all from within Docker. + +## Building the Docker image +To build the image, use the included Dockerfile: +```bash +docker build -t apktool:latest . +``` + +## Using the Docker image +The best way to use the image is to create aliases to run the internal commands: +```bash +alias apktool="docker run --rm -ti --name=apktool -v \"${PWD}:${PWD}\" -w \"${PWD}\" apktool:latest apktool" +alias zipalign="docker run --rm -ti --name=zipalign -v \"${PWD}:${PWD}\" -w \"${PWD}\" apktool:latest zipalign" +alias apksigner="docker run --rm -ti --name=apksigner -v \"${PWD}:${PWD}\" -w \"${PWD}\" apktool:latest apksigner" +``` + +## Running the commands +You can then utilize these commands as you would if they were natively installed: +```bash +apktool d My.apk -o MyFolder +apktool b MyFolder -o MyNew.apk +zipalign -p -f 4 MyNew.apk MyNewAligned.apk +apksigner sign --ks My.keystore MyNewAligned.apk +``` \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..37a5ef11 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,42 @@ +FROM openjdk:21-slim + +# Latest version as of 2023.10.01 +# Ref: https://developer.android.com/studio/index.html#command-line-tools-only +ARG COMMAND_LINE_TOOLS_VERSION=10406996 + +ARG ANDROID_SDK_ROOT=/opt/android-sdk + +RUN \ + # Update + apt-get update &&\ + \ + # Apktool + apt-get install --no-install-recommends -y curl zipalign &&\ + curl -o /usr/local/bin/apktool https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool &&\ + curl -L -o /usr/local/bin/apktool.jar $(curl -s https://api.github.com/repos/iBotPeaches/Apktool/releases/latest |grep browser_download_url |awk '{print $2}' |sed 's/"//g') &&\ + chmod +x /usr/local/bin/apktool /usr/local/bin/apktool.jar &&\ + \ + # Android SDK + apt-get install -y --no-install-recommends \ + git \ + openssl \ + wget \ + unzip \ + sdkmanager &&\ + curl -o /tmp/tools.zip https://dl.google.com/android/repository/commandlinetools-linux-${COMMAND_LINE_TOOLS_VERSION}_latest.zip &&\ + mkdir -p ${ANDROID_SDK_ROOT}/cmdline-tools &&\ + unzip -q /tmp/tools.zip -d ${ANDROID_SDK_ROOT}/cmdline-tools &&\ + mv ${ANDROID_SDK_ROOT}/cmdline-tools/cmdline-tools ${ANDROID_SDK_ROOT}/cmdline-tools/latest &&\ + rm -v /tmp/tools.zip &&\ + mkdir -p /root/.android/ && touch /root/.android/repositories.cfg &&\ + yes | sdkmanager --licenses &&\ + export BUILD_TOOLS_VERSION=$(sdkmanager --list |grep build-tools |grep -v rc |awk '{print $1}' |sed 's/build-tools;//g' |sort |tail -n1) &&\ + sdkmanager --install "build-tools;${BUILD_TOOLS_VERSION}" &&\ + ln -s ${ANDROID_SDK_ROOT}/build-tools/${BUILD_TOOLS_VERSION} /opt/bin &&\ + \ + # Cleanup + rm -rf /var/lib/apt/lists/* + +ENV PATH ${PATH}:/opt/bin + +CMD ["/usr/local/bin/apktool"] diff --git a/README.md b/README.md index b60a497a..94913b13 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ If you discover a security vulnerability within Apktool, please send an e-mail t - [Downloads Mirror](https://connortumbleson.com/apktool/) - [How to Build](https://ibotpeaches.github.io/Apktool/build/) - [Documentation](https://ibotpeaches.github.io/Apktool/documentation/) +- [Use in Docker](./DOCKER.md) - [Bug Reports](https://github.com/iBotPeaches/Apktool/issues) - [Changelog/Information](https://ibotpeaches.github.io/Apktool/changes/) - [XDA Post](https://forum.xda-developers.com/t/util-dec-2-2020-apktool-tool-for-reverse-engineering-apk-files.1755243/) From 448440b5284709036cd62890d1aaa5971adcc55e Mon Sep 17 00:00:00 2001 From: Ben Curtis Date: Tue, 3 Oct 2023 06:22:31 -0400 Subject: [PATCH 22/34] Added auto-build of docker image (#3361) * added auto-build of docker image * updated instructions * add tag image * clear refs/tags * dockerfile updates * build: adjust workflow to remove qemu and collision on github_* --------- Co-authored-by: Connor Tumbleson --- .github/workflows/docker.yml | 53 ++++++++++++++++++++++++++++++++++++ DOCKER.md | 14 ++++++---- 2 files changed, 61 insertions(+), 6 deletions(-) create mode 100644 .github/workflows/docker.yml diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 00000000..5474ab80 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,53 @@ +name: Build and push docker + +on: + release: + types: [published] + +# Use the below to integrate into a Beta build from master +# Changes to the Dockerfile to use the manually built Jar +# from the build automation would be required. +# on: +# pull_request: +# branches: [master] +# types: [closed] + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + + build_and_push: + name: Build and push + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v4 + - name: Log in to the Container registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Get hash + id: hash + run: echo "APKTOOL_HASH=$(echo $GITHUB_SHA | cut -c 1-6)" >> $GITHUB_ENV + - name: Get release tag + id: tag + run: echo "APKTOOL_TAG=$(echo ${GITHUB_REF:-no-tag} |sed 's|refs/tags/||g')" >> $GITHUB_ENV + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Build and push Docker image + uses: docker/build-push-action@v4 + with: + context: . + platforms: linux/amd64 + file: ./Dockerfile + push: true + tags: | + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.APKTOOL_HASH }} + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.APKTOOL_TAG }} + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest diff --git a/DOCKER.md b/DOCKER.md index 372c3af9..4060c8ac 100644 --- a/DOCKER.md +++ b/DOCKER.md @@ -2,17 +2,19 @@ We provide an easy way to leverage `apktool`, along with common Android tools such as `zipalign` and `apksigner`, all from within Docker. ## Building the Docker image -To build the image, use the included Dockerfile: +To use the image, pull or build with the included Dockerfile: ```bash -docker build -t apktool:latest . +docker pull ghcr.io/ibotpeaches/apktool:latest +# OR +docker build -t apktool:local . ``` ## Using the Docker image -The best way to use the image is to create aliases to run the internal commands: +The best way to use the image is to create aliases to run the internal commands. Replace `ghcr.io/ibotpeaches/apktool:latest` with `apktool:local` if you have built the image locally. ```bash -alias apktool="docker run --rm -ti --name=apktool -v \"${PWD}:${PWD}\" -w \"${PWD}\" apktool:latest apktool" -alias zipalign="docker run --rm -ti --name=zipalign -v \"${PWD}:${PWD}\" -w \"${PWD}\" apktool:latest zipalign" -alias apksigner="docker run --rm -ti --name=apksigner -v \"${PWD}:${PWD}\" -w \"${PWD}\" apktool:latest apksigner" +alias apktool="docker run --rm -ti --name=apktool -v \"${PWD}:${PWD}\" -w \"${PWD}\" ghcr.io/ibotpeaches/apktool:latest apktool" +alias zipalign="docker run --rm -ti --name=zipalign -v \"${PWD}:${PWD}\" -w \"${PWD}\" ghcr.io/ibotpeaches/apktool:latest zipalign" +alias apksigner="docker run --rm -ti --name=apksigner -v \"${PWD}:${PWD}\" -w \"${PWD}\" ghcr.io/ibotpeaches/apktool:latest apksigner" ``` ## Running the commands From 91a5863f16c4ce3214e20d932890cf2b5f328b2a Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Wed, 4 Oct 2023 19:03:12 -0400 Subject: [PATCH 23/34] build: update aapt/aapt2 with win/linux binaries (#3360) * build: update aapt/aapt2 with win/linux binaries * build: update aapt/aapt2 with mac binaries --- .../src/main/resources/prebuilt/linux/aapt | Bin 2845532 -> 2846268 bytes .../src/main/resources/prebuilt/linux/aapt2 | Bin 5836628 -> 5835604 bytes .../main/resources/prebuilt/linux/aapt2_64 | Bin 5476336 -> 5475728 bytes .../src/main/resources/prebuilt/linux/aapt_64 | Bin 2907584 -> 2908512 bytes .../main/resources/prebuilt/macosx/aapt2_64 | Bin 8588184 -> 8588136 bytes .../main/resources/prebuilt/macosx/aapt_64 | Bin 3532040 -> 2361704 bytes .../main/resources/prebuilt/windows/aapt.exe | Bin 1631232 -> 1631744 bytes .../main/resources/prebuilt/windows/aapt2.exe | Bin 3859968 -> 3857920 bytes .../resources/prebuilt/windows/aapt2_64.exe | Bin 4367872 -> 4365824 bytes .../resources/prebuilt/windows/aapt_64.exe | Bin 1801728 -> 1802240 bytes 10 files changed, 0 insertions(+), 0 deletions(-) diff --git a/brut.apktool/apktool-lib/src/main/resources/prebuilt/linux/aapt b/brut.apktool/apktool-lib/src/main/resources/prebuilt/linux/aapt index 7036ca4e88a81afaaacc65f2dd1af2680ab2a7f9..76e3d1e0da01dc25f4642611c8f5a77341bc07c9 100755 GIT binary patch delta 587668 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%0AYaV>IHn%-X^G|0GHZ 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

4);YRJf_sKpd17E@$o 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