首页
社区
课程
招聘
[原创]Xposed对手机App进行安装卸载或升级限制
发表于: 2021-1-14 16:34 3703

[原创]Xposed对手机App进行安装卸载或升级限制

2021-1-14 16:34
3703

上文:[原创]利用ROOT权限或Xposed随意对apk进行保资料降级

 

本文:
有时候应用商店或应用自身会悄咪咪地把我们的应用升级,很讨厌。
本文我们分析下如何限制APK进行卸载或安装(升级),希望大家对xp使用和系统服务有所了解,造出好玩的黑科技,嘿嘿嘿。
系统应用都是由应用大管家PMS管理的。
代码位于

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
frameworks\base\services\core\java\com\android\server\pm\PackageManagerService.java
 
举例子,核心代码如下:
 
安装或升级管理
hookAllMethods("android.content.pm.PackageParser.parsePackage")  {
        after { m ->
                try {
            // 这里我们偷懒,或者提高兼容性,hook所有parsePackage, 注意这里判断一下调用链,是不是安装才解析的。
                        if (m.args.size == 2 && getNowStackString().contains("installPackage")) {
                                val parsePackageName = m.result.get<String>("packageName")
                                val parsePackageVersionName = m.result.get<String>("mVersionName")
            // 定义一个中断应用包解析的函数,就是抛一个异常出来
                                fun interrupt() {
                                        Log.w(Tag, "[Hook] forbid install package $parsePackageName")
                                        m.throwable = newObj("android.content.pm.PackageParser\$PackageParserException", 9"Sorry, you can't install $parsePackageName") as Exception
                                }
 
            // 可以进行版本判断
                                if (parsePackageName == "com.tencent.mm" && !listOf("7.0.19").contains(parsePackageVersionName))
                                        interrupt()
 
            // 禁止头条系
                                if (parsePackage!!.startsWith("com.ss.android"))
                                        interrupt()
                        }
                } catch (e: Throwable) {
                        Log.e(Tag, "parsePackage hook exception:\n" + e.stackTraceString)
                }
        }
}

卸载管理

1
2
3
4
5
6
7
hookAllMethods("com.android.server.pm.PackageManagerService.deletePackageLIF") {
        before { m ->
                Log.w(Tag, "[HOOK] Uninstall" + getMArgsString(m))
// 卸载的时候需要调这个函数传入包名,我们直接给他置空,就会报错(注意,这个错误系统会拦截才能这样弄,否则会导致系统服务崩溃)
                if (banUninstallPackage.contains(m.args[0])) m.args[0] = null
        }
}

自己测试安卓7.0-9.0有效,其它未测。
我们把插件装上,发现无论是Adb安装还是手动安装,都是安装不上的。
在进行ADB安装的时候,还能看到“Sorry, you can't install $parsePackageName”的提示。

 

在写系统插件的时候,有可能会把系统搞死,这时候我们的手机可能还在卡logo,不用担心,但是adb进程已经启动了,我们把电脑连接把插件直接删掉就可以了。

1
2
su
rm -rf /data/app/插件包名*

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
额。。把我52发的文章直接抄过来了
2021-2-3 15:39
0
游客
登录 | 注册 方可回帖
返回
//