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)
}
}
}