(转)关于android设备管理器的一些分析
转自http://bbs.pediy.com/showthread.php?t=183692
想必很多人都知道轰动一时android木马OBAD,该木马利用android设备管理器的漏洞,当用户激活设备管理器后,该程序会在setting设备管理器列表隐藏,应用程序激活成设备管理器后,可以实现锁屏、擦除用户数据等功能,并且无法使用常规的卸载方式对其卸载,本文主要和介绍漏洞原理和漏洞补丁分享个人在分析过程中遇到的一些事情。
Android 在实现设备管理器时,需要再manifest.xml中注册一个广播接收者,代码如下
<receiver
android:name=".MyDeviceAdmin"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin" /> <intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
OBAD如何在setting的管理器列表隐藏呢,我们可以通过setting的源码找到答案。相关代码:packages\apps\Settings\src\com\android\settings\DeviceAdminSettings.java
主要方法:
void updateList() {
mActiveAdmins.clear();
List<ComponentName> cur = mDPM.getActiveAdmins();
if (cur != null) {
for (int i=0; i<cur.size(); i++) {
mActiveAdmins.add(cur.get(i));
}
}
//获得已经激活设备管理器列表mActiveAdmins
mAvailableAdmins.clear();
// mAvailableAdmins setting的设备管理器列表
List<ResolveInfo> avail = getActivity().getPackageManager().queryBroadcastReceivers(
new Intent(DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED),
PackageManager.GET_META_DATA);
//获取所有注册了DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED即android.app.action.DEVICE_ADMIN_ENABLED action的广播接收者列表avail
int count = avail == null ? 0 : avail.size();
for (int i=0; i<count; i++) {
ResolveInfo ri = avail.get(i);
try {
DeviceAdminInfo dpi = new DeviceAdminInfo(getActivity(), ri); if (dpi.isVisible() || mActiveAdmins.contains(dpi.getComponent())) {
mAvailableAdmins.add(dpi);
//如果应用注册了包含该action的广播接受者并且激活了设备管理器,就会在setting的设备管理器列表中显示
}
} catch (XmlPullParserException e) {
Log.w(TAG, "Skipping " + ri.activityInfo, e);
} catch (IOException e) {
Log.w(TAG, "Skipping " + ri.activityInfo, e);
}
}
getListView().setAdapter(new PolicyListAdapter());
}
但是没有注册android.app.action.DEVICE_ADMIN_ENABLED action的应用也可以激活为设备管理器。
这就导致了激活后的设备管理器无法在setting的设备管理器列表中显示。
如何解决这种情况呢?下面我们一起来分析一下安全管家的设备管理器补丁。该补丁是一个正常的apk,反编译之,代码结构如下
主要类DeviceAdminProxy代码如下:
//上面方法的主要内容就是对比直接通过DevicePolicyManager获得的已经激活的设备管理器列表a和通过遍历注册了android.app.action.DEVICE_ADMIN_ENABLED action的列表b进行对比,如果发现列表a中的设备管理器没有在列表b中出现,就调用如下代码弹出取消激活的activity,让用户手动取消。
代码中有一个RootMain的类,这个类在当能获得root权限的时候使用,找到利用这个漏洞的设备管理器后直接调用DevicePolicyManager的removeActiveAdmin方法取消激活,该方法需要system以上权限才能执行。
关于android.app.action.DEVICE_ADMIN_ENABLED引起的漏洞都这里就结束了,下面说一下在分析中遇到的另外一件有趣的事。
前面讲到setting获取管理器列表时,有这么一段代码,如下图
代码中实例DeviceAdminInfo对象,DeviceAdminInfo.java在frameworks\base\core\java\android\app\admin\DeviceAdminInfo.java
关键代码:
之前我们在manifest的receiver中有如下配置:
如果不配置meta-data,DeviceAdminInfo类就会抛出异常,DeviceAdminSettings中获取异常,按照上面图中的代码可以发现,同样setting的设备管理器列表也无法显示。这样setting虽然不显示了,但是,如果不配置meta-data,设备管理器时没办法正常激活的。怎么办呢?用正常的设备管理器程序安装,正常激活,然后删除该程序的meta-data配置,生成apk,以更新安装的形式安装到android设备上。这个时候卸载该程序会发现,该程序已经激活为设备管理器,但是在setting设备管理器列表中找不到。因为设备管理器注册了android.app.action.DEVICE_ADMIN_ENABLED,所以使用上述的设备管理漏洞补丁也是找不到的。
那么如何取消激活呢?从上面对于设备管理器漏洞补丁apk的分析可以得出两种取消激活的方法分析(其实是三种):
一、 DevicePolicyManager获得的已经激活的设备管理器列表,然后使用下面的代码
启动取消激活的activity。测试结果是行不通的,因为DeviceAdminAdd也需要解析meta-data中的信息。具体参见DeviceAdminAdd.java位于packages\apps\Settings\src\com\android\settings\ DeviceAdminAdd.java。
二、 获取到激活的设备管理器列表后直接调用DevicePolicyManager的removeActiveAdmin方法取消激活,测试结果成功,但是需要system以上的权限。DevicePolicyManager.java位于frameworks\base\core\java\android\app\admin\DevicePolicyManager.java。
问题分析到这里的时候可能有些童鞋已经发现了,使用正常的apk激活设备管理器,然后使用异常的apk避免设备管理器被取消。那如果android设备重启了呢?重启以后还能保持激活吗?答案是否定的,重启设备以后,无法保持激活。原因是什么呢?分析如下:
主要代码frameworks\base\services\java\com\android\server\DevicePolicyManagerService.java
Android设备重启以后,SystemServer启动DevicePolicyManagerService服务同时调用systemReady方法重新初始化设备管理器列表。如下:
loadSettingsLocked方法中调用findAdmin
代码到这里就可以看到了,在获取meta-data的时候会捕获异常,返回空值。
所以第三种方法:重启……
如有不对的地方欢迎指正。
(转)关于android设备管理器的一些分析的更多相关文章
- Android设备管理器漏洞2--禁止用户取消激活设备管理器
2013年6月,俄罗斯安全厂商卡巴斯基发现了史上最强手机木马-Obad.A.该木马利用了一个未知的Android设备管理器漏洞(ANDROID-9067882),已激活设备管理器权限的手机木马利用该漏 ...
- Android设备管理器漏洞(转)
一.漏洞描述 目前被称为“史上最强Android木马”的病毒Backdoor.AndroidOS.Obad.a利用Android设备管理器漏洞使用户无法通过正常方式卸载.其实该漏洞早在去年底已被发现. ...
- Android 设备管理器 阻止用户取消激活
该方案测试可行,系统版本4.4.2.它算是借助android系统的一个bug,不确定在后续更高的版本中是否修复. 该功能和360防卸载功能一样的实现原理. 主要的参考资料是:http://bbs.pe ...
- Android设备管理器——DevicePolicyManager
自从安卓2.2(API=8)以后,安卓手机是通过设备管理API对手机进行系统级的设备管理. 本篇通过大家熟悉的"一键锁屏"的小项目实现来介绍设备管理API如何通过强制设备管理策略创 ...
- Android设备管理器 DevicePolicyManager
设备管理器有个特点,你注册了之后如果不解除注册就会难以卸载带有设备管理器的应用,目前4.3版本仍未提示用户如何卸载,maybe later. 在「设定-安全」你可以看见「设备管理器」,它提供一些高级功 ...
- 关于android的设备管理器-DevicePolicyManager(二)
上回分析到了/data/system/device_policies.xml这个文件是在package change事件发生的时候变化的.那么来看看它的内容. 依据以往的经验.在/data/syste ...
- 关于android的设备管理器-DevicePolicyManager(一)
在Andorid的设置->安全里面有个设备管理器的选项,相信大部分android用户都不太会去注意这个东西.近期在安装了一个应用之后发现这个里面的东西变了.怎么回事呢,研究研究看看.</s ...
- Android Device Administration 设备管理器——实现一键锁屏
Android Device Administration 设备管理器--实现一键锁屏 最近研究了一下安全这一块的内容,当然,我是比较水的,所以也拿不出什么好知识点,但是有一些冷门的东西我还是可以聊聊 ...
- Android学习笔记_61_手机安全卫士知识点归纳(1)状态/形状图形 GPS 设备管理器DeviceAdminReceiver ImageView属性
1.在做程序自动安装更新的时候 ,必须保证程序的签名和包名是相同. C:\Documents and Settings\zehua\.android \ debug.keystore debug ...
随机推荐
- Nio中文API
https://leocook.gitbooks.io/java-nio-programming-guide/content/
- rp2833 网卡以及串口与接插件位置关系
P13 eth0 (电口--兼容光口,如果使用光口,请将去掉U31以及P13) p12 eth1 P9 /dev/ttyS3 调试口 P10-1 /dev/ttyS2 r ...
- 恶补java基础 位运算符
以前不知道在哪看过别人写博客里的一句话 “越学的深入觉得自己会的东西越少”.最近研究了一下java的基础算法 hash表 被一些位运算符搞的头都大了 决心花一些时间研究一下以前一直觉得没用的东西! ...
- IOS中摇一摇实现截屏(可实现问题反馈的功能)
有一段时间没有更新博客了,今天更新一篇关于最近工作中用到的一个功能,先简单描述一下:我们知道,测试人员在测试客户端产品时,当出现问题或者BUG的时候,都得先对页面截图,然后从相册中选择截图,加上一段描 ...
- 【SpringMVC笔记】第一课-框架执行过程
SpringMVC模型的执行流程
- 【Mac双系统设置系统默认启动系统】解决方式
解决方式1: 开机时长按option键,进入系统选择界面: 用左右方向键选择到你要设置为默认启动的盘, 然后同一时候按下ctrl+enter键.就可以将其设置为默认启动的系统. 解决方式2: 选择ma ...
- 奇妙的go语言(面向对象)
[ 声明:版权全部.欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 有过C++语言学习经历的朋友都知道.面向对象主要包含了三个基本特征:封装.继承和多态.封装,就 ...
- 也许,这样理解HTTPS更容易(今天看到的, 对https总结最好的一篇)
摘要:本文尝试一步步还原HTTPS的设计过程,以理解为什么HTTPS最终会是这副模样.但是这并不代表HTTPS的真实设计过程.在阅读本文时,你可以尝试放下已有的对HTTPS的理解,这样更利于" ...
- 关于SqlServer数据库C盘占用空间太大问题
工程需要用上了SQL SERVER2008 ,主要作为数据仓库使用,使用SSIS包从ORACEL10G中抽取数据到MS SQL中.环境是win2003x64的,驱动使用的oracle10gX64.使用 ...
- sh脚本循环
sh for循环 for File in 1 2 3 4 5 do echo $File done sh for多重循环 for image_size_input in 160 140 120 100 ...