如何在android中通过挂钩获取上下文

如何在android中通过挂钩获取上下文,android,hook,android-context,xposed,Android,Hook,Android Context,Xposed,背景是: 我正在使用xposed framework来挂接第三方应用程序 当我钩住方法XXX时,xposed给了我“ClassNotFound”错误。我检查并发现方法XXX在一个dex文件中,并且会在运行时由DexClassLoader加载 为了钩住方法XXX,我需要将xposed中的默认类加载器更改为DexClassLoader。要获取DexClassLoader实例,我需要第三方应用程序的上下文实例 问题来了:如何获取上下文实例 我搜索了stackoverflow,发现有人说可以在Activ

背景是:

  • 我正在使用xposed framework来挂接第三方应用程序
  • 当我钩住方法XXX时,xposed给了我“ClassNotFound”错误。我检查并发现方法XXX在一个dex文件中,并且会在运行时由DexClassLoader加载
  • 为了钩住方法XXX,我需要将xposed中的默认类加载器更改为
    DexClassLoader
    。要获取
    DexClassLoader
    实例,我需要第三方应用程序的上下文实例
  • 问题来了:如何获取上下文实例
  • 我搜索了stackoverflow,发现有人说可以在Activity或Receiver中钩住方法来检索他们的上下文。但是我检查了Activity.class,没有发现返回上下文类型值的方法,只有一个方法具有上下文类型参数,
    onCreateView(字符串名称、上下文上下文、属性集属性)


    有什么方法可以了解上下文吗

    Xposed已经为您提供了当前的hooked apps类加载器

    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
                }
        });
        }
    
    如您所见,“lpparam.classLoader”是当前的应用程序类加载器。 我想你可能只是打错了什么,你能发布代码吗?但你可以得到当前的上钩应用程序,它可以根据上下文进行浇铸<代码>上下文=(上下文)AndroidAppHelper.currentApplication()

    资料来源:
    来源:

    以下海报的答案更为简洁:

    Context context = (Context) AndroidAppHelper.currentApplication();
    
    另一种方法是检索当前活动(可以转换为上下文),如下所示:

    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());
                    }
    });
    
    Class instrumentation=XposedHelpers.findClass(
    “android.app.Instrumentation”,lpparam.classLoader);
    hookAllMethods(插装,“newActivity”,newxc_MethodHook(){
    @凌驾
    HookedMethod(MethodHookParam param)抛出可丢弃的后受保护的空{
    mCurrentActivity=(Activity)参数getResult();
    Log.v(标记“当前活动:”+mCurrentActivity.getClass().getName());
    }
    });
    

    关于类加载器,如果它由主应用程序类加载器组成,则可以从传递给
    handleLoadPackage
    方法的
    LoadPackageParam
    中检索它

    如果应用程序本身创建了一个新的
    DexClassLoader
    ,那么您可以钩住
    DexClassLoader
    构造函数来保留对它的引用。
    这样,您就拥有了实际的
    类加载器
    ,其中包含您的类和方法。无需了解任何上下文。

    非常感谢!你是对的,在我的例子中,我只需要钩住DexClassLoader。这个问题回答了一个与所问问题不同的问题,虽然原作者很高兴,但对于那些正在寻找“如何获得上下文”这一问题答案的人来说,这是没有用的我发布的代码确实检索了上下文,您可以将其保存在类的静态字段中。这就是说,它确实假设一个活动是预先启动的,但这对于大多数xpose模块来说是可以的。