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