How to get Context through hooking in android

后端 未结 2 1991
刺人心
刺人心 2020-12-19 21:45

The background is :

  1. I\'m using xposed framework to hook a third party app.
  2. When I hook method XXX, xposed gave me \"ClassNotFound\" error. I checked a
相关标签:
2条回答
  • 2020-12-19 22:22

    The answer from the poster below is more succinct:

    Context context = (Context) AndroidAppHelper.currentApplication();
    

    An alternative hack is to retrieve the current activity (which can be cast to Context) like this:

    Class<?> instrumentation = XposedHelpers.findClass(
                    "android.app.Instrumentation", lpparam.classLoader);
    
    XposedBridge.hookAllMethods(instrumentation, "newActivity", new XC_MethodHook() {
    
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
    
                        mCurrentActivity = (Activity) param.getResult();
    
                        Log.v(TAG, "Current Activity : " + mCurrentActivity.getClass().getName());
                    }
    });
    

    Regarding the class loader, if it consists of the main app classloader then you can retrieve it from LoadPackageParam passed to the handleLoadPackage method.

    If the app itself creates a new DexClassLoader then you can hook the DexClassLoader constructor to keep a reference to it. That way you have the actual ClassLoader that contains your class and method. No need to get any context.

    0 讨论(0)
  • 2020-12-19 22:33

    Xposed already gives you the current hooked apps class loader.

    public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
            if (!lpparam.packageName.equals("com.android.systemui"))
                return;
    
            findAndHookMethod("com.android.systemui.statusbar.policy.Clock", lpparam.classLoader, "updateClock", new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                    // this will be called before the clock was updated by the original method
                }
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    // this will be called after the clock was updated by the original method
                }
        });
        }
    

    As you can see "lpparam.classLoader" is the current apps class loader. I think you may just have typed something incorrectly, are you able to post the code? But you can get the current hooked apps application intense witch can be casted to context. Context context = (Context) AndroidAppHelper.currentApplication();

    Source:https://github.com/rovo89/XposedBridge/blob/master/src/android/app/AndroidAppHelper.java#L131 Source: https://github.com/rovo89/XposedBridge/wiki/Development-tutorial

    0 讨论(0)
提交回复
热议问题