diff options
author | 2022-09-14 15:17:29 +0800 | |
---|---|---|
committer | 2022-12-01 13:53:31 +0000 | |
commit | 78a8d373cad4d8c27bb09fa894a81f59c90cbbad (patch) | |
tree | 2f1dcf9b523c3efa6f4087671aaa82fe37ecf6a8 /tools/aapt2/optimize | |
parent | b4de8520bfd80f14a9920b3fdcadb05f4d0d40b6 (diff) |
Dump the deobfuscate data using Protocol buffers
Using Google Protocol buffers to dump the obfuscating mapping
information of being used to deobfuscate items.
* shortened file path -> original file path
* resource id -> original resource name
This patch add a new option --save-obfuscating-map to deprecate
--resource-path-shortening-map. The option
--resource-path-shortening-map is kept until no one to use it.
Bug: 246489170
Bug: 228192695
b/228192695#comment2
Test: make WITH_TIDY=1 aapt2
Test: atest aapt2_test
Change-Id: I29733c4dbae9f6dd2f0e9b2c87b0d2046662fc59
Diffstat (limited to 'tools/aapt2/optimize')
-rw-r--r-- | tools/aapt2/optimize/Obfuscator.cpp | 24 | ||||
-rw-r--r-- | tools/aapt2/optimize/Obfuscator.h | 3 | ||||
-rw-r--r-- | tools/aapt2/optimize/Obfuscator_test.cpp | 60 |
3 files changed, 87 insertions, 0 deletions
diff --git a/tools/aapt2/optimize/Obfuscator.cpp b/tools/aapt2/optimize/Obfuscator.cpp index 2533f8079c39..cc21093084b5 100644 --- a/tools/aapt2/optimize/Obfuscator.cpp +++ b/tools/aapt2/optimize/Obfuscator.cpp @@ -16,6 +16,7 @@ #include "optimize/Obfuscator.h" +#include <fstream> #include <map> #include <set> #include <string> @@ -192,6 +193,29 @@ bool Obfuscator::Consume(IAaptContext* context, ResourceTable* table) { return true; } +bool Obfuscator::WriteObfuscationMap(const std::string& file_path) const { + pb::ResourceMappings resourceMappings; + for (const auto& [id, name] : options_.id_resource_map) { + auto* collapsedNameMapping = resourceMappings.mutable_collapsed_names()->add_resource_names(); + collapsedNameMapping->set_id(id); + collapsedNameMapping->set_name(name); + } + + for (const auto& [original_path, shortened_path] : options_.shortened_path_map) { + auto* resource_path = resourceMappings.mutable_shortened_paths()->add_resource_paths(); + resource_path->set_original_path(original_path); + resource_path->set_shortened_path(shortened_path); + } + + { // RAII style, output the pb content to file and close fout in destructor + std::ofstream fout(file_path, std::ios::out | std::ios::trunc | std::ios::binary); + if (!fout.is_open()) { + return false; + } + return resourceMappings.SerializeToOstream(&fout); + } +} + /** * Tell the optimizer whether it's needed to dump information for de-obfuscating. * diff --git a/tools/aapt2/optimize/Obfuscator.h b/tools/aapt2/optimize/Obfuscator.h index 786bf8c9ed93..5ccf54383aae 100644 --- a/tools/aapt2/optimize/Obfuscator.h +++ b/tools/aapt2/optimize/Obfuscator.h @@ -20,6 +20,7 @@ #include <set> #include <string> +#include "ResourceMetadata.pb.h" #include "ResourceTable.h" #include "android-base/function_ref.h" #include "android-base/macros.h" @@ -38,6 +39,8 @@ class Obfuscator : public IResourceTableConsumer { bool Consume(IAaptContext* context, ResourceTable* table) override; + bool WriteObfuscationMap(const std::string& file_path) const; + bool IsEnabled() const; enum class Result { Obfuscated, Keep_ExemptionList, Keep_Overlayable }; diff --git a/tools/aapt2/optimize/Obfuscator_test.cpp b/tools/aapt2/optimize/Obfuscator_test.cpp index 17d1e5262b76..7f57b71ddf76 100644 --- a/tools/aapt2/optimize/Obfuscator_test.cpp +++ b/tools/aapt2/optimize/Obfuscator_test.cpp @@ -21,10 +21,14 @@ #include <string> #include "ResourceTable.h" +#include "android-base/file.h" #include "test/Test.h" using ::aapt::test::GetValue; +using ::testing::AnyOf; using ::testing::Eq; +using ::testing::HasSubstr; +using ::testing::IsTrue; using ::testing::Not; using ::testing::NotNull; @@ -236,4 +240,60 @@ TEST(ObfuscatorTest, IsEnabledWithShortenPathAndCollapseStringPoolOption) { ASSERT_THAT(obfuscatorWithCollapseStringPoolOption.IsEnabled(), Eq(true)); } +static std::unique_ptr<ResourceTable> getProtocolBufferTableUnderTest() { + std::string original_xml_path = "res/drawable/xmlfile.xml"; + std::string original_png_path = "res/drawable/pngfile.png"; + + return test::ResourceTableBuilder() + .AddFileReference("com.app.test:drawable/xmlfile", original_xml_path) + .AddFileReference("com.app.test:drawable/pngfile", original_png_path) + .AddValue("com.app.test:color/mycolor", aapt::ResourceId(0x7f020000), + aapt::util::make_unique<aapt::BinaryPrimitive>( + uint8_t(android::Res_value::TYPE_INT_COLOR_ARGB8), 0xffaabbcc)) + .AddString("com.app.test:string/mystring", ResourceId(0x7f030000), "hello world") + .Build(); +} + +TEST(ObfuscatorTest, WriteObfuscationMapInProtocolBufferFormat) { + OptimizeOptions options{.shorten_resource_paths = true}; + options.table_flattener_options.collapse_key_stringpool = true; + Obfuscator obfuscator(options); + ASSERT_TRUE(obfuscator.Consume(test::ContextBuilder().Build().get(), + getProtocolBufferTableUnderTest().get())); + + obfuscator.WriteObfuscationMap("obfuscated_map.pb"); + + std::string pbOut; + android::base::ReadFileToString("obfuscated_map.pb", &pbOut, false /* follow_symlinks */); + EXPECT_THAT(pbOut, HasSubstr("drawable/xmlfile.xml")); + EXPECT_THAT(pbOut, HasSubstr("drawable/pngfile.png")); + EXPECT_THAT(pbOut, HasSubstr("mycolor")); + EXPECT_THAT(pbOut, HasSubstr("mystring")); + pb::ResourceMappings resourceMappings; + EXPECT_THAT(resourceMappings.ParseFromString(pbOut), IsTrue()); + EXPECT_THAT(resourceMappings.collapsed_names().resource_names_size(), Eq(2)); + auto& resource_names = resourceMappings.collapsed_names().resource_names(); + EXPECT_THAT(resource_names.at(0).name(), AnyOf(Eq("mycolor"), Eq("mystring"))); + EXPECT_THAT(resource_names.at(1).name(), AnyOf(Eq("mycolor"), Eq("mystring"))); + auto& shortened_paths = resourceMappings.shortened_paths(); + EXPECT_THAT(shortened_paths.resource_paths_size(), Eq(2)); + EXPECT_THAT(shortened_paths.resource_paths(0).original_path(), + AnyOf(Eq("res/drawable/pngfile.png"), Eq("res/drawable/xmlfile.xml"))); + EXPECT_THAT(shortened_paths.resource_paths(1).original_path(), + AnyOf(Eq("res/drawable/pngfile.png"), Eq("res/drawable/xmlfile.xml"))); +} + +TEST(ObfuscatorTest, WriteObfuscatingMapWithNonEnabledOption) { + OptimizeOptions options; + Obfuscator obfuscator(options); + ASSERT_TRUE(obfuscator.Consume(test::ContextBuilder().Build().get(), + getProtocolBufferTableUnderTest().get())); + + obfuscator.WriteObfuscationMap("obfuscated_map.pb"); + + std::string pbOut; + android::base::ReadFileToString("obfuscated_map.pb", &pbOut, false /* follow_symlinks */); + ASSERT_THAT(pbOut, Eq("")); +} + } // namespace aapt |