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文件的位置。

时间: 2024-08-03 14:14:19

APK安装时的过滤方式:包名白名单、证书认证的相关文章

apk安装时把程序附带文件拷贝到手机指定目录下

项目已搞定,今天把.apk文件弄到另外一台非调试手机上用,发现一个问题.因为要画图,所以绘图的点的数据保存在一个.txt的文本文件中,上次直接把它用usb传到指定文件夹下的,但是明显不科学,因为用户下载了你的.apk文件,你却告诉他,还要把这个文本文件拷贝到指定的文件夹下,所以,我就要解决这个问题,就是把文本文件打包在apk文件中,安装.apk时就让创建一个程序文件夹,然后把文本文件拷贝到这个目录文件夹里,用户运行程序,就可以绘图,不用再让他拷贝一份绘图的点的坐标的数据.同理,其实我这里还有设计

android-获得&quot;.apk&quot;文件的相关信息。包名、版本号等等

String filePath = "/sdcard/feijiedemo.apk"; PackageManager packageManager = getPackageManager(); PackageInfo packageInfo = packageManager.getPackageArchiveInfo(filePath, PackageManager.GET_ACTIVITIES); Log.d("name", packageInfo.package

解决Chrome插件安装时出现的“程序包无效”问题亲测可用

原文地址:https://www.cnblogs.com/by-DSL/p/12560678.html

查看APK包名签名等信息

有些游戏第三方比如分享需要配置游戏包名和签名,不同渠道包名签名又不同,所以时常需要查看不同apk包等签名信息,之前是使用等微博开放平台的手机客户端查看apk签名,前提是知道包名,网上找了下查看签名和包名的方法,找到一个比较好用的工具分享一下. 微博开放平台查看签名工具:下载 然而,不知道包名的情况下还是无法获取的,更何况还要安装到手机上使用app获取,在开发中显然下面到方式更简便. 获取 Apk 包名.VersionCode.VersionName 等相关信息 通过使用 aapt,可以获取 Ap

查看Android应用包名、Activity的几个方法

一.没有apk,应用已经安装到手机或虚拟机中 1.手机有安装GT,打开可以看到包名: 2.logcat .清除logcat内容,使用命令adb logcat -c .启动logcat,使用命令adb logcat ActivityManager:I *:s .启动要查看的程序, 2.dumpsys (1)启动要查看的程序: (2)命令行输入:adb shell dumpsys window w |findstr \/ |findstr name= 补充:使用adb shell dumpsys w

Android 下载APK 安装APK 打开APK

今天有了一个这样的需求 :下载一个apk文件,然后当你下载完成后,按钮的文字发生改变,变成点击安装,然后安装完成之后,变成打开. 这是下载apk的方法: /** * 后台在下面一个Apk 下载完成后返回下载好的文件 * * @param httpUrl * @return */ private File downFile(final String httpUrl) { new Thread(new Runnable() { @Override public void run() { try {

在CMD窗口中使用javac和java命令进行编译和执行带有包名的具有继承关系的类

一.背景 最近在使用记事本编写带有包名并且有继承关系的java代码并运行时发现出现了很多错误,经过努力一一被解决,今天我们来看一下会遇见哪些问题,并给出解决办法. 二.测试过程 1.父类代码 1 package com.hafiz.zhang; 2 3 public class Fu 4 { 5 private Integer i ; 6 7 public void sayHello(String name) { 8 System.out.println("Hello " + name

Android 编程下如何修改 jar 文件的包名

首先我们要说说为什么要修改 jar 文件的包名,jar 包我们会非常高频率的使用,尤其是用一些其他三方库的时候,往往把 java 代码打包成 jar 文件,方便项目依赖使用.笔者在开发过程中遇到过一些问题,是由于 jar 文件里面的包名和项目或者运行时环境的引用文件包名上存在冲突导致的,这时候我们修改 jar 文件的包名是一个比较快速有效的解决办法.举两个例子,是笔者亲身经历的两个情况. Gson库:这个相信很多人都在使用,但是直接导入 gson 的 jar 包,在 HTC Desire HD

友盟消息推送新版 SDK 为什么要支持多包名推送?

友盟消息推送 Android SDK 升级至 v 1.4.1 版本了!那问题来了,v 1.4.1 版本有什么新功能呢? “支持多包名推送”!新版 SDK 下载地址 开发者都知道,对于各种 Android 应用,特别是 Android 游戏而言,针对不同的渠道定制版本.使用不同的包名是运营中常见的一环,但是这样会导致后续使用消息推送时工作量过大,每个包都要单独推送,费时费力,还难以做到精准推送,效率低下……在不改变使用多包名的现状下,该如何提升消息推送效率? 友盟消息推送团队新推出的“多包名推送”