mirror of https://github.com/FongMi/TV.git
parent
d61b810dce
commit
5d4003a2c4
@ -1,73 +0,0 @@ |
||||
package com.tvbus.engine; |
||||
|
||||
import android.content.Context; |
||||
import android.content.pm.PackageInfo; |
||||
import android.content.pm.PackageManager; |
||||
import android.content.pm.Signature; |
||||
|
||||
import java.lang.reflect.Field; |
||||
import java.lang.reflect.InvocationHandler; |
||||
import java.lang.reflect.Method; |
||||
import java.lang.reflect.Proxy; |
||||
|
||||
public class PmsHook implements InvocationHandler { |
||||
|
||||
private String sign; |
||||
private String name; |
||||
private Object base; |
||||
|
||||
private static class Loader { |
||||
static volatile PmsHook INSTANCE = new PmsHook(); |
||||
} |
||||
|
||||
public static PmsHook get() { |
||||
return Loader.INSTANCE; |
||||
} |
||||
|
||||
private PmsHook() { |
||||
hook(); |
||||
} |
||||
|
||||
public void inject(String sign) { |
||||
this.sign = sign; |
||||
} |
||||
|
||||
private Context getCtx() throws Throwable { |
||||
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread"); |
||||
Method method = activityThreadClass.getMethod("currentApplication"); |
||||
return (Context) method.invoke(null); |
||||
} |
||||
|
||||
private void hook() { |
||||
try { |
||||
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread"); |
||||
Class<?> iPackageManagerInterface = Class.forName("android.content.pm.IPackageManager"); |
||||
Method currentActivityThreadMethod = activityThreadClass.getDeclaredMethod("currentActivityThread"); |
||||
Field sPackageManagerField = activityThreadClass.getDeclaredField("sPackageManager"); |
||||
Object currentActivityThread = currentActivityThreadMethod.invoke(null); |
||||
sPackageManagerField.setAccessible(true); |
||||
Context context = getCtx(); |
||||
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 = context.getPackageManager(); |
||||
Field mPmField = pm.getClass().getDeclaredField("mPM"); |
||||
mPmField.setAccessible(true); |
||||
mPmField.set(pm, proxy); |
||||
} catch (Throwable e) { |
||||
e.printStackTrace(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { |
||||
if (!method.getName().equals("getPackageInfo")) return method.invoke(base, args); |
||||
String pkg = (String) args[0]; |
||||
Number flag = (Number) args[1]; |
||||
if (flag.intValue() != PackageManager.GET_SIGNATURES || !name.equals(pkg)) return method.invoke(base, args); |
||||
PackageInfo info = (PackageInfo) method.invoke(base, args); |
||||
info.signatures[0] = new Signature(sign); |
||||
return info; |
||||
} |
||||
} |
||||
Loading…
Reference in new issue