Android设备管理器

一、简介

Android 提供了一个可管理和操作设备的API叫DevicePolicyManager,使用这个API可以接管手机的应用权限,对手机做出很重要很多大胆的操作,比如设置锁屏方式、恢复出厂设置、设置密码、强制清除密码,修改密码等操作。

很多“远程查找手机”的实现使用了设备管理器功能,可以实现远程锁定手机,远程擦除,远程响铃等。

此外,很多恶意软件通过设备管理器进行“锁屏勒索”等恶意操作,为了限制设备管理器被滥用,Android N 规定,第三方应用开发者只能使用DevicePolicyManager.resetPassword为无密码设备设置初始密码,而不能重置或清除已有的设备密码,但在Android N以下还是存在该类型的勒索攻击。

由于设备管理器的高权限,因此要谨慎对待申请激活设备管理器的App,例如:
今日头条、某些安全管家等等,

二、设备管理器使用

  1. Menifest文件中注册receiver
1
2
3
4
5
6
7
8
9
10
11
12
<receiver  android:name=".demo.DeviceReceiver"
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" />
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
  1. 创建xml文件夹添加device_admin.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<device-admin
xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<limit-password />
<!-- 限制密码类型 -->
<watch-login />
<!-- 监控登录尝试 -->
<reset-password />
<!-- 重置密码 -->
<force-lock />
<!--锁屏 -->
<wipe-data />
<!-- 恢复出厂设置 -->
</uses-policies>
</device-admin>
  1. 新建一个class继承DeviceAdminReceiver

    1
    2
    3
    import android.app.admin.DeviceAdminReceiver;
    public class MyAdmin extends DeviceAdminReceiver {
    }
  2. 实现代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    public class MainActivity extends AppCompatActivity {
    private DevicePolicyManager dpm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    dpm = (DevicePolicyManager) getSystemService(DEVICE_POLICY_SERVICE);

    //openAdmin();
    Button bt = (Button)findViewById(R.id.button);
    bt.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
    ComponentName cn = new ComponentName(getApplication(), MyAdmin.class);
    if(dpm.isAdminActive(cn)){
    //设备管理员的api
    dpm.lockNow(); //锁屏
    //dpm.wipeData(0); //擦除数据,谨慎使用
    //dpm.wipeData(DevicePolicyManager.WIPE_EXTERNAL_STORAGE);//删除sdcard数据
    }else{
    openAdmin();
    Toast.makeText(getApplicationContext(), "请先激活管理员", 0).show();
    }

    }
    });
    }

    //激活设备管理器
    public void openAdmin(){
    //进入设备管理器激活向导
    Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
    ComponentName cn = new ComponentName(this, MyAdmin.class);
    intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, cn);
    //提示用户开启管理员
    intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION,
    "请激活设备管理器");
    startActivityForResult(intent,0);
    }
    }

三、设备管理器相关漏洞

  1. 隐藏设备管理器中的列表
    当用户激活设备管理器后,程序会在setting设备管理器列表隐藏,应用程序激活成设备管理器后,可以实现锁屏、擦除用户数据等功能,并且无法使用常规的卸载方式对其卸载
    参考:https://bbs.pediy.com/thread-183692.htm
    http://seclab.safe.baidu.com/2014-10/deviceadminexploit2.html