本帖最后由 陈司机 于 2021-1-12 18:06 编辑
上文:
玩转App之一 利用ROOT权限或Xposed随意对apk进行保资料降级
本文:
有时候应用商店或应用自身会悄咪咪地把我们的应用升级,很讨厌。
本文我们分析下如何限制APK进行卸载或安装(升级),希望大家对xp使用和系统服务有所了解,造出好玩的黑科技,嘿嘿嘿。
系统应用都是由应用大管家PMS管理的。
代码位于
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)
}
}
}
卸载管理
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进程已经启动了,我们把电脑连接把插件直接删掉就可以了。
su
rm -rf /data/app/插件包名*
下篇 [玩转APP之三]防止App被杀,即使卸载了也不退出 研究下如何锁定app运行,可以让我们的APP安心在后台工作,喜欢的请关注留意,欢迎评论交流。
|