1
+ package cn.yhfcn.mipushfaker.mod
2
+
3
+ import android.os.Build
4
+ import de.robv.android.xposed.IXposedHookLoadPackage
5
+ import de.robv.android.xposed.XC_MethodHook
6
+ import de.robv.android.xposed.XposedHelpers
7
+ import de.robv.android.xposed.callbacks.XC_LoadPackage
8
+
9
+ class MiPushFake : IXposedHookLoadPackage {
10
+ val props: Map <String , String > = mapOf (
11
+ Pair (" ro.miui.ui.version.name" , " V12" ),
12
+ Pair (" ro.miui.ui.version.code" , " 10" ),
13
+ Pair (" ro.miui.version.code_time" , " 1592409600" ),
14
+
15
+ Pair (" product.manufacturer" , " Xiaomi" ),
16
+ Pair (" ro.product.vendor.manufacturer" , " Xiaomi" ),
17
+ Pair (" ro.product.brand" , " Xiaomi" ),
18
+ Pair (" ro.product.vendor.brand" , " Xiaomi" ),
19
+ )
20
+
21
+ override fun handleLoadPackage (lpparam : XC_LoadPackage .LoadPackageParam ) {
22
+ // find mipush sdk
23
+ val serviceExist = try {
24
+ lpparam.classLoader.loadClass(" com.xiaomi.push.service.XMPushService" )
25
+ true
26
+ } catch (e: ClassNotFoundException ) {
27
+ false
28
+ }
29
+ val messageHandlerExist = try {
30
+ lpparam.classLoader.loadClass(" com.xiaomi.mipush.sdk.PushMessageHandler" )
31
+ true
32
+ } catch (e: ClassNotFoundException ) {
33
+ false
34
+ }
35
+ val hasXiaomiPush = serviceExist or messageHandlerExist
36
+ if (! hasXiaomiPush) {
37
+ return
38
+ }
39
+ /* *
40
+ * fake miui12 hook
41
+ * code from https://github.com/MiPushFramework/MiPushEnhancement
42
+ * @author <a href="https://github.com/MlgmXyysd">Jaida Wu</a>
43
+ * @author <a href="https://github.com/Trumeet">Yuuta Liang</a>
44
+ * @see <a href="https://github.com/MiPushFramework/MiPushEnhancement/blob/master/app/src/main/java/org/meowcat/xposed/mipush/Enhancement.java">MiPushEnhancement</a>
45
+ */
46
+ XposedHelpers .findAndHookMethod(XposedHelpers .findClass(
47
+ " android.os.SystemProperties" ,
48
+ lpparam.classLoader
49
+ ),
50
+ " native_get" ,
51
+ String ::class .java,
52
+ String ::class .java,
53
+ object : XC_MethodHook () {
54
+ override fun afterHookedMethod (param : MethodHookParam ) {
55
+ val key = param.args[0 ].toString()
56
+ if (props.containsKey(key)) {
57
+ param.result = props[key]
58
+ }
59
+ }
60
+ })
61
+
62
+ // android.os.SystemProperties.native_get_int(String,int)
63
+
64
+ // android.os.SystemProperties.native_get_int(String,int)
65
+ XposedHelpers .findAndHookMethod(XposedHelpers .findClass(
66
+ " android.os.SystemProperties" ,
67
+ lpparam.classLoader
68
+ ),
69
+ " native_get_int" ,
70
+ String ::class .java,
71
+ Int ::class .javaPrimitiveType,
72
+ object : XC_MethodHook () {
73
+ override fun afterHookedMethod (param : MethodHookParam ) {
74
+ val key = param.args[0 ].toString()
75
+ if (props.containsKey(key)) {
76
+ param.result = props[key]
77
+ }
78
+ }
79
+ })
80
+
81
+ // android.os.SystemProperties.native_get_long(String,long)
82
+
83
+ // android.os.SystemProperties.native_get_long(String,long)
84
+ XposedHelpers .findAndHookMethod(XposedHelpers .findClass(
85
+ " android.os.SystemProperties" ,
86
+ lpparam.classLoader
87
+ ),
88
+ " native_get_long" ,
89
+ String ::class .java,
90
+ Long ::class .javaPrimitiveType,
91
+ object : XC_MethodHook () {
92
+ override fun afterHookedMethod (param : MethodHookParam ) {
93
+ val key = param.args[0 ].toString()
94
+ if (props.containsKey(key)) {
95
+ param.result = props[key]
96
+ }
97
+ }
98
+ })
99
+
100
+ XposedHelpers .setStaticObjectField(Build ::class .java, " MANUFACTURER" , " Xiaomi" )
101
+ XposedHelpers .setStaticObjectField(Build ::class .java, " BRAND" , " Xiaomi" )
102
+ }
103
+ }
0 commit comments