From ee4d48c1b41e802dae25a56bdcb59746313f1c40 Mon Sep 17 00:00:00 2001 From: solohsu Date: Mon, 29 Apr 2019 20:26:27 +0800 Subject: [PATCH] Add a native method to remove final flag of class --- edxp-core/jni/main/java_hook/java_hook.cpp | 16 ++++++++++++++++ .../java/com/elderdrivers/riru/edxp/Main.java | 2 ++ .../edxp/sandhook/config/SandHookProvider.java | 5 +++++ .../java/com/elderdrivers/riru/edxp/Main.java | 2 ++ .../edxp/whale/config/WhaleHookProvider.java | 5 +++++ .../java/com/elderdrivers/riru/edxp/Main.java | 1 + .../edxp/yahfa/config/YahfaHookProvider.java | 5 +++++ .../riru/edxp/hook/HookProvider.java | 2 ++ 8 files changed, 38 insertions(+) diff --git a/edxp-core/jni/main/java_hook/java_hook.cpp b/edxp-core/jni/main/java_hook/java_hook.cpp index ddc4d5ab..26de4b9a 100644 --- a/edxp-core/jni/main/java_hook/java_hook.cpp +++ b/edxp-core/jni/main/java_hook/java_hook.cpp @@ -73,6 +73,19 @@ void setMethodNonCompilable(JNIEnv *env, jclass, jobject member) { setNonCompilable(artMethod); } +static constexpr uint32_t kAccFinal = 0x0010; + +jboolean removeFinalFlag(JNIEnv *env, jclass, jclass clazz) { + if (clazz) { + jfieldID java_lang_Class_accessFlags = env->GetFieldID( + env->FindClass("java/lang/Class"), "accessFlags", "I"); + jint access_flags = env->GetIntField(clazz, java_lang_Class_accessFlags); + env->SetIntField(clazz, java_lang_Class_accessFlags, access_flags & ~kAccFinal); + return true; + } + return false; +} + static JNINativeMethod hookMethods[] = { { "init", @@ -129,6 +142,9 @@ static JNINativeMethod hookMethods[] = { }, { "initXResourcesNative", "()Z", (void *) XposedBridge_initXResourcesNative + }, + { + "removeFinalFlagNative", "(Ljava/lang/Class;)Z", (void *) removeFinalFlag } }; diff --git a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/Main.java b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/Main.java index 89b6212b..ffccbd73 100644 --- a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/Main.java +++ b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/Main.java @@ -149,4 +149,6 @@ public class Main implements KeepAll { public static native int waitForGcToComplete(long thread); public static native boolean initXResourcesNative(); + + public static native boolean removeFinalFlagNative(Class clazz); } diff --git a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/config/SandHookProvider.java b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/config/SandHookProvider.java index eddc8387..d00024eb 100644 --- a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/config/SandHookProvider.java +++ b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/config/SandHookProvider.java @@ -63,4 +63,9 @@ public class SandHookProvider extends BaseHookProvider { public boolean initXResourcesNative() { return Main.initXResourcesNative(); } + + @Override + public boolean removeFinalFlagNative(Class clazz) { + return Main.removeFinalFlagNative(clazz); + } } diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/Main.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/Main.java index 5d5cbc6b..1f76a756 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/Main.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/Main.java @@ -140,4 +140,6 @@ public class Main implements KeepAll { public static native int waitForGcToComplete(long thread); public static native boolean initXResourcesNative(); + + public static native boolean removeFinalFlagNative(Class clazz); } diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java index 82fb21cd..2a9eb1d3 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java @@ -59,4 +59,9 @@ public class WhaleHookProvider extends BaseHookProvider { public boolean initXResourcesNative() { return Main.initXResourcesNative(); } + + @Override + public boolean removeFinalFlagNative(Class clazz) { + return Main.removeFinalFlagNative(clazz); + } } diff --git a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/Main.java b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/Main.java index 7d6c8210..b0f6abeb 100644 --- a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/Main.java +++ b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/Main.java @@ -143,4 +143,5 @@ public class Main implements KeepAll { public static native boolean initXResourcesNative(); + public static native boolean removeFinalFlagNative(Class clazz); } diff --git a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaHookProvider.java b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaHookProvider.java index a6a7638b..0f810562 100644 --- a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaHookProvider.java +++ b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaHookProvider.java @@ -40,4 +40,9 @@ public class YahfaHookProvider extends BaseHookProvider { public boolean initXResourcesNative() { return Main.initXResourcesNative(); } + + @Override + public boolean removeFinalFlagNative(Class clazz) { + return Main.removeFinalFlagNative(clazz); + } } diff --git a/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/hook/HookProvider.java b/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/hook/HookProvider.java index f396bd85..2a5539c6 100644 --- a/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/hook/HookProvider.java +++ b/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/hook/HookProvider.java @@ -23,4 +23,6 @@ public interface HookProvider { void deoptMethodNative(Object method); boolean initXResourcesNative(); + + boolean removeFinalFlagNative(Class clazz); }