|
|
|
|
@ -19,17 +19,11 @@ public class PmsHook implements InvocationHandler { |
|
|
|
|
private String name; |
|
|
|
|
private Object base; |
|
|
|
|
|
|
|
|
|
public static void inject() { |
|
|
|
|
new PmsHook().hook(); |
|
|
|
|
public static void inject(Context context) { |
|
|
|
|
new PmsHook().hook(context); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Context getContext() throws Throwable { |
|
|
|
|
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread"); |
|
|
|
|
Method method = activityThreadClass.getMethod("currentApplication"); |
|
|
|
|
return (Context) method.invoke(null); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void hook() { |
|
|
|
|
private void hook(Context context) { |
|
|
|
|
try { |
|
|
|
|
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread"); |
|
|
|
|
Class<?> iPackageManagerInterface = Class.forName("android.content.pm.IPackageManager"); |
|
|
|
|
@ -37,12 +31,12 @@ public class PmsHook implements InvocationHandler { |
|
|
|
|
Field sPackageManagerField = activityThreadClass.getDeclaredField("sPackageManager"); |
|
|
|
|
Object currentActivityThread = currentActivityThreadMethod.invoke(null); |
|
|
|
|
sPackageManagerField.setAccessible(true); |
|
|
|
|
this.sign = getSign(getContext()); |
|
|
|
|
this.name = getContext().getPackageName(); |
|
|
|
|
this.sign = getSign(context); |
|
|
|
|
this.name = context.getPackageName(); |
|
|
|
|
this.base = sPackageManagerField.get(currentActivityThread); |
|
|
|
|
Object proxy = Proxy.newProxyInstance(iPackageManagerInterface.getClassLoader(), new Class<?>[]{iPackageManagerInterface}, this); |
|
|
|
|
sPackageManagerField.set(currentActivityThread, proxy); |
|
|
|
|
PackageManager pm = getContext().getPackageManager(); |
|
|
|
|
PackageManager pm = context.getPackageManager(); |
|
|
|
|
Field mPmField = pm.getClass().getDeclaredField("mPM"); |
|
|
|
|
mPmField.setAccessible(true); |
|
|
|
|
mPmField.set(pm, proxy); |
|
|
|
|
|