Add a native method to remove final flag of class

This commit is contained in:
solohsu 2019-04-29 20:26:27 +08:00
parent 20c83e4db7
commit ee4d48c1b4
8 changed files with 38 additions and 0 deletions

View File

@ -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
}
};

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -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);
}

View File

@ -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);
}
}

View File

@ -143,4 +143,5 @@ public class Main implements KeepAll {
public static native boolean initXResourcesNative();
public static native boolean removeFinalFlagNative(Class clazz);
}

View File

@ -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);
}
}

View File

@ -23,4 +23,6 @@ public interface HookProvider {
void deoptMethodNative(Object method);
boolean initXResourcesNative();
boolean removeFinalFlagNative(Class clazz);
}