diff --git a/core/src/main/jni/include/elf_util.h b/core/src/main/jni/include/elf_util.h index 3bb9bde8..0643ff63 100644 --- a/core/src/main/jni/include/elf_util.h +++ b/core/src/main/jni/include/elf_util.h @@ -25,6 +25,7 @@ #include #include #include +#include #include "config.h" #define SHT_GNU_HASH 0x6ffffff6 @@ -48,7 +49,7 @@ namespace SandHook { template requires(std::is_pointer_v) - constexpr const T getSymbPrefixFirstOffset(std::string_view prefix) const { + constexpr const T getSymbPrefixFirstAddress(std::string_view prefix) const { auto offset = PrefixLookupFirst(prefix); if (offset > 0 && base != nullptr) { return reinterpret_cast(static_cast((uintptr_t) base + offset - bias)); @@ -57,6 +58,18 @@ namespace SandHook { } } + template + requires(std::is_pointer_v) + const std::vector getAllSymbAddress(std::string_view name) const { + auto offsets = LinearRangeLookup(name); + std::vector res; + res.reserve(offsets.size()); + for (const auto &offset : offsets) { + res.emplace_back(reinterpret_cast(static_cast((uintptr_t) base + offset - bias))); + } + return res; + } + bool isValid() const { return base != nullptr; } @@ -76,6 +89,8 @@ namespace SandHook { ElfW(Addr) LinearLookup(std::string_view name) const; + std::vector LinearRangeLookup(std::string_view name) const; + ElfW(Addr) PrefixLookupFirst(std::string_view prefix) const; constexpr static uint32_t 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 711286e2..0ba31ad2 100644 --- a/core/src/main/jni/src/elf_util.cpp +++ b/core/src/main/jni/src/elf_util.cpp @@ -190,6 +190,17 @@ ElfW(Addr) ElfImg::LinearLookup(std::string_view name) const { } } +std::vector ElfImg::LinearRangeLookup(std::string_view name) const { + MayInitLinearMap(); + std::vector res; + for (auto [i, end] = symtabs_.equal_range(name); i != end; ++i) { + auto offset = i->second->st_value; + res.emplace_back(offset); + LOGD("found {} {:#x} in {} in symtab by linear range lookup", name, offset, elf); + } + return res; +} + 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)) { diff --git a/magisk-loader/src/main/jni/src/magisk_loader.cpp b/magisk-loader/src/main/jni/src/magisk_loader.cpp index a82b7ec4..ec81a8a3 100644 --- a/magisk-loader/src/main/jni/src/magisk_loader.cpp +++ b/magisk-loader/src/main/jni/src/magisk_loader.cpp @@ -131,7 +131,7 @@ namespace lspd { return GetArt()->getSymbAddress(symbol); }, .art_symbol_prefix_resolver = [](auto symbol) { - return GetArt()->getSymbPrefixFirstOffset(symbol); + return GetArt()->getSymbPrefixFirstAddress(symbol); }, }; InitHooks(env, initInfo); @@ -205,7 +205,7 @@ namespace lspd { return GetArt()->getSymbAddress(symbol); }, .art_symbol_prefix_resolver = [](auto symbol) { - return GetArt()->getSymbPrefixFirstOffset(symbol); + return GetArt()->getSymbPrefixFirstAddress(symbol); }, }; auto [dex_fd, size] = instance->RequestLSPDex(env, binder);