Android使用特殊权限的一种代码实现

原创 2015年11月19日 15:04:47
android编程中有时候需要用到一些特殊的权限,这些权限正常情况下是不对普通的第三方app开发商开放的。举个例子 WRITE_SECURE_SETTINGS,android sdk文档是这么解释的
public static final String WRITE_SECURE_SETTINGS
 
Added in API level 3
Allows an application to read or write the secure system settings.
 
Not for use by third-party applications.
 
Constant Value: "android.permission.WRITE_SECURE_SETTINGS"
我自己的应用(本文中成为MyApk),需要使用这类权限时,可以采用商务谈判的方式,将使用这部分的代码独立出来放在另外一个apk(在本文中,我将它称为Addon)中,将这些该Addon让rom厂商签名。MyApk和Addon之间的通讯就是普通的app之间的通讯了,本文介绍的例子的采用的是aidl的方式。

Addon Service在manifest.xml中的声明
<service android:name="com.jacksonke.remoteService.BshService">
<intent-filter>
<action android:name="com.jacksonke.remoteService.addon" />
</intent-filter>
</service>
MyApk连接Service的代码
getActivity().getApplicationContext()
.bindService(new Intent(
"com.jacksonke.remoteService.addon"),
this, Context.BIND_AUTO_CREATE);

按照一般的aidl的进程间通讯实现的话,会存在一定的问题,即其它任意app只要知道intent-action "com.jacksonke.remoteService.addon",都可以和Addon进行通讯。这就要求Addon对连接请求做一定的判断,我这边是采取一定的防御措施,本文介绍的防御措施,判断调用者apk的数字签名序列号是否满足条件。满足的话才能使用Service提供的内容。
BigInteger myBigInteger = new BigInteger("3d40fee9", 16);
// 所有者: CN=Android Debug, O=Android, C=US
// 发布者: CN=Android Debug, O=Android, C=US
// 序列号: 5bac446d
// 有效期开始日期: Wed Apr 09 18:43:39 CST 2013, 截止日期: Fri Apr 01 18:43:39 CST
// 2044
// 证书指纹:
// MD5: 34:DE:33:0A:FD:E4:2E:21:58:9F:8A:57:0E:80:05:20
// SHA1: B0:23:B2:20:03:33:82:70:21:D2:0B:8C:22:68:F8:D8:F4:54:A5:B9
// SHA256: 53:28:F6:92:A7:F8:83:D6:9C:54:B6:2B:EC:C8:78:31:B9:3D:93:02:EC:
// 39:65:C8:E1:F6:DB:3C:26:A2:B7:2C
// 签名算法名称: SHA256withRSA
// 版本: 3
//
// 扩展:
//
// #1: ObjectId: 2.5.29.14 Criticality=false
// SubjectKeyIdentifier [
// KeyIdentifier [
// 0000: 75 8F 78 E1 8A E9 B4 CB 79 3D 58 9C 63 F9 88 1C u.x.....y=X.c...
// 0010: 03 02 25 86 ..%.
// ]
// ]
BigInteger myBigInteger2 = new BigInteger("5bac446d", 16);
boolean callerValide = false;
 
boolean checkCallValide(){
String packageName =getPackageManager().getNameForUid(Binder.getCallingUid());
AddonLog.log("caller name =" + packageName);
 
try {
PackageInfo pi = getApplicationContext().getPackageManager().getPackageInfo(packageName,
PackageManager.GET_SIGNATURES);
try {
X509Certificate certificate = X509Certificate.getInstance(pi.signatures[0].toByteArray());
BigInteger serialBigInteger = certificate.getSerialNumber();
AddonLog.log("" + serialBigInteger.toString(16));
if (_debug){
return true;
}
else{
if (serialBigInteger.compareTo(myBigInteger2) == 0
|| serialBigInteger.compareTo(myBigInteger) == 0){
callerValide = true;
return true;
}
else{
callerValide = false;
return false;
}
}
} catch (CertificateException e) {
e.printStackTrace();
}
} catch (NameNotFoundException e) {
e.printStackTrace();
}
callerValide = false;
return false;
}

myBigInteger2的值就是MyApk数字签名的序列号,可以通过以下方式获取
1. 将apk后缀改为zip,用WinRAR打开,将META-INF/CERT.RSA解压出来,比如说解压到D:\CERT.RSA
2. 命令行底下用
    D:\android\project>keytool -printcert -file "D:\CERT.RSA"
    就能看到序列号了


题外话
showPermission()函数的功能是打印Addon和MyApk是否拥有某些权限。可以验证Addon是否获取了特殊权限。
void showPermissionInfo(){
int myPid = Process.myPid();
int myUid = Process.myUid();
AddonLog.log("myPid=" + myPid + " myUid="+ myUid);
AddonLog.log("Test if this process has permission WRITE_SECURE_SETTINGS");
if (checkPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS, myPid, myUid)
== PackageManager.PERMISSION_GRANTED){
AddonLog.log("-------------yes");
}
else{
AddonLog.log("-------------no");
}
AddonLog.log("BinderCallingPid =" + Binder.getCallingPid());
AddonLog.log("BinderCallingUid =" + Binder.getCallingUid());
AddonLog.log("Test if BinderCalling has permission WRITE_SECURE_SETTINGS");
if (checkPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS, Binder.getCallingPid(), Binder.getCallingUid())
== PackageManager.PERMISSION_GRANTED){
AddonLog.log("-----------------yes.");
}
else{
AddonLog.log("-----------------no.");
}
}
结果如下


版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 6.0正常权限、危险权限以及特殊权限

正常权限: ACCESS_LOCATION_EXTRA_COMMANDSACCESS_NETWORK_STATEACCESS_NOTIFICATION_POLICYACCESS_WIFI_STAT...
  • HiJson
  • HiJson
  • 2016年12月21日 13:06
  • 3828

Android系统权限和root权限

Android权限说明 Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制, Android系统权限相关的内容, (一)linux文件系...
  • superkris
  • superkris
  • 2012年07月02日 18:51
  • 106151

android文件的权限和特殊权限

http://blog.csdn.net/xubright/article/details/8538764 1、正常权限: 就是那个什么 -rwxrwxrwx 的东东,共十位。 ...
  • qq_24713549
  • qq_24713549
  • 2016年05月06日 16:14
  • 40

(转)Android文件的权限和特殊权限

原地址:http://blog.csdn.net/xubright/article/details/8538764 1、正常权限: 就是那个什么 -rwxrwxrwx 的东东,共十位。 第一位:...
  • duyiqun
  • duyiqun
  • 2017年01月28日 16:21
  • 273

一种更清晰的Android架构

过去几个月以来,通过在Tuenti网站上与@pedro_g_s和@flipper83(安卓开发两位大牛)进行友好讨论之后,我决定写这篇关于架构Android应用的文章。 我写这篇文章的目的...
  • bboyfeiyu
  • bboyfeiyu
  • 2015年03月23日 10:14
  • 8780

一种Android分包策略推荐

分包的重要性在架构一个App时,大家往往都在关注新潮的技术,却忽略了一点,那就是分包。很多人可能没有一套分包的原则,凭感觉甚至随心所欲地创建package或将代码放到任意的package中。虽然最终不...
  • u014738140
  • u014738140
  • 2017年07月13日 19:11
  • 1929

android6.0以上特殊权限

危险权限 Permission Group Permissions android.permission-group.CALENDAR ...
  • lxmhuendan
  • lxmhuendan
  • 2017年03月17日 10:58
  • 398

懂得这些,不再惧怕Android权限请求

转载请注明出处:http://blog.csdn.net/qq220011qq/article/details/61204531 Android的权限请求是一个坑,开发的时候总是有些害怕Android...
  • qq220011qq
  • qq220011qq
  • 2017年03月10日 19:24
  • 826

Android的OkHttp开源框架的使用方法

前段时间研究了下Android里面非常火爆的网络请求库OkHttp,这篇文章主要来介绍下OkHttp的常用请求的使用方式,后面一篇文章会介绍本人基于OkHttp封装的一个操作更简单、更适用于项目的网络...
  • zhangcanyan
  • zhangcanyan
  • 2016年06月16日 01:42
  • 2196

Android自定义View——扩散波浪按钮

前言劳动节快乐!!!O(∩_∩)O(本文写于2017年劳动节假期的最后一天。) 虽然现在不是一个值得庆祝的时间,因为美好的白天已经过去了,再过不久大家就要回到公司或者课堂了。/(ㄒoㄒ)/~~ 想...
  • q1242027878
  • q1242027878
  • 2017年06月28日 10:58
  • 590
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android使用特殊权限的一种代码实现
举报原因:
原因补充:

(最多只允许输入30个字)