APK安装时的过滤方式:包名白名单、证书认证
1.定义一些全局变量,文件位置:
Build.java (frameworks\base\core\java\android\os)
/**
* 包管理方式名称<br>
* whitelist: 白名单方式
* certificate: 证书认证方式
* none: 不进行管理
*/
public static String packageManage = "none";
/**
* 允许 Launch 显示的 APP 及 APP 白名单
*/
public static String[] packageAllow = new String[]{ "com.baidu.searchbox",
"com.thinta.product.thintazlib",
"com.thinta.product.x4usertool"};
/**
* 允许 Launch 显示的 APP的 证书存放路径
*/
public static String certificatePath = "/system/etc/security/media.zip";
2.修改安装APK过程,在安装过程添加验证
修改文件的位置:
PackageManagerService.java (frameworks\base\services\core\java\com\android\server\pm)
首先添加一个函数:
private static HashSet<X509Certificate> getTrustedCerts(File keystore)
throws IOException, GeneralSecurityException {
HashSet<X509Certificate> trusted = new HashSet<X509Certificate>();
if (keystore == null) {
return trusted;
}
ZipFile zip = new ZipFile(keystore);
try {
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Enumeration<? extends ZipEntry> entries = zip.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
InputStream is = zip.getInputStream(entry);
try {
trusted.add((X509Certificate) cf.generateCertificate(is));
} finally {
is.close();
}
}
} finally {
zip.close();
}
return trusted;
}
修改的函数:private void installPackageLI(InstallArgs args, PackageInstalledInfo res)
第一处修改:
if(Build.ThintaCust.packageManage.equals("certificate"))
tmp_flags = PackageManager.GET_SIGNATURES;
final int parseFlags = mDefParseFlags | PackageParser.PARSE_CHATTY
| (forwardLocked ? PackageParser.PARSE_FORWARD_LOCK : 0)
| (onSd ? PackageParser.PARSE_ON_SDCARD : 0) | tmp_flags; 第二处修改:
if(Build.ThintaCust.packageManage.equals("none")){
Log.d("XYP_DEBUG", "packageManage = none \n");
}else if(Build.ThintaCust.packageManage.equals("whitelist")){
Log.d("XYP_DEBUG", "packageManage = whitelist \n");
List<String> list = Arrays.asList(Build.ThintaCust.packageAllow);
if(list.contains(pkg.packageName)){
Log.d("XYP_DEBUG", "can install \n");
}else{
Log.d("XYP_DEBUG", "forbid install \n");
res.setError(PackageManager.INSTALL_FAILED_USER_RESTRICTED, "installPackageLI, forbid install");
return;
}
}else if(Build.ThintaCust.packageManage.equals("certificate")){
int verify_pass = 0;
try{
File file = new File(Build.ThintaCust.certificatePath);
HashSet<X509Certificate> trusted = getTrustedCerts(file);
CertificateFactory cf = CertificateFactory.getInstance("X.509"); for (X509Certificate c : trusted) {
String tmp_public_key = c.getPublicKey().toString();
for(Signature sig : pkg.mSignatures)
{
X509Certificate cert = (X509Certificate)cf.generateCertificate(new ByteArrayInputStream(sig.toByteArray()));
String tmp_key = cert.getPublicKey().toString();
if(tmp_public_key.equals(tmp_key)){
verify_pass = 1;
break;
}
}
if(verify_pass == 1)
break;
}
if(verify_pass != 1){
Log.d("XYP_DEBUG", "forbid install \n");
res.setError(PackageManager.INSTALL_FAILED_USER_RESTRICTED, "installPackageLI, forbid install");
return;
}
}catch(FileNotFoundException e){
Log.d("XYP_DEBUG", e.toString());
}catch(CertificateException e){
Log.d("XYP_DEBUG", e.toString());
}catch(IOException e){
Log.d("XYP_DEBUG", e.toString());
}catch(GeneralSecurityException e){
Log.d("XYP_DEBUG", e.toString());
}
}
3.证书的压缩方式:
zip -r media.zip media.x509.pem
直接用命令把*.x509.pem 打包成zip文件,然后放到目标板的合适位置;
用第一步中的certificatePath指向存放该zip文件的位置。
APK安装时的过滤方式:包名白名单、证书认证的更多相关文章
- 解决chrome插件安装时出现的“程序包无效”问题信息:程序包无效。
https://blog.csdn.net/bluexuemei/article/details/35213117 2014-06-27 09:00:51 bluexuemei 阅读数 14374更多 ...
- android .apk安装时遇到NSTALL_FAILED_CONTAINER_ERROR错误
在一台酷派上装apk时遇到问题: android Installation error: INSTALL_FAILED_CONTAINER_ERROR 遇到问题后baidu google修改为andr ...
- Oozie安装时放置Mysql驱动包的总结(网上最全)
不多说,直接上干货! 对于在oozie里放置Mysql驱动包的总结 根据网上的参考以及我个人经验安装的使用 (1)放一份到$OOZIE_HOME/libext下 (是 mysql-connector- ...
- 解决Chrome插件安装时出现的“程序包无效”问题
问题原因,新版的插件头部文件的修改,导致旧版的插件包无法使用,解决方式:解压. 1.把下载后的.crx扩展名的离线Chrome插件的文件扩展名改成.zip或者.rar(如果看不到Chrome插件的扩展 ...
- Android apk安装时出现“解析软件包错误”
有时候在安装apk的时候会出现解析软件包出错 (Android studio)解决方法如下: 关闭Instant Run功能: File-Settings-...看下图: 将红色框内的勾取消. 如果还 ...
- R安装时出现辑程包不存在,解决方法
R > -------------------------------------------------[解决方案]1.使用命令单独安装caret,安装的时间很长.install.packag ...
- android-获得".apk"文件的相关信息。包名、版本号等等
String filePath = "/sdcard/feijiedemo.apk"; PackageManager packageManager = getPackageMana ...
- CloudStack 安装时需要的第三方包
1.mysql-connector-java 2.jakarta-commons-daemon-jsvc 3.jsvc rpm -ivh cloudstack-common-4.1.1-0.el6 ...
- php7 安装时需求的依赖包
php70 php70-bcmath php70-cli php70-common php70-devel php70-fpm php70-gd php70-json php70-mbstring p ...
随机推荐
- NSLocalizedString不起作用
程序TESTAPP 环境:XCODE 4.6 OSX 10.8.4 MAC BOOK AIR 2011年版 代码 [doneButton setTitle:NSLocalizedString(@&q ...
- Objective-C之run loop详解
Objective-C之run loop详解 做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深 ...
- linux内核——进程,轻量级进程,线程,线程组
1.进程.轻量级进程.线程.线程组之间的关系 2.及它们的标识相关说明 一.进程.轻量级进程.线程.线程组之间的关系 借助上图说明: 进程P0有四条执行流,即线程, 主线程t0是它的第一个线程,且与进 ...
- 使用 IDEA 创建 Maven Web 项目 (一)- 使用IEAD创建Maven项目
创建IDEA项目 单击 Create New Project 按钮,弹出 New Project 对话框. 选择 Maven 选项,单击 Next 按钮. 输入 GroupId.ArtifactId. ...
- Oracle全角和半角处理函数
1.TO_MULTI_BYTE语法: TO_MULTI_BYTE(String) 功能: 计算所有单字节字符都替换为等价的多字节字符的String.该函数只有当数据库字符集同时包含多字节和单字节的字符 ...
- 怎样求FIRST集、FOLLOW集和SELECT集
一,要知道什么是终结符和非终结符. 终结符:通俗的说就是不能单独出现在推导式左边的符号,也就是说终结符不能再进行推导. 非终结符:不是终结符的都是非终结符.(非男即女,呵呵) 如:A-->B,则 ...
- LightOJ 1248 Dice (III)
期望,$dp$. 设$dp[i]$表示当前已经出现过$i$个数字的期望次数.在这种状态下,如果再投一次,会出现两种可能,即出现了$i+1$个数字以及还是$i$个数字. 因此 $dp[i]=dp[i]* ...
- Java中Animal b = new Dog();Dog c = new Dog();的区别
由于在编译阶段,只是检查参数的引用类型.然而在运行时,Java虚拟机(JVM)指定对象的类型并且运行该对象的方法.因此在下面的例子中,b.move()之所以能编译成功,是因为Animal类中存在mov ...
- ELK采集之nginx 之高德地图出城市IP分布图
1.采用拓扑: 角色扮演: Agent:采用logstash,IP:192.168.10.7 Redis队列: IP:192.168.10.100 Indexer:logstash,IP:192.16 ...
- [HMLY]10.深入研究Block用weakSelf、strongSelf、@weakify、@strongify解决循环引用
前言 在上篇中,仔细分析了一下Block的实现原理以及__block捕获外部变量的原理.然而实际使用Block过程中,还是会遇到一些问题,比如Retain Circle的问题. 目录 1.Retain ...