From c5ff4c0e3af4ee5d8066986adc6f669596b74b26 Mon Sep 17 00:00:00 2001 From: JingMatrix Date: Wed, 4 Dec 2024 11:55:28 +0100 Subject: [PATCH] Abandon PLT hook for LSPlant See the previous commit for reasons. --- README.md | 2 +- .../src/main/jni/api/zygisk_main.cpp | 7 +- .../src/main/jni/src/magisk_loader.cpp | 75 +------------------ .../src/main/jni/src/magisk_loader.h | 23 ++++-- 4 files changed, 21 insertions(+), 86 deletions(-) diff --git a/README.md b/README.md index 7eb2a8d2..1127bf99 100644 --- a/README.md +++ b/README.md @@ -56,8 +56,8 @@ You can contribute translation [here](https://crowdin.com/project/lsposed_jingma - [Magisk](https://github.com/topjohnwu/Magisk/): makes all these possible - [XposedBridge](https://github.com/rovo89/XposedBridge): the OG Xposed framework APIs -- [Dobby](https://github.com/JingMatrix/Dobby): fallback of PLT hook and inline hooker for `native_api` implement - [LSPlant](https://github.com/JingMatrix/LSPlant): the core ART hooking framework +- [Dobby](https://github.com/JingMatrix/Dobby): inline hooker for `LSPlant` and `native_api` implement - [EdXposed](https://github.com/ElderDrivers/EdXposed): fork source - [xz-embedded](https://github.com/tukaani-project/xz-embedded): decompress `.gnu_debugdata` header section of stripped `libart.so` - ~~[Riru](https://github.com/RikkaApps/Riru): provides a way to inject code into zygote process~~ diff --git a/magisk-loader/src/main/jni/api/zygisk_main.cpp b/magisk-loader/src/main/jni/api/zygisk_main.cpp index 8c61c8fd..1eca2b35 100644 --- a/magisk-loader/src/main/jni/api/zygisk_main.cpp +++ b/magisk-loader/src/main/jni/api/zygisk_main.cpp @@ -23,10 +23,7 @@ #include #include "config_impl.h" -#include "loader.h" -#include "logging.h" #include "magisk_loader.h" -#include "symbol_cache.h" #include "zygisk.hpp" namespace lspd { @@ -51,7 +48,7 @@ class ZygiskModule : public zygisk::ModuleBase { } void postAppSpecialize(const zygisk::AppSpecializeArgs *args) override { - MagiskLoader::GetInstance()->OnNativeForkAndSpecializePost(env_, api_, args->nice_name, + MagiskLoader::GetInstance()->OnNativeForkAndSpecializePost(env_, args->nice_name, args->app_data_dir); if (*allowUnload) api_->setOption(zygisk::DLCLOSE_MODULE_LIBRARY); } @@ -69,7 +66,7 @@ class ZygiskModule : public zygisk::ModuleBase { env_->DeleteLocalRef(name); env_->DeleteLocalRef(process); } - MagiskLoader::GetInstance()->OnNativeForkSystemServerPost(env_, api_); + MagiskLoader::GetInstance()->OnNativeForkSystemServerPost(env_); if (*allowUnload) api_->setOption(zygisk::DLCLOSE_MODULE_LIBRARY); } }; diff --git a/magisk-loader/src/main/jni/src/magisk_loader.cpp b/magisk-loader/src/main/jni/src/magisk_loader.cpp index 8a350484..5d47a6d3 100644 --- a/magisk-loader/src/main/jni/src/magisk_loader.cpp +++ b/magisk-loader/src/main/jni/src/magisk_loader.cpp @@ -25,13 +25,9 @@ #include #include -#include #include -#include "../src/native_api.h" #include "config_impl.h" -#include "elf_util.h" -#include "loader.h" #include "service.h" #include "symbol_cache.h" #include "utils/jni_helper.hpp" @@ -93,70 +89,6 @@ std::vector MapInfo::Scan(std::string_view pid) { return info; } -void MagiskLoader::InitializeLSPlant(zygisk::Api *api) { - if (lsplant_initilized) return; - std::vector> plt_hook_saved = {}; - - const std::string libArtPath = GetArt()->name(); - const auto maps = MapInfo::Scan(); - const auto libArtMap = std::find_if(maps.begin(), maps.end(), - [libArtPath](auto it) { return it.path == libArtPath; }); - const dev_t dev = libArtMap->dev; - const ino_t inode = libArtMap->inode; - - auto HookPLT = [dev, inode, &plt_hook_saved, api](void *art_symbol, void *callback, - void **backup, bool save = true) { - auto symbol = reinterpret_cast(art_symbol); - - if (GetArt()->isStripped()) { - api->pltHookRegister(dev, inode, symbol, callback, backup); - if (api->pltHookCommit() && *backup != nullptr) { - if (save) plt_hook_saved.emplace_back(symbol, backup); - LOGD("pltHook of {} finished", symbol); - return 0; - } - } - - if (auto addr = GetArt()->getSymbAddress(symbol); addr) { - HookInline(addr, callback, backup); - } else if (*backup == nullptr && isDebug) { - LOGW("Failed to {} Art symbol {}", save ? "hook" : "unhook", symbol); - } - return (int)(*backup == nullptr); - }; - - auto UnhookPLT = [HookPLT, &plt_hook_saved](void *original) { - if (!GetArt()->isStripped()) return UnhookInline(original); - - auto symbol = reinterpret_cast(original); - auto hook_iter = - std::find_if(plt_hook_saved.begin(), plt_hook_saved.end(), - [symbol](auto record) { return strcmp(record.first, symbol) == 0; }); - void *stub = nullptr; - if (hook_iter != plt_hook_saved.end() && - HookPLT(original, *(hook_iter->second), &stub, false)) { - plt_hook_saved.erase(hook_iter); - return 0; - } else { - return UnhookInline(original); - } - return 1; - }; - - initInfo = lsplant::InitInfo{ - .inline_hooker = - [HookPLT](auto t, auto r) { - void *bk = nullptr; - return HookPLT(t, r, &bk) == 0 ? bk : nullptr; - }, - .inline_unhooker = [UnhookPLT](auto t) { return UnhookPLT(t) == 0; }, - .art_symbol_resolver = [](auto symbol) { return GetArt()->getSymbAddress(symbol); }, - .art_symbol_prefix_resolver = - [](auto symbol) { return GetArt()->getSymbPrefixFirstAddress(symbol); }, - .is_plt_hook = true}; - lsplant_initilized = true; -} - void MagiskLoader::LoadDex(JNIEnv *env, PreloadedDex &&dex) { auto classloader = JNI_FindClass(env, "java/lang/ClassLoader"); auto getsyscl_mid = JNI_GetStaticMethodID(env, classloader, "getSystemClassLoader", @@ -199,7 +131,7 @@ void MagiskLoader::OnNativeForkSystemServerPre(JNIEnv *env) { setAllowUnload(skip_); } -void MagiskLoader::OnNativeForkSystemServerPost(JNIEnv *env, zygisk::Api *api) { +void MagiskLoader::OnNativeForkSystemServerPost(JNIEnv *env) { if (!skip_) { auto *instance = Service::instance(); auto system_server_binder = instance->RequestSystemServerBinder(env); @@ -222,7 +154,6 @@ void MagiskLoader::OnNativeForkSystemServerPost(JNIEnv *env, zygisk::Api *api) { instance->HookBridge(*this, env); // always inject into system server - InitializeLSPlant(api); InitArtHooker(env, initInfo); InitHooks(env); SetupEntryClass(env); @@ -277,8 +208,7 @@ void MagiskLoader::OnNativeForkAndSpecializePre(JNIEnv *env, jint uid, jintArray setAllowUnload(skip_); } -void MagiskLoader::OnNativeForkAndSpecializePost(JNIEnv *env, zygisk::Api *api, jstring nice_name, - jstring app_dir) { +void MagiskLoader::OnNativeForkAndSpecializePost(JNIEnv *env, jstring nice_name, jstring app_dir) { const JUTFString process_name(env, nice_name); auto *instance = Service::instance(); if (is_parasitic_manager) nice_name = JNI_NewStringUTF(env, "org.lsposed.manager").release(); @@ -290,7 +220,6 @@ void MagiskLoader::OnNativeForkAndSpecializePost(JNIEnv *env, zygisk::Api *api, ConfigBridge::GetInstance()->obfuscation_map(std::move(obfs_map)); LoadDex(env, PreloadedDex(dex_fd, size)); close(dex_fd); - InitializeLSPlant(api); InitArtHooker(env, initInfo); InitHooks(env); SetupEntryClass(env); diff --git a/magisk-loader/src/main/jni/src/magisk_loader.h b/magisk-loader/src/main/jni/src/magisk_loader.h index 89efde6a..06d93a7a 100644 --- a/magisk-loader/src/main/jni/src/magisk_loader.h +++ b/magisk-loader/src/main/jni/src/magisk_loader.h @@ -23,8 +23,10 @@ #pragma once -#include "../api/zygisk.hpp" +#include "../src/native_api.h" #include "context.h" +#include "elf_util.h" +#include "symbol_cache.h" namespace lspd { class MagiskLoader : public Context { @@ -38,12 +40,11 @@ public: void OnNativeForkAndSpecializePre(JNIEnv *env, jint uid, jintArray &gids, jstring &nice_name, jboolean is_child_zygote, jstring app_data_dir); - void OnNativeForkAndSpecializePost(JNIEnv *env, zygisk::Api *api, jstring nice_name, - jstring app_dir); + void OnNativeForkAndSpecializePost(JNIEnv *env, jstring nice_name, jstring app_dir); void OnNativeForkSystemServerPre(JNIEnv *env); - void OnNativeForkSystemServerPost(JNIEnv *env, zygisk::Api *api); + void OnNativeForkSystemServerPost(JNIEnv *env); protected: void LoadDex(JNIEnv *env, PreloadedDex &&dex) override; @@ -52,10 +53,18 @@ protected: private: bool skip_ = false; - bool lsplant_initilized = false; - lsplant::InitInfo initInfo; + const lsplant::InitInfo initInfo = lsplant::InitInfo{ + .inline_hooker = + [](auto t, auto r) { + void *bk = nullptr; + return HookInline(t, r, &bk) == 0 ? bk : nullptr; + }, + .inline_unhooker = [](auto t) { return UnhookInline(t) == 0; }, + .art_symbol_resolver = [](auto symbol) { return GetArt()->getSymbAddress(symbol); }, + .art_symbol_prefix_resolver = + [](auto symbol) { return GetArt()->getSymbPrefixFirstAddress(symbol); }, + .is_plt_hook = true}; - void InitializeLSPlant(zygisk::Api *api); static void setAllowUnload(bool unload); };