xposed的总开关

xposed是一个用于全局hook的框架。

许多破解工具,都通过xposed去实现它的功能,如果不想自己的app被xposed修改的话,可以在自己应用内偷偷把xposed的开关关掉。


开关的位置在这里:

https://github.com/rovo89/XposedBridge/blob/art/app/src/main/java/de/robv/android/xposed/XposedBridge.java

变量名叫disableHooks


可以自己应用内使用反射去修改它,但不要认为它很轻松,先试试

 Class.forName("de.robv.android.xposed.XposedBridge")

抛出异常,找不到这个类

然后在jni里,使用

env->FindClass("de/robv/android/xposed/XposedBridge")

返回NULL,也找不到这个类

这是因为它不在当前的ClassLoader中。

很蛋疼是吧,没事,先看看下面的代码:

https://github.com/rovo89/Xposed/blob/master/libxposed_common.cpp

bool initXposedBridge(JNIEnv* env) {
    classXposedBridge = env->FindClass(CLASS_XPOSED_BRIDGE);
    if (classXposedBridge == NULL) {
        ALOGE("Error while loading Xposed class '%s':", CLASS_XPOSED_BRIDGE);
        logExceptionStackTrace();
        env->ExceptionClear();
        return false;
    }
    classXposedBridge = reinterpret_cast<jclass>(env->NewGlobalRef(classXposedBridge));

    ALOGI("Found Xposed class '%s', now initializing", CLASS_XPOSED_BRIDGE);
    if (register_natives_XposedBridge(env, classXposedBridge) != JNI_OK) {
        ALOGE("Could not register natives for '%s'", CLASS_XPOSED_BRIDGE);
        logExceptionStackTrace();
        env->ExceptionClear();
        return false;
    }

    methodXposedBridgeHandleHookedMethod = env->GetStaticMethodID(classXposedBridge, "handleHookedMethod",
        "(Ljava/lang/reflect/Member;ILjava/lang/Object;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");
    if (methodXposedBridgeHandleHookedMethod == NULL) {
        ALOGE("ERROR: could not find method %s.handleHookedMethod(Member, int, Object, Object, Object[])", CLASS_XPOSED_BRIDGE);
        logExceptionStackTrace();
        env->ExceptionClear();
        return false;
    }

    return true;
}
这里可以看到会把这个类的jclass引用,保存在classXposedBridge变量里,它对应的符号是
 
 
_ZN6xposed17classXposedBridgeE
所以可以通过符号去获取它,然后修复它。
 
 
void disableXposed(JNIEnv *env) {
    do {
        void* pLibxposedArtSo = dlopen("libxposed_art.so", RTLD_NOW);
        if (NULL == pLibxposedArtSo)
            break;

        jclass *pClassXposedBridge = (jclass *)dlsym(pLibxposedArtSo, "_ZN6xposed17classXposedBridgeE");
        if (NULL == pClassXposedBridge)
            break;

        jfieldID fieldDisableHooks = env->GetStaticFieldID(*pClassXposedBridge, "disableHooks","Z");
        if (NULL == fieldDisableHooks)
            break;

        env->SetStaticBooleanField(*pClassXposedBridge, fieldDisableHooks, JNI_TRUE);
    } while (false);

    env->ExceptionClear();
}
这样子就在本应用内关掉了xposed的功能,不怕黑客使用xposed破解你的应用了。开不开心。
 
 

猜你喜欢

转载自blog.csdn.net/jwhwzzh/article/details/76656126