diff --git a/hook/.gitignore b/hook/.gitignore new file mode 100644 index 000000000..42afabfd2 --- /dev/null +++ b/hook/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/hook/build.gradle b/hook/build.gradle new file mode 100644 index 000000000..7ba6b50f3 --- /dev/null +++ b/hook/build.gradle @@ -0,0 +1,13 @@ +plugins { + id 'com.android.library' +} + +android { + namespace 'com.fongmi.hook' + compileSdk 33 + + defaultConfig { + minSdk 21 + targetSdk 28 + } +} \ No newline at end of file diff --git a/hook/src/main/AndroidManifest.xml b/hook/src/main/AndroidManifest.xml new file mode 100644 index 000000000..568741e54 --- /dev/null +++ b/hook/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/hook/src/main/java/com/fongmi/hook/Handler.java b/hook/src/main/java/com/fongmi/hook/Handler.java new file mode 100644 index 000000000..42154096e --- /dev/null +++ b/hook/src/main/java/com/fongmi/hook/Handler.java @@ -0,0 +1,38 @@ +package com.fongmi.hook; + +import android.content.pm.PackageInfo; +import android.content.pm.Signature; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +public class Handler implements InvocationHandler { + + private String sign; + private Object base; + private String pkg; + + public Handler(Object base, String sign, String pkg) { + try { + this.base = base; + this.sign = sign; + this.pkg = pkg; + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if ("getPackageInfo".equals(method.getName())) { + String pkgName = (String) args[0]; + Number flag = (Number) args[1]; + if (flag.intValue() == 64 && this.pkg.equals(pkgName)) { + PackageInfo info = (PackageInfo) method.invoke(this.base, args); + info.signatures[0] = new Signature(sign); + return info; + } + } + return method.invoke(this.base, args); + } +} \ No newline at end of file diff --git a/hook/src/main/java/com/fongmi/hook/Hook.java b/hook/src/main/java/com/fongmi/hook/Hook.java new file mode 100644 index 000000000..169cc2fc6 --- /dev/null +++ b/hook/src/main/java/com/fongmi/hook/Hook.java @@ -0,0 +1,31 @@ +package com.fongmi.hook; + +import android.content.Context; +import android.content.pm.PackageManager; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +public class Hook { + + public static void pm(Context context, String sign) { + try { + Class activityThreadClass = Class.forName("android.app.ActivityThread"); + Method currentActivityThreadMethod = activityThreadClass.getDeclaredMethod("currentActivityThread", new Class[0]); + Object currentActivityThread = currentActivityThreadMethod.invoke(null, new Object[0]); + Field sPackageManagerField = activityThreadClass.getDeclaredField("sPackageManager"); + sPackageManagerField.setAccessible(true); + Object sPackageManager = sPackageManagerField.get(currentActivityThread); + Class iPackageManagerInterface = Class.forName("android.content.pm.IPackageManager"); + Object proxy = Proxy.newProxyInstance(iPackageManagerInterface.getClassLoader(), new Class[]{iPackageManagerInterface}, new Handler(sPackageManager, sign, context.getPackageName())); + sPackageManagerField.set(currentActivityThread, proxy); + PackageManager pm = context.getPackageManager(); + Field mPmField = pm.getClass().getDeclaredField("mPM"); + mPmField.setAccessible(true); + mPmField.set(pm, proxy); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/tvbus/build.gradle b/tvbus/build.gradle index a3fd7cbb8..b405dc13c 100644 --- a/tvbus/build.gradle +++ b/tvbus/build.gradle @@ -14,5 +14,6 @@ android { } dependencies { + implementation project(':hook') implementation project(':catvod') } \ No newline at end of file