[MT8766][Android12] 增加应用安装白名单或者黑名单
文章目录
- 开发平台基本信息
- 问题描述
- 解决方法
开发平台基本信息
芯片: MT8766
版本: Android 12
kernel: msm-4.19
问题描述
在项目开发的时候,经常有一些客户,要求系统安装应用的时候需要进行验签;也就是系统默认不允许任何应用安装,应用安装的时候,会读取系统目录下存放的公钥,然后拿着公钥去解析需要安装的应用,只有匹配上签名的应用才能正常安装。
解决方法
- 应用验签的算法各种各样,也比较隐私,这里就不做展示了;这里仅提供应用安装拦截的方法;可以在安装的地方,读取设定的白名单,只有白名单内的应用才允许安装;或者读取设定的黑名单,除了黑名单内的应用禁止安装,其他的应用正常安装。具体怎么使用,就看具体需求。
--- a/frameworks/base/core/api/system-current.txt
+++ b/frameworks/base/core/api/system-current.txt
@@ -8892,6 +8892,7 @@ package android.permission {method public int checkDeviceIdentifierAccess(@Nullable String, @Nullable String, @Nullable String, int, int);method @NonNull @RequiresPermission(android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY) public java.util.Set<java.lang.String> getAutoRevokeExemptionGrantedPackages();method @NonNull @RequiresPermission(android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY) public java.util.Set<java.lang.String> getAutoRevokeExemptionRequestedPackages();
+ method public android.content.Context getPermissionContext();method @IntRange(from=0) @RequiresPermission(anyOf={android.Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, android.Manifest.permission.UPGRADE_RUNTIME_PERMISSIONS}) public int getRuntimePermissionsVersion();method @NonNull public java.util.List<android.permission.PermissionManager.SplitPermissionInfo> getSplitPermissions();--- a/frameworks/base/core/java/android/content/pm/parsing/ParsingPackageUtils.java
+++ b/frameworks/base/core/java/android/content/pm/parsing/ParsingPackageUtils.java
@@ -132,6 +132,17 @@ import java.util.Objects;import java.util.Set;import java.util.StringTokenizer;+import android.os.SystemProperties;
+import android.provider.Settings;
+import android.content.Context;
+import android.util.Log;
+
@@ -275,7 +288,7 @@ public class ParsingPackageUtils {return new ParsingPackageImpl(packageName, baseApkPath, path,manifestArray);}
- });
+ },mContext);try {result = parser.parsePackage(input, file, parseFlags);if (result.isError()) {
@@ -309,16 +322,19 @@ public class ParsingPackageUtils {@NonNullprivate List<PermissionManager.SplitPermissionInfo> mSplitPermissionInfos;private Callback mCallback;
+ private static Context mContext;public ParsingPackageUtils(boolean onlyCoreApps, String[] separateProcesses,DisplayMetrics displayMetrics,@NonNull List<PermissionManager.SplitPermissionInfo> splitPermissions,
- @NonNull Callback callback) {
+ @NonNull Callback callback,
+ @NonNull Context context) {mOnlyCoreApps = onlyCoreApps;mSeparateProcesses = separateProcesses;mDisplayMetrics = displayMetrics;mSplitPermissionInfos = splitPermissions;mCallback = callback;
+ mContext = context;}@@ -3043,6 +3059,11 @@ public class ParsingPackageUtils {@NonNull SigningDetails existingSigningDetails, int targetSdk) {int minSignatureScheme = ApkSignatureVerifier.getMinimumSignatureSchemeVersionForTargetSdk(targetSdk);+ boolean isAllow = false;
+if (isStaticSharedLibrary) {// must use v2 signing schememinSignatureScheme = SigningDetails.SignatureSchemeVersion.SIGNING_BLOCK_V2;
@@ -3056,7 +3077,71 @@ public class ParsingPackageUtils {verified = ApkSignatureVerifier.unsafeGetCertsWithoutVerification(baseCodePath, SigningDetails.SignatureSchemeVersion.JAR);} else {
- verified = ApkSignatureVerifier.verify(baseCodePath, minSignatureScheme);
+ String whiteListValue = null;
+ String[] whiteListArray = null;
+ if(mContext != null){
+ if(mContext.getContentResolver()!=null){
+ whiteListValue = Settings.System.getString(mContext.getContentResolver(), Settings.System.KEY_CERT_WHITE_LIST_ACTION);
+ }
+
+ if (whiteListValue != null){
+ int count = 0;
+ String packageName = null;
+ PackageManager pm = mContext.getPackageManager();
+ PackageInfo info = pm.getPackageArchiveInfo(baseCodePath, PackageManager.GET_ACTIVITIES);
+ if(info!=null){
+ ApplicationInfo appInfo = info.applicationInfo;
+ packageName = appInfo.packageName; //得到安装包名称
+ Log.d(TAG, "packageName : " + packageName);
+
+ whiteListArray = whiteListValue.split(";");
+ for(count=0; count < whiteListArray.length; count++){
+ if(packageName.equals(whiteListArray[count])){
+ isAllow = true;
+ break;
+ }else{
+ isAllow = false;
+ }
+ }
+ }
+ }else{
+ Log.d(TAG, "whiteList is null");
+ }
+ }
+ if (isAllow){
+ verified = ApkSignatureVerifier.verify(baseCodePath, minSignatureScheme);
+ }else {
+ throw new PackageParserException(
+ INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES,
+ baseCodePath + " has mismatched certificates");
+ }}} catch (PackageParserException e) {return input.error(PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES,--- a/frameworks/base/core/java/android/permission/PermissionManager.java
+++ b/frameworks/base/core/java/android/permission/PermissionManager.java
@@ -161,6 +161,10 @@ public final class PermissionManager {mLegacyPermissionManager = context.getSystemService(LegacyPermissionManager.class);}+ public Context getPermissionContext(){
+ return mContext;
+ }
+
--- a/frameworks/base/services/core/java/com/android/server/pm/parsing/PackageParser2.java
+++ b/frameworks/base/services/core/java/com/android/server/pm/parsing/PackageParser2.java
@@ -129,7 +129,7 @@ public class PackageParser2 implements AutoCloseable {mCacher = cacheDir == null ? null : new PackageCacher(cacheDir);parsingUtils = new ParsingPackageUtils(onlyCoreApps, separateProcesses, displayMetrics,
- splitPermissions, callback);
+ splitPermissions, callback,permissionManager.getPermissionContext());ParseInput.Callback enforcementCallback = (changeId, packageName, targetSdkVersion) -> {ApplicationInfo appInfo = mSharedAppInfo.get();
主要就是在应用安装的那个类里面拿不到上下文,所以,只能通过构造类的时候,从上一层拿到上下文之后,再传进来。拿到上下文之后就可以获取Setting数据库,读出黑白名单列表,再跟当前安装的包名做对比,判断当前应用是否安装。
相关文章:
[MT8766][Android12] 增加应用安装白名单或者黑名单
文章目录 开发平台基本信息问题描述解决方法 开发平台基本信息 芯片: MT8766 版本: Android 12 kernel: msm-4.19 问题描述 在项目开发的时候,经常有一些客户,要求系统安装应用的时候需要进行验签;也就是系统默认不允许任何应用安装&#…...

游戏公司数据分析师必备知识(持续补充中...)
1.如何撰写专题报告? ①原则 只有一个主题:即使不讲ppt,业务方也能看得懂行文通俗简单易懂:学习产品经理平常是如何写报告的明确的数据结论和落地项先行:跟业务方多沟通数据结论,让他们给出落地项 ②结构…...
intellj 开发软件插件
IDEA: .ignore Alibaba Java Coding Guidelines(XenoAmess TPM) Chinese (Simplified) Language Pack / 中文语言包 CodeGlance Pro Gitee Grep Console Json Formatter Maven Helper Nyan Progress Bar One Dark theme Python Rainbow Brackets Resource Bundle Ed…...

leetCode 493 翻转对
给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。你需要返回给定数组中的重要翻转对的数量。 未完待续~...

“辛巴猫舍”内网渗透、提权、撞库学习笔记
前言: 在拿到靶机时,我们最先需要做的是信息收集,包括不限于:C段扫描,端口探测,指纹识别,版本探测等。其次就是 漏洞挖掘、漏洞利用、提权、维持权限、日志清理、留下后门。 以上就是渗透的基本…...

粤嵌实训医疗项目--day06(Vue + SpringBoot)
往期回顾 粤嵌实训医疗项目(小组开发)--day05-CSDN博客粤嵌实训医疗项目--day04(Vue SpringBoot)-CSDN博客粤嵌实训医疗项目--day03(Vue SpringBoot)-CSDN博客粤嵌实训医疗项目day02(Vue SpringBoot)-CS…...

SPSS二元Logistic回归
前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…...

前端-第一部分-HTML
一.初识HTML 1.1 HTML 简介 HTML 全称为 HyperText Mark-up Language,翻译为超文本标签语言,标签也称作标记或者元素。HTML 是目前网络上应用最为广泛的技术之一,也是构成网页文档的主要基石之一。HTML文本是由 HTML 标签组成的描述性文本&a…...

六度空间(C++)
目录 题目: 输入、输出格式: 代码: 运行结果: 题目: 输入、输出格式: 代码: #include<iostream> #include<algorithm> using namespace std; int g[10005][10005]; float n…...
记录undefined reference to `SSLv3_client_method‘错误笔记
libcurl.a(libcurl_la-openssl.o): in function ossl_connect_step1: openssl.c:(.text0x3ca8): undefined reference to SSLv3_client_method 我个人环境原因:编译选项指定了某个openssl目录,此目录下有libcrypto.a libssl.a 解决方法:…...
JS算法练习 11.11
leetcode 2619 数组原型对象的最后一个元素 请你编写一段代码实现一个数组方法,使任何数组都可以调用 array.last() 方法,这个方法将返回数组最后一个元素。如果数组中没有元素,则返回 -1 。 你可以假设数组是 JSON.parse 的输出结果。 示例…...

50代码审计-PHP无框架项目SQL注入挖掘
代码设计分为有框架和无框架 挖掘技巧:随机挖掘,定点挖掘,批量挖掘(用工具帮助扫描探针,推荐工具:fortify,seay系统)。 1.教学计划: ---审计项目漏洞 Demo->审计思…...

什么是微服务?与分布式又有什么区别?
什么是微服务,我们先从传统的单体结构进行了解,对两者进行对比。 单体结构 单体结构是一种传统的软件架构模式,它将应用程序划分为一组相互依赖的模块和组件。这些模块和组件通常都是构建在同一个平台上的,并且紧密耦合在一起。…...

案例 | 3D可视化工具HOOPS助力SolidWorks edrawings成功引入AR/VR技术
HOOPS中文网慧都科技是HOOPS全套产品中国地区指定授权经销商,提供3D软件开发工具HOOPS售卖、试用、中文试用指导服务、中文技术支持。http://techsoft3d.evget.com/达索系统SolidWorks面临的挑战 达索系统SolidWorks公司开发和销售三维CAD设计软件、分析软件和产品…...

初识Linux:目录路径
目录 提示:以下指令均在Xshell 7 中进行 一、基本指令: 二、文件 文件内容文件属性 三、ls 指令拓展 1、 ls -l : 2、ls -la: 3、ls [目录名] : 4、ls -ld [目录名]: 四、Linux中的文件和…...

抖音小程序开发:探索技术创新的代码之旅
随着抖音小程序的兴起,企业纷纷将目光投向这个充满活力的平台。抖音小程序开发不仅为品牌提供了更广泛的曝光机会,更是技术创新的舞台。本文将带领读者深入探索抖音小程序开发的技术要点,探讨如何通过代码实现个性化、高效的小程序。 1. 小…...

公司注册股东选择几个人合适?
创业初期很多创业者都会选择有注册有限责任公司,有限责任由五十个以下的股东出资设立,每个股东以其所认缴的出资额为限对公司承担有限责任。那么问题来了股东人数选择几个最合适呢,下面上海注册公司网(www.91kaiye.cn)…...

大数据治理——为业务提供持续的、可度量的价值(二)
第二部分:元数据集成体系结构 在明确了元数据管理策略后需要确定实现该管理策略所需的技术体系结构,即元数据集成体系结构。元数据集成体系结构涉及到多个概念,如元模型、元-元模型、公共仓库元模型(CWM)等࿰…...
前端安全方面有哪些攻击方式?
在前端开发中,存在一些常见的安全攻击方式。以下是一些常见的前端安全攻击方式: 1:跨站脚本攻击(XSS): XSS攻击是指攻击者通过在网页中注入恶意脚本,使得用户在浏览器中执行该脚本,…...
linux的文件属性
在使用长格式查看目录信息时,会看到如下的结果。每一行代表对应的文件或者目录的详细信息。从左到右具体含义时文件属性、文件数、所有者、所属的组、文件大小、建立月份、建立日期、建立年份或时间及文件名 [rootmaster lib]# ll total 19260 drwxr-xr-x. 2 root…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...