From 7d5778a01c59bd6c75b69e450aa755b86213b8dc Mon Sep 17 00:00:00 2001 From: LoveSy Date: Wed, 27 Apr 2022 11:29:32 +0800 Subject: [PATCH] Update elf util & lsplant to support A13B1 arm (#1894) --- README.md | 2 +- core/src/main/jni/include/elf_util.h | 33 +++++++++++-------- core/src/main/jni/src/elf_util.cpp | 17 ++++++++-- core/src/main/jni/src/jni/resources_hook.cpp | 2 +- core/src/main/jni/src/symbol_cache.cpp | 4 +-- external/lsplant | 2 +- magisk-loader/magisk_module/module.prop | 2 +- .../src/main/jni/src/magisk_loader.cpp | 10 ++++-- 8 files changed, 49 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index fbc43abfb5f..b5e24f865e5 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ A Riru / Zygisk module trying to provide an ART hooking framework which delivers ## Supported Versions -Android 8.1 ~ 13 DP2 +Android 8.1 ~ 13 Beta 1 ## Install diff --git a/core/src/main/jni/include/elf_util.h b/core/src/main/jni/include/elf_util.h index 24387f05685..3bb9bde8396 100644 --- a/core/src/main/jni/include/elf_util.h +++ b/core/src/main/jni/include/elf_util.h @@ -21,7 +21,7 @@ #define SANDHOOK_ELF_UTIL_H #include -#include +#include #include #include #include @@ -35,23 +35,26 @@ namespace SandHook { ElfImg(std::string_view elf); - constexpr ElfW(Addr) getSymbOffset(std::string_view name) const { - return getSymbOffset(name, GnuHash(name), ElfHash(name)); - } - - constexpr ElfW(Addr) getSymbAddress(std::string_view name) const { - ElfW(Addr) offset = getSymbOffset(name); + template + requires(std::is_pointer_v) + constexpr const T getSymbAddress(std::string_view name) const { + auto offset = getSymbOffset(name, GnuHash(name), ElfHash(name)); if (offset > 0 && base != nullptr) { - return static_cast((uintptr_t) base + offset - bias); + return reinterpret_cast(static_cast((uintptr_t) base + offset - bias)); } else { - return 0; + return nullptr; } } - template + template requires(std::is_pointer_v) - constexpr T getSymbAddress(std::string_view name) const { - return reinterpret_cast(getSymbAddress(name)); + constexpr const T getSymbPrefixFirstOffset(std::string_view prefix) const { + auto offset = PrefixLookupFirst(prefix); + if (offset > 0 && base != nullptr) { + return reinterpret_cast(static_cast((uintptr_t) base + offset - bias)); + } else { + return nullptr; + } } bool isValid() const { @@ -73,12 +76,16 @@ namespace SandHook { ElfW(Addr) LinearLookup(std::string_view name) const; + ElfW(Addr) PrefixLookupFirst(std::string_view prefix) const; + constexpr static uint32_t ElfHash(std::string_view name); constexpr static uint32_t GnuHash(std::string_view name); bool findModuleBase(); + void MayInitLinearMap() const; + std::string elf; void *base = nullptr; char *buffer = nullptr; @@ -111,7 +118,7 @@ namespace SandHook { uint32_t *gnu_bucket_; uint32_t *gnu_chain_; - mutable std::unordered_map symtabs_; + mutable std::map symtabs_; }; constexpr uint32_t ElfImg::ElfHash(std::string_view name) { diff --git a/core/src/main/jni/src/elf_util.cpp b/core/src/main/jni/src/elf_util.cpp index d35b6616493..711286e28fc 100644 --- a/core/src/main/jni/src/elf_util.cpp +++ b/core/src/main/jni/src/elf_util.cpp @@ -166,9 +166,8 @@ ElfW(Addr) ElfImg::GnuLookup(std::string_view name, uint32_t hash) const { return 0; } -ElfW(Addr) ElfImg::LinearLookup(std::string_view name) const { +void ElfImg::MayInitLinearMap() const { if (symtabs_.empty()) { - symtabs_.reserve(symtab_count); if (symtab_start != nullptr && symstr_offset_for_symtab != 0) { for (ElfW(Off) i = 0; i < symtab_count; i++) { unsigned int st_type = ELF_ST_TYPE(symtab_start[i].st_info); @@ -180,6 +179,10 @@ ElfW(Addr) ElfImg::LinearLookup(std::string_view name) const { } } } +} + +ElfW(Addr) ElfImg::LinearLookup(std::string_view name) const { + MayInitLinearMap(); if (auto i = symtabs_.find(name); i != symtabs_.end()) { return i->second->st_value; } else { @@ -187,6 +190,16 @@ ElfW(Addr) ElfImg::LinearLookup(std::string_view name) const { } } +ElfW(Addr) ElfImg::PrefixLookupFirst(std::string_view prefix) const { + MayInitLinearMap(); + if (auto i = symtabs_.lower_bound(prefix); i != symtabs_.end() && i->first.starts_with(prefix)) { + LOGD("found prefix {} of {} {:#x} in {} in symtab by linear lookup", prefix, i->first, i->second->st_value, elf); + return i->second->st_value; + } else { + return 0; + } +} + ElfImg::~ElfImg() { //open elf file local diff --git a/core/src/main/jni/src/jni/resources_hook.cpp b/core/src/main/jni/src/jni/resources_hook.cpp index ccd2965297d..6c0cb5973b5 100644 --- a/core/src/main/jni/src/jni/resources_hook.cpp +++ b/core/src/main/jni/src/jni/resources_hook.cpp @@ -77,7 +77,7 @@ namespace lspd { } return android::ResStringPool::setup(HookHandler{ .art_symbol_resolver = [&](auto s) { - return fw.template getSymbAddress(s); + return fw.template getSymbAddress(s); } }); } diff --git a/core/src/main/jni/src/symbol_cache.cpp b/core/src/main/jni/src/symbol_cache.cpp index ce0d5827dd1..2b07315d2de 100644 --- a/core/src/main/jni/src/symbol_cache.cpp +++ b/core/src/main/jni/src/symbol_cache.cpp @@ -47,7 +47,7 @@ namespace lspd { bool FindLibArt() { auto &art = GetArt(); if (!art->isValid()) return false; - return symbol_cache->setTableOverride = art->getSymbAddress( + return symbol_cache->setTableOverride = art->getSymbAddress( "_ZN3art9JNIEnvExt16SetTableOverrideEPK18JNINativeInterface"); } @@ -60,7 +60,7 @@ namespace lspd { return; } auto ok = FindLibArt(); - symbol_cache->do_dlopen = SandHook::ElfImg("/linker").getSymbAddress( + symbol_cache->do_dlopen = SandHook::ElfImg("/linker").getSymbAddress( "__dl__Z9do_dlopenPKciPK17android_dlextinfoPKv"); if (!ok) [[unlikely]] { GetArt(true); diff --git a/external/lsplant b/external/lsplant index 9c63dcecf38..050348fd083 160000 --- a/external/lsplant +++ b/external/lsplant @@ -1 +1 @@ -Subproject commit 9c63dcecf38f0ae34c4a67c4f1fb3bd8bd377f0f +Subproject commit 050348fd08325321c7a67ce6355ddcd51bcace57 diff --git a/magisk-loader/magisk_module/module.prop b/magisk-loader/magisk_module/module.prop index d24781fb502..62dc5057504 100644 --- a/magisk-loader/magisk_module/module.prop +++ b/magisk-loader/magisk_module/module.prop @@ -3,5 +3,5 @@ name=${api} - LSPosed version=${versionName} (${versionCode}) versionCode=${versionCode} author=${authorList} -description=Another enhanced implementation of Xposed Framework. Supports Android 8.1 ~ 13 DP2. ${requirement}. +description=Another enhanced implementation of Xposed Framework. Supports Android 8.1 ~ 13 Beta 1. ${requirement}. updateJson=${updateJson} diff --git a/magisk-loader/src/main/jni/src/magisk_loader.cpp b/magisk-loader/src/main/jni/src/magisk_loader.cpp index 07bbc39ea38..a82b7ec4ac3 100644 --- a/magisk-loader/src/main/jni/src/magisk_loader.cpp +++ b/magisk-loader/src/main/jni/src/magisk_loader.cpp @@ -128,7 +128,10 @@ namespace lspd { return UnhookFunction(t) == RT_SUCCESS ; }, .art_symbol_resolver = [](auto symbol) { - return GetArt()->getSymbAddress(symbol); + return GetArt()->getSymbAddress(symbol); + }, + .art_symbol_prefix_resolver = [](auto symbol) { + return GetArt()->getSymbPrefixFirstOffset(symbol); }, }; InitHooks(env, initInfo); @@ -199,7 +202,10 @@ namespace lspd { return UnhookFunction(t) == RT_SUCCESS; }, .art_symbol_resolver = [](auto symbol){ - return GetArt()->getSymbAddress(symbol); + return GetArt()->getSymbAddress(symbol); + }, + .art_symbol_prefix_resolver = [](auto symbol) { + return GetArt()->getSymbPrefixFirstOffset(symbol); }, }; auto [dex_fd, size] = instance->RequestLSPDex(env, binder);