The background is :
DexClassLoader
. To get a DexClassLoader
instance, I need a Context instance of the third party app.I searched stackoverflow and found someone said you can hook the method in Activity or Receiver to retrieve their context. But I checked the Activity.class and found no method that return Context type value, and only one method has Context type parameter, the onCreateView(String name, Context context, AttributeSet attrs)
.
Is there any way to get the Context?
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.