- 浏览: 538112 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
landerson:
明显就有要求的嘛
ANDROID轻量级JSON序列化和反序列化[转] -
jimode2013:
很不错,就是需要这个方法
多个UIViewController使用addSubView,第二个 UIViewController 不响应旋转[转] -
w11h22j33:
...
[转]NSMutableArray中的自动释放对象让我郁闷了一整天 -
w11h22j33:
UILabel* label = [[UILabel a ...
Iphone开发 -
w11h22j33:
http://mobile.51cto.com/iphone- ...
获得通讯录中联系人的所有属性[转]
前段时间接到一个有趣的需求!我们实现的某某功能的手机对外提供了API!结果有希望只有自己承认的厂商的APK才能使用这些接口!其他的过滤掉! Java代码
哈哈!看上去挺变态的!对外公布的API又不让人家用!没办法啊!需求就是爷!一个字做!
回顾android安全机制貌似没有这么一项功能!不过咱能做!谁叫咱能改源码呢!有源码什么不能改了啊!哈哈!。。。。
那么方案调研过程我们省略这里面涉及的知识比较多!直接上方案了!
步骤是先想法知道谁调用了你的接口!然后把调用接口的apk的厂商信息找出来!
同一个厂商的apk的签名应该是一样的!拥有同样的signature以及pubkeyid!所以最终目的是得到signature!
研究查到有如下接口
- PackageInfo pkgInfo;
- try {
- pkgInfo = getPackageManager().getPackageInfo("packagename", PackageManager.GET_SIGNATURES);
-
- Signature enterproidSign = pkgInfo.signatures[0];
-
- if (!enterproidSign.toCharsString().equals(key)) {
- // Wrong signature
- return;
- }
- } catch (NameNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
也就是说当务之急就是找到谁调用了这个接口!即是packagename!
本来我们知道想知道谁调用了你只要在参数中加入context的信息就很容易得到apk的唯一标识包名了!
如下面的code
Java代码
- String packageName = this.getApplicationInfo().packageName;
- Log.e("Dean", "getApplicationInfo:"+packageName);
- String dataDir = this.getApplicationInfo().dataDir;
- Log.e("Dean", "getApplicationInfo:dataDir"+dataDir);
- String sourceDir = this.getApplicationInfo().sourceDir;
- Log.e("Dean", "getApplicationInfo:sourceDir"+sourceDir);
- String publicSourceDir = this.getApplicationInfo().publicSourceDir;
- Log.e("Dean", "getApplicationInfo:publicSourceDir"+publicSourceDir);
- int descriptionRes = this.getApplicationInfo().descriptionRes;
- Log.e("Dean", "getApplicationInfo:descriptionRes"+descriptionRes);
偏偏接口中没有context的参数!而且这个方式貌似就有局限性了!
那么我们可以想想在做checkpermission的判断的时候也需要知道是哪个apk吧!可以看看别人是怎么做到的!
看一下源代码:
Java代码
- public int checkCallingOrSelfPermission(String permission) {
- if (permission == null) {
- throw new IllegalArgumentException("permission is null");
- }
- return checkPermission(permission, Binder.getCallingPid(),
- Binder.getCallingUid());
- }
这里可以通过Binder.getCallingPid(),Binder.getCallingUid()的到apk的 pid 和 uid!
那看看源码流程是怎么样的
Java代码
- /**
- * This can be called with or without the global lock held.
- */
- int checkComponentPermission(String permission, int pid, int uid,
- int owningUid, boolean exported) {
- // We might be performing an operation on behalf of an indirect binder
- // invocation, e.g. via {@link #openContentUri}. Check and adjust the
- // client identity accordingly before proceeding.
- Identity tlsIdentity = sCallerIdentity.get();
- if (tlsIdentity != null) {
- Slog.d(TAG, "checkComponentPermission() adjusting {pid,uid} to {"
- + tlsIdentity.pid + "," + tlsIdentity.uid + "}");
- uid = tlsIdentity.uid;
- pid = tlsIdentity.pid;
- }
-
- // Root, system server and our own process get to do everything.
- if (uid == 0 || uid == Process.SYSTEM_UID || pid == MY_PID ||
- !Process.supportsProcesses()) {
- return PackageManager.PERMISSION_GRANTED;
- }
- // If there is a uid that owns whatever is being accessed, it has
- // blanket access to it regardless of the permissions it requires.
- if (owningUid >= 0 && uid == owningUid) {
- return PackageManager.PERMISSION_GRANTED;
- }
- Log.e("Dean", "ActivityManagerService checkComponentPermission uid:" + uid + "pid:" + pid
- + "!Process.supportsProcesses()" + !Process.supportsProcesses() + "owningUid:"
- + owningUid + "exported:" + exported + "permission:" + permission);
-
- // If the target is not exported, then nobody else can get to it.
- if (!exported) {
- Slog.w(TAG, "Permission denied: checkComponentPermission() owningUid=" + owningUid);
- return PackageManager.PERMISSION_DENIED;
- }
- if (permission == null) {
- return PackageManager.PERMISSION_GRANTED;
- }
- try {
- return AppGlobals.getPackageManager()
- .checkUidPermission(permission, uid);
- } catch (RemoteException e) {
- // Should never happen, but if it does... deny!
- Slog.e(TAG, "PackageManager is dead?!?", e);
- }
- return PackageManager.PERMISSION_DENIED;
- }
这样我们发现在对apk拥有的是否是root等权限判断后调用了
Java代码
- AppGlobals.getPackageManager()
- .checkUidPermission(permission, uid);
这样就调回到packagemanage里面来通过uid群找它所拥有的permission,code 如下
Java代码
- public int checkUidPermission(String permName, int uid) {
-
- synchronized (mPackages) {
- Object obj = mSettings.getUserIdLP(uid);
- if (obj != null) {
- GrantedPermissions gp = (GrantedPermissions)obj;
- Log.e("Dean", "PackageManagerService checkUidPermission obj != null");
- if (gp.grantedPermissions.contains(permName)) {
- return PackageManager.PERMISSION_GRANTED;
- }
- } else {
- HashSet<String> perms = mSystemPermissions.get(uid);
- Log.e("Dean", "PackageManagerService checkUidPermission obj == null");
- if (perms != null && perms.contains(permName)) {
- return PackageManager.PERMISSION_GRANTED;
- }
- }
- }
- Log.e("Dean", "PackageManagerService checkUidPermission");
- return PackageManager.PERMISSION_DENIED;
- }
通过这个uid获得GrantedPermissions!这个就是他所拥有的permission列表!
这个方法后面的部分貌似对我们的需求么用!
我们需要得到的是apk的唯一标识包名!
这里有两个方法
一个用uid 获得包名
Java代码
- public String[] getPackagesForUid(int uid)
这里得到的是一个数组
这里之所以会得到一个数组是因为有一个属性android:sharedUserId
多个apk可以共享一个userid!那么这会不会影响我们的结果了!
答案是不会!当然这个答案是做过测试的!如果有android:sharedUserId那么两个apk必须有相同的证书!否则会报INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
错误!也就是说得到的数组的任何一个packagename取到的Signature应该是一样的!
所以此方案可行!
另一个通过pid可以知道当前的进程运行pkglist!
Java代码
- List<RunningAppProcessInfo> getRunningAppProcesses = null;
- try {
- getRunningAppProcesses = ActivityManagerNative.getDefault()
- .getRunningAppProcesses();
- } catch (Exception e) {
- }
-
- for (RunningAppProcessInfo runningappprocessinfo : getRunningAppProcesses) {
- Log.e("Dean", "runningappprocessinfo.pid:"+runningappprocessinfo.pid+"runningappprocessinfo.processName"+runningappprocessinfo.processName);
-
- for(int i = 0;i<runningappprocessinfo.pkgList.length;i++){
- Log.e("Dean","pkgname:"+runningappprocessinfo.pid+":"+runningappprocessinfo.pkgList[i]);
- }
- }
- Log.e("Dean", "...................................................");
- for (RunningAppProcessInfo runningappprocessinfo : getRunningAppProcesses) {
- Log.e("Dean","runningappprocessinfo.pid:"+runningappprocessinfo.pid);
- if (runningappprocessinfo.pid == Binder.getCallingPid()) {
- Log.e("Dean","runningappprocessinfo.pid:"+runningappprocessinfo.pid);
- Log.e("Dean", "runningappprocessinfo" + runningappprocessinfo
- + "runningappprocessinfo.processName:"
- + runningappprocessinfo.processName
- + "runningappprocessinfo.pkgList:"
- + runningappprocessinfo.pkgList);
- ApplicationInfo mAppInfo = null;
- try {
- Log.e("Dean","runningappprocessinfo.pkgList"+runningappprocessinfo.pkgList);
-
- Log.e("Dean","runningappprocessinfo.pkgList"+runningappprocessinfo.pkgList.length);
-
- for(int i = 0;i<runningappprocessinfo.pkgList.length;i++){
- Log.e("Dean","pkgname:"+runningappprocessinfo.pkgList[i]);
- }
-
- mAppInfo = getPackageManager().getApplicationInfo(runningappprocessinfo.processName,
- PackageManager.GET_UNINSTALLED_PACKAGES);
-
- Log.e("Dean", "mAppInfo.publicSourceDir"+mAppInfo.publicSourceDir);
- Log.e("Dean", "mAppInfo.sourceDir"+mAppInfo.sourceDir);
- } catch (Exception e) {
- }
- }
- }
发表评论
-
干掉你程序中的僵尸代码【转】
2012-12-22 11:05 967随着万圣节越来越流行,我感觉有必要跟大家讨论一下一个 ... -
一个文本框搞定信用卡相关信息的输入[转]
2012-12-22 11:03 1141http://beforweb.com/node/134 ... -
android 开源 OCR 项目 及手写识别[转]
2012-12-11 18:21 57721)一个为Android平台,将识别由手机的相机拍摄的图 ... -
Android通过共享用户ID来实现多Activity进程共享【转】
2012-12-10 14:33 1111http://mypyg.iteye.com/blog/720 ... -
Android应用程序组件Content Provider的启动过程源代码分析【转】
2012-12-05 18:31 1149通过前面的学习,我们知道在Android系统中,Cont ... -
理解android上的安全性【转】
2012-12-03 18:08 919开发 Android 应用程序时,必须处理很多与安全性相关的方 ... -
Android 安全机制概述 Permission【转】
2012-12-03 18:07 11761 Android 安全机制概述 Android 是一个权限分 ... -
(JAVA) 使用异或进行简单的密码加密(JAVA实现)[转]
2012-11-12 16:44 1220http://blog.sina.com.cn/s/bl ... -
SL4A 之实现原理解析【转】
2012-10-23 23:52 1286关于SL4A的简介和在Android系统的安装及使用,请参 ... -
百度地图API之根据经纬度查询地址信息(Android)[转]
2012-06-16 00:15 19804http://blog.csdn.net/lyq8479/ar ... -
百度地图的手动定位和自动定位[转]
2012-06-15 23:24 3460http://aokunsang.iteye.com/b ... -
如何编程实现开启或关闭GPS?
2012-06-09 22:14 1134来自 手机应用中最酷的可能就是位置服务相关的了, ... -
Android软键盘的隐藏显示研究[转]
2012-05-25 16:30 1445Android是一个针对触摸屏专门设计的操作系统,当点 ... -
15 个变量和方法命名的最佳实践[转]
2012-02-27 11:44 103215 个变量和方法命名的最佳实践 在每个代码范围内使用足够短 ... -
iPhone Android Web开发(概要)
2012-01-19 15:15 1071一、 前端使用技术 JavaScript、 jQuer ... -
移动 电信 联通 APN cmwap cmnet ctwap ctnet 3gwap uniwap 3gnet uninet设置[转]
2011-11-23 14:35 2781APN(Access Point Name),即“接入 ... -
Android Http CMWAP联网获取实例【转】
2011-10-24 13:24 1404上午的时候原本想通过改变切入点的方式来实现cmwap,但是我们 ... -
监听ListView滚动到最底部【转】
2011-09-13 10:27 5885监听ListView的滚动可以用两个东西: ListV ... -
Android蓝牙开发浅谈【转】
2011-09-07 14:20 1576转自:http://www.eoeandroid.co ... -
修改Android模拟器的HOST
2011-06-03 11:08 4224C:\WINDOWS\system32\drivers ...
相关推荐
在Android开发中,自从Android 6.0(API级别23)引入了运行时权限模型后,应用在请求敏感权限时不再像以往那样在安装时一次性获取,而是需要在运行时根据用户的需求来请求。这个变化增加了开发者的复杂性,但同时也...
2. 实现一个检查权限的方法,例如`CheckPermission()`,该方法会通过调用Android的`ContextCompat.checkSelfPermission()`来检测应用是否已经获得了特定的权限。 3. 提供一个请求权限的方法,比如`...
本文将深入探讨JVM中的访问控制器,主要基于“java之jvm学习笔记十一(访问控制器)-源码”这一主题,以及相关的源码分析。 首先,我们得了解Java的安全模型。Java安全模型基于一种称为安全管理器(SecurityManager)...
在Android平台上,随着系统版本的升级,对用户隐私和敏感信息的保护越来越严格。自Android 6.0(API级别23)引入了权限动态管理机制,应用在运行时需要获取用户授权才能访问某些敏感信息,如联系人、短信、位置等。...
Android 获取 usb 权限是 Android 应用程序中一个重要的权限获取方式,主要用于获取 USB 设备的访问权限。本文将介绍 Android 获取 usb 权限的两种方法,並详细解释每种方法的实现过程。 第一种方法:在 ...
然而,根据提供的标题和描述,这里介绍了一个方法,可以用于在Android 8.1(API级别27)上,基于全志R311芯片的设备上屏蔽apk获取权限弹框,即在不经过用户确认的情况下直接赋予应用所有权限。 这个方法涉及到对...
工具类中可以包含静态方法,如`checkPermission()`用于检查权限,`requestPermission()`用于请求权限,并返回一个`PermissionResultCallback`接口供调用者处理结果。 2. **封装检查和请求方法**:在`...
Android M 动态权限解决方案,Let You Fly! []() Demo_APK下载 动图(相信你会Star的) 使用方式 导入permlib到Project中,app添加库依赖。(建议拷贝源码,可根据需求定制) 奇淫技巧: checkPermission...
例如,可以有一个`checkPermission()`方法检查权限,一个`requestPermission()`方法发起请求,并提供一个接口或回调供主线程处理权限请求的结果。 综上所述,"Android6.0权限工具类"是针对Android 6.0及更高版本...
在Android系统中,获取应用程序列表信息是开发过程中常见的需求,比如构建应用管理界面或实现某些特定功能。以下将详细介绍如何通过编程方式实现这四个主要目标: 1. **Android中获取所有应用程序列表信息** 要...
总结,SoulPermission为Android开发者提供了一个高效、易用的权限管理工具,它简化了运行时权限的处理流程,使开发者能更加专注于应用的核心功能开发。通过合理利用SoulPermission,可以提升应用的质量和用户体验。
在Android开发过程中,工具类(Utility Classes)是开发者不可或缺的辅助工具,它们通常包含一系列静态方法,用于处理各种常见的任务,提高代码的可重用性和效率。本篇将深入探讨"Android-Android常用的工具类集合...
Java动态代理是面向切面编程(AOP)的一种实现方式,它允许我们在不修改原有代码的情况下,为已有的对象添加额外的功能。在Web开发中,动态代理常常用于增强业务逻辑,比如日志记录、权限检查等,使得代码更加模块化...
本文将深入探讨JVM中的访问控制器,并通过分析"java之jvm学习笔记十一(访问控制器) -源码"中的`MySecurityManager`来进一步理解其工作原理。 访问控制器的主要任务是对类、方法和字段的访问进行限制,防止恶意代码...
在Android开发中,`PackageManager`是一个至关重要的组件,它提供了获取和管理安装在设备上的所有应用包信息的能力。本文将详细讲解如何利用`PackageManager`来获取Android应用程序(包)的相关信息。 首先,让我们...
在Android开发过程中,工具类(Utils)是一种非常实用的代码模块,它封装了常见的功能,以便在多个地方重用,从而提高开发效率和代码的可维护性。"Android Utils 工具类 好用#"这个标题暗示了这是一个包含了一系列...
这个"android常用工具类集合(可直接使用)"是一个实用的资源,包含了一系列预封装好的函数,方便开发者快速集成到自己的项目中。 1. **字符串处理工具类**:在Android开发中,字符串的处理是非常常见的,如格式化...
这篇学习笔记主要涵盖了SCMAD开发中的一些核心技术和资源需求,以下是对这些知识点的详细解释: 1. **资源最小需求**:在SCMAD开发中,对应用的UI、颜色、内存、文件大小等方面有明确的最低要求。例如,LCD屏幕至少...
在Android开发领域,深入理解和掌握Android系统的内部信息以及安全机制是至关重要的。这不仅可以帮助开发者优化应用程序性能,还可以确保用户数据的安全。以下是对"Android进阶-Android系统信息与安全机制"这一主题...
在Android开发中,悬浮窗(通常称为Float Window或System Bar)是一种常见的功能,它可以在其他应用之上显示内容,实现类似通知、辅助工具等效果。本实例将深入探讨如何在Android项目中实现一个基本的悬浮窗功能,只...